3.1 KiB
aliases | tags | date | zero-link | parents | linked | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|
|
|
|
|
|
Используя ключевое слово EXPLAIN
перед запросом, можно получить детальную информацию о том, что планирует сделать PostgreSQL под капотом для выполнения запроса.
Пример выполнения explain
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.
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 - был использован Покрывающий индекс
- Bitmap Heap Scan - оптимизация с построением битовых карт для поиска. Сначала строятся битовые карты с использованием нескольких индексов, затем эти битовые карты комбинируются.