Ключевое слово EXPLAIN перед SQL-запросом позволяет получить детальную информацию о том, как 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;

Analyze

EXPLAIN не выполняет сам запрос, поэтому результаты будут приблизительными. Для более точного анализа можно добавить ключевое слово ANALYZE, и тогда EXPLAIN также выполнит запрос.

Стоимость выполнения запроса (cost)

PostgreSQL использует условные единицы для обозначения стоимости выполнения запроса — cost. Один cost примерно соответствует времени, затраченному на извлечение одного блока данных размером 8 килобайт при последовательном сканировании (Seq Scan).

Часто используются два значения cost:

  • Первое значение: стоимость до начала получения первых результатов.
  • Второе значение: полная стоимость выполнения запроса.

Если оценочное значение rows слишком низкое по сравнению с фактическим количеством строк, это может означать, что статистика таблицы устарела. В таком случае необходимо выполнить ANALYZE для обновления статистики и улучшения качества планирования запросов.

Виды проходов по таблице и индексу

  • Seq Scan: последовательный просмотр всей таблицы. Это наиболее медленный вариант и обычно нежелателен. Решение — добавить индекс, чтобы ускорить выборку данных.
  • Index Scan: использование индекса для просмотра таблицы.
  • Index Only Scan: использование покрывающего индекса, когда все нужные данные находятся в индексе и не требуется дополнительного доступа к таблице.
  • Bitmap Heap Scan: оптимизация с использованием битовых карт для поиска. Сначала строятся битовые карты с использованием нескольких индексов, затем они комбинируются.
  • Foreign Scan: сканирование данных на удаленном сервере, используемое при шардировании.

Мета информация

Область:: 00 PostgreSQL
Родитель:: Оптимизация SQL запросов в PostgreSQL
Источник::
Автор::
Создана:: 2024-01-29

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

Дочерние заметки