digital-garden/_inbox/Explain в PostgreSQL.md

3.3 KiB
Raw Blame History

aliases tags date zero-link parents linked
зрелость/🌱
2024-06-10
00 PostgreSQL
Профилирование запросов в PostgreSQL
Explain в MySQL

Используя ключевое слово 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 - оптимизация с построением битовых карт для поиска. Сначала строятся битовые карты с использованием нескольких индексов, затем эти битовые карты комбинируются.
  • Foreign Scan - сканирование на удаленном сервере. Используется при Шардирование в PostgreSQL

Дополнительные материалы