--- aliases: tags: - зрелость/🌱 date: - - 2024-06-10 zero-link: - "[[00 PostgreSQL]]" parents: - "[[Профилирование запросов в PostgreSQL]]" linked: - "[[Explain в MySQL]]" --- Используя ключевое слово `EXPLAIN` перед запросом, можно получить детальную информацию о том, что **планирует** сделать PostgreSQL под капотом для выполнения запроса. Пример выполнения explain ```sql postgres=# explain select * from users where id=20; QUERY PLAN ------------------------------------------------------- Index Scan using users_pkey on users (cost=0.15..8.17 rows=1 width=72) Index Cond: (id = 20) (2 rows) ``` Можно изменить формат вывода. Например, можно вывести все в JSON. ```sql explain(format json) select * from users where id=20; ``` > [!NOTE] Analyze > Explain не выполняет запрос, поэтому результаты будут лишь приблизительными. Можно улучшить качество анализа, если добавить ключевое слово `explain analyze`, тогда explain также выполнит запрос. PostgreSQL использует условные единицы обозначающие стоимость выполнения запроса - cost. Один cost это время, которое затрачивается на извлечение 1 блока размером 8 килобайт при Seq Scan. При этом обычно используется 2 значения. Первое означает сколько времени пройдет до начала первых результатов, а вторая когда вернется весь результат. Если cost очень маленький, а actual time большое, это может означать, что есть проблемы со сбором статистики. Возможно выключен автовакуум? Стоит найти самый дорогой узел запроса и оптимизировать его. **Виды проходов по индексу:** - Seq Scan - последовательный просмотр таблицы. Худший вариант. - Index Scan - просмотр по индексу в таблице - Index Only Scan - был использован [Покрывающий индекс](Покрывающий%20индекс.md) - Bitmap Heap Scan - оптимизация с построением битовых карт для поиска. Сначала строятся битовые карты с использованием нескольких индексов, затем эти битовые карты комбинируются. ## Дополнительные материалы - [Производительность запросов в PostgreSQL / Илья Космодемьянский (PostgreSQL Consulting) - YouTube](https://www.youtube.com/watch?v=c-ySk8COI1c)