Что делает команда `EXPLAIN` в базах данных и для чего она нужна?

Ответ

Команда EXPLAIN в СУБД используется для получения плана выполнения SQL-запроса, который строит оптимизатор базы данных. Это ключевой инструмент для анализа и оптимизации производительности запросов.

Основные задачи, которые решает EXPLAIN:

  1. Выявление узких мест: Показывает, какие части запроса выполняются неэффективно.
  2. Анализ использования индексов: Помогает понять, используются ли существующие индексы, и нужны ли новые.
  3. Оценка стоимости запроса: Демонстрирует, какие операции являются самыми "дорогими" (например, полное сканирование таблицы — Seq Scan).

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

Пример для PostgreSQL:

-- Показывает предполагаемый план
EXPLAIN SELECT * FROM users WHERE id = 42;

-- Выполняет запрос и показывает фактический план
EXPLAIN ANALYZE SELECT * FROM users WHERE id = 42;

Пример вывода:

Index Scan using users_pkey on users  (cost=0.15..8.17 rows=1 width=72) (actual time=0.021..0.022 rows=1 loops=1)
  Index Cond: (id = 42)
Planning Time: 0.078 ms
Execution Time: 0.043 ms

Ключевые параметры в выводе:

  • cost: Оценочная стоимость операции в условных единицах.
  • rows: Ожидаемое количество строк.
  • actual time: Фактическое время выполнения (при использовании ANALYZE).
  • scan type: Тип сканирования (Seq Scan — плохо, Index Scan — хорошо).

В Go для анализа плана можно выполнить такой запрос через database/sql и проанализировать его текстовый вывод.