Модуль 5. Оптимизация запросов и производительности в Postgres Pro
Postgres Pro, как и PostgreSQL, предлагает широкий набор инструментов для настройки производительности. Однако в отличие от стандартного PostgreSQL, Postgres Pro обладает дополнительными средствами анализа и мониторинга, расширенной поддержкой параллельного выполнения и усовершенствованными механизмами хранения данных. В этом модуле рассматриваются ключевые направления оптимизации:
- Индексация и выбор типа индекса;
- Настройка и контроль параллельного выполнения;
- Использование материализованных представлений и агрегатов.
Раздел 1. Индексация: B-tree, GIN, BRIN, GiST
Индексы — основа ускорения поиска, фильтрации, сортировки и объединения данных. В Postgres Pro доступен ряд типов индексов, каждый из которых имеет свою область применения.
1.1 Индексы B-tree
Самый распространенный и универсальный тип индекса. Подходит для:
- Фильтрации по равенству;
- Сортировки;
- Диапазонных запросов.
Пример создания:
CREATE INDEX idx_sales_date ON sales(sale_date);
Особенности:
- Поддерживает уникальность;
- Используется планировщиком по умолчанию;
- Хорошо подходит для OLTP и DWH систем.
Риски:
- При частых обновлениях может фрагментироваться;
- Требует периодического VACUUM и REINDEX.
Рекомендации:
- Всегда используйте B-tree для фильтрации по ключевым полям и времени.
1.2 Индексы GIN (Generalized Inverted Index)
Предназначены для индексации массивов, JSON, full-text поиска.
Пример:
CREATE INDEX idx_doc_tags ON documents USING GIN(tags); CREATE INDEX idx_json_data ON events USING GIN(json_data jsonb_path_ops);
Особенности:
- Эффективен для поиска по множественным значениям;
- Используется для full-text поиска через to_tsvector.
Риски:
- Дороже в создании и обновлении, чем B-tree;
- Требует настройки параметров work_mem при планировании.
Рекомендации:
- Используйте только по необходимости для массивов, jsonb, документов.
1.3 Индексы BRIN (Block Range Index)
Предназначены для больших таблиц с упорядоченными данными, например, по дате.
Пример:
CREATE INDEX idx_large_table_brin ON large_table USING BRIN(event_date);
Особенности:
- Очень компактные;
- Работают по диапазонам страниц;
- Быстро создаются и не нагружают систему.
Риски:
- Могут давать ложные срабатывания;
- Требуют дополнительной фильтрации в запросе.
Рекомендации:
- Использовать на секционированных таблицах, логах, телеметрии, хранилищах.
1.4 Индексы GiST (Generalized Search Tree)
Используются для:
- Географических данных (PostGIS);
- Полнотекстового поиска;
- Поиска по диапазонам.
Пример:
CREATE INDEX idx_gist_time ON ranges USING GiST(tsrange(start_time, end_time));
Особенности:
- Позволяет выполнять пересечение диапазонов;
- Поддерживает kNN-поиск.
Риски:
- Более сложны в обслуживании;
- Нельзя использовать как drop-in замену B-tree.
Раздел 2. Параллельное выполнение запросов и настройка планировщика
Параллелизм в Postgres Pro — важнейшая особенность для DWH-нагрузки. Начиная с версии 10, параллельное выполнение поддерживается на уровне:
- Сканирования таблиц;
- Сортировок;
- Агрегаций;
- Хэшей.
2.1 Параметры конфигурации
- max_parallel_workers — общее количество воркеров;
- max_parallel_workers_per_gather — воркеры на один запрос;
- parallel_tuple_cost — оценка стоимости передачи строк между воркерами;
- parallel_setup_cost — стоимость инициализации параллельного плана.
Пример конфигурации:
max_parallel_workers = 16 max_parallel_workers_per_gather = 4 parallel_tuple_cost = 0.05 parallel_setup_cost = 500
2.2 Как понять, работает ли параллелизм
Используйте EXPLAIN ANALYZE:
EXPLAIN ANALYZE SELECT COUNT(*) FROM large_table;
Если в плане есть Gather, Parallel Seq Scan — параллелизм работает.
2.3 Ограничения
- Некоторые функции не параллелятся (например, user-defined функции);
- Не работает с temporary таблицами;
- Запросы с CTE до версии 13 не могли быть параллельными.
Риски:
- Параллельные запросы создают конкуренцию за ресурсы;
- Необходимо мониторить CPU и планировщик задач ОС.
Раздел 3. Материализованные представления и агрегации
Материализованные представления — механизм сохранения результатов запросов в таблицу с возможностью обновления вручную или по расписанию.
3.1 Создание представления
CREATE MATERIALIZED VIEW sales_monthly AS
SELECT
date_trunc('month', sale_date) AS month,
product_id,
SUM(quantity) AS total_qty,
SUM(amount) AS total_amount
FROM sales
GROUP BY month, product_id;
Обновление:
REFRESH MATERIALIZED VIEW sales_monthly;
Можно выполнять CONCURRENTLY:
REFRESH MATERIALIZED VIEW CONCURRENTLY sales_monthly;
Требует наличия уникального индекса:
CREATE UNIQUE INDEX idx_sales_monthly ON sales_monthly(month, product_id);
3.2 Использование в аналитике
- Быстрое построение отчетов без повторных расчетов;
- Использование в BI-инструментах как источник;
- Кэширование дорогих запросов.
Рекомендации:
- Планировать обновление через pgpro_scheduler или cron;
- Обновлять только в ночное время или по факту обновления данных.
Риски:
- Данные могут быть устаревшими;
- Ошибки в логике REFRESH могут нарушить актуальность отчетов.
3.3 Альтернатива — временные агрегатные таблицы
Если данные не требуют обновлений в реальном времени, создавайте промежуточные агрегаты:
CREATE TABLE agg_weekly AS SELECT week, region, SUM(revenue) FROM raw_data GROUP BY week, region;
Используйте индекс и храните таблицу в отдельном tablespace.
Заключение
Оптимизация производительности — не одноразовая задача, а постоянный процесс. В арсенале Postgres Pro доступны эффективные индексы, параллельное выполнение, материализованные представления и инструменты мониторинга. Грамотная комбинация этих инструментов позволяет построить устойчивое и масштабируемое хранилище данных.
В следующем модуле мы рассмотрим безопасность, управление доступом и аудит в Postgres Pro.
Postgres Professional — это российская промышленная СУБД, созданная на базе открытого PostgreSQL, но значительно расширенная для корпоративного применения. В отличие от классического PostgreSQL, решения от Postgres Professional включают в себя поддержку российских ГОСТов и сертификацию ФСТЭК, повышенную надёжность, оптимизации под высоконагруженные системы (в том числе 1С и DWH), инструменты резервного копирования, мониторинга и отказоустойчивости. За платформой стоит команда ядра PostgreSQL в России, что гарантирует актуальность, стабильность и экспертную техническую поддержку 24/7.
Для компаний, которым важно не просто использовать PostgreSQL, а внедрить его на уровне корпоративных стандартов — с гарантией, сопровождением, документированными улучшениями и адаптацией под российское законодательство — Postgres Pro Enterprise становится логичным выбором. Это не просто бесплатная база данных, а полноценный продуктовый стек, совместимый с BI, аналитикой, ERP, 1С и другими системами, в том числе импортозамещёнными.



