EXPLAIN ANALYZE
Тема дорожной карты · PostgreSQL
EXPLAIN ANALYZE — главный инструмент оптимизации запросов и диагностики производительности в PostgreSQL: он отображает полный план выполнения, выбранный планировщиком, вместе с реальной статистикой времени выполнения, собранной при фактическом запуске запроса. Команда EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT) SELECT ... показывает для каждого узла плана оценочное и фактическое число строк, оценочное и фактическое время выполнения в миллисекундах, а также счётчики попаданий и промахов в буферный кэш, позволяющие определить, читает ли реляционная база данных данные из разделяемой памяти или с диска. Наиболее важными метриками для анализа являются большие расхождения между actual rows и estimated rows — они свидетельствуют об устаревшей статистике планировщика, устраняемой командой ANALYZE — а также типы узлов плана, например Seq Scan по большой таблице, где после добавления подходящего индекса был бы быстрее Index Scan. PostgreSQL также поддерживает EXPLAIN (ANALYZE, FORMAT JSON) для машиночитаемого вывода, совместимого со сторонними инструментами визуализации, такими как pev2 и explain.dalibo.com, что делает EXPLAIN ANALYZE незаменимой отправной точкой любого расследования производительности индексов и запросов в PostgreSQL.
Как это работает
EXPLAIN ANALYZE ускоряют чтение ценой записи + storage. Типы Postgres: B-tree (дефолт, равенство + диапазон), Hash (только равенство), GIN (full-text, JSONB, containment массивов), GiST (геометрия, full-text), BRIN (огромные таблицы с естественным порядком — time-series), Bloom (multi-column равенство). Partial indexes (WHERE) пропускают нерелевантные строки; expression indexes ((lower(email))) ловят запрос с трансформацией; covering indexes (INCLUDE) избегают heap-lookup (index-only scans).
Когда применять
Индексируйте колонки в WHERE / JOIN / ORDER BY для запросов, которые реально гоняете — никогда "на всякий случай". EXPLAIN (ANALYZE, BUFFERS) — подтвердить, что индекс используется. Для JSONB-запроса по ключу — GIN на поле; для full-text — to_tsvector + GIN. BRIN — для append-only данных с монотонными timestamp: крошечный индекс, огромные таблицы. Удаляйте неиспользуемые индексы (pg_stat_user_indexes: idx_scan = 0).
Типичные ошибки
Ловушки EXPLAIN ANALYZE: слишком много индексов (каждый INSERT/UPDATE переписывает их все — write amplification); функциональные WHERE (WHERE lower(email) = ?) без соответствующего expression-index (full-scan); B-tree на boolean (низкая cardinality, бесполезно — partial index WHERE flag = true правильно); не CREATE INDEX CONCURRENTLY в production (обычный CREATE INDEX лочит записи). Всегда ANALYZE после больших записей — статистика планировщика свежая.
Связанные понятия
Полезные ресурсы
Проверить знания (1)
Загрузка вопросов…