Чем EXPLAIN отличается от EXPLAIN ANALYZE в Postgres-подобной СУБД?
A
EXPLAIN физически выполняет запрос и показывает фактические времена шагов, а EXPLAIN ANALYZE строит только план без выполненияB
EXPLAIN показывает план без выполнения запроса, а EXPLAIN ANALYZE выполняет запрос и добавляет фактические времена и количество строкCОба варианта строят только план: ни
EXPLAIN, ни EXPLAIN ANALYZE не запускают запрос на исполнение и не возвращают замеровDОба варианта всегда исполняют запрос:
EXPLAIN и EXPLAIN ANALYZE отличаются только форматом вывода полученного планаПравильный ответ.
EXPLAIN — план, EXPLAIN ANALYZE — план плюс фактические измерения по запросу.Разбор
Обычный EXPLAIN полезен, когда вы хотите оценить риск и структуру плана, не запуская потенциально тяжёлый запрос. EXPLAIN ANALYZE действительно выполняет запрос и показывает фактические времена и количество строк на шагах. Это помогает обнаружить расхождения между оценкой оптимизатора и реальностью, но может быть дорого на больших таблицах. Поэтому утверждения, что оба варианта только строят план или, наоборот, оба всегда исполняют запрос — неверны.
Проверь себя · 1/3разбор после ответа
Есть индекс по
orders.created_at, но EXPLAIN для фильтра WHERE date(created_at) = current_date показывает Seq Scan. Почему это часто происходит?Ещё вопросы по теме «EXPLAIN и оптимизация»
- Вы хотите добавить новый запрос в дашборд и боитесь, что он сильно нагрузит базу, потому что таблица `events` очень большая. Что даёт запуск `EXPLAIN` для этого запроса?
- В выводе `EXPLAIN` вы видите узел `Seq Scan on orders`. Что это обычно означает в плане выполнения запроса?
- В плане `EXPLAIN` для запроса по пользователю вы видите проход по индексу `orders_user_id_idx` для таблицы заказов. Какой вывод наиболее корректен?
- На большой таблице `events` запрос `SELECT * FROM events ORDER BY created_at DESC LIMIT 100` неожиданно работает быстро. Какое объяснение наиболее вероятно при наличии индекса по `created_at`?
- Есть индекс по `orders.created_at`, но `EXPLAIN` для фильтра `WHERE date(created_at) = current_date` показывает `Seq Scan`. Почему это часто происходит?
- Все вопросы по «EXPLAIN и оптимизация» →