PostgreSQL — мощная и надежная СУБД, но даже у неё есть нюансы, которые важно учитывать при разработке на Ruby on Rails. В этой статье разберём ключевые ограничения PostgreSQL, влияющие на производительность и масштабируемость приложений, а также подскажем, как их обойти с помощью DevOps-практик и правильной настройки.
PgBouncer — как затычка в ванну: пока стоит — всё держится. Убери — и база захлебнётся.
1. ❌ Один процесс на подключение
Каждое подключение создаёт отдельный процесс, а не поток:
- Неэффективно при тысячах соединений
- Используй PgBouncer в режиме
transaction, чтобы снизить нагрузку
2. 🧠 Оперативка на индексы не вечна
PostgreSQL не кэширует индексы в своём уровне — только через shared_buffers и OS cache. Если индекс не помещается — тормоза неизбежны.
- Проверяй через
EXPLAIN (ANALYZE, BUFFERS) - Следи за
seq scanиindex scanстатистикой
3. 🔓 MVCC — не панацея
PostgreSQL использует механизм версионности (MVCC):
- Каждая модификация создаёт новую строку
- Требуется автоматическая вакуумизация
- Без VACUUM таблицы будут пухнуть, а запросы — тормозить
📌 Не отключай autovacuum. Никогда.
4. 📉 Ограничения на размеры
| Объект | Лимит |
|---|---|
| Таблица | До 32 ТБ |
| Строка | До 1.6 ТБ |
| Столбцов | До 1600 (реально меньше) |
| Индексы | До 32 полей |
📌 Если чувствуешь боль — возможно, пора думать о шардировании или пересмотре модели.
5. 🧩 Нет полноценных materialized views
Да, они есть, но:
- Не обновляются автоматически
- Требуют
REFRESH MATERIALIZED VIEW - Идут без индексов до
CONCURRENTLY
📌 Альтернатива: использовать обычную таблицу + триггеры или CTE.
🔚 Вывод
PostgreSQL остаётся мощной СУБД, но, как и любой инструмент, требует понимания ограничений. Учитывай их — и твоя база будет работать быстро и стабильно.