Ответ
Обе команды используются для анализа планов выполнения SQL-запросов, но делают это принципиально по-разному.
EXPLAIN
Показывает предполагаемый (estimated) план выполнения, который строит оптимизатор базы данных. Запрос при этом не выполняется.
- Что делает: Анализирует запрос, статистику таблиц и индексы, чтобы предсказать, как он будет выполняться.
- Преимущества: Быстро и безопасно. Идеально для быстрой проверки использования индексов.
-- Показывает только план, без выполнения
EXPLAIN SELECT * FROM users WHERE registration_date > '2023-01-01';
EXPLAIN ANALYZE
Сначала строит план, а затем реально выполняет запрос и показывает фактический план с реальными метриками времени и количества строк.
- Что делает: Выполняет запрос и сравнивает оценки планировщика с реальными результатами.
- Преимущества: Предоставляет точную информацию о производительности, включая реальное время выполнения каждого шага (
actual time). Помогает выявить неверные оценки планировщика.
-- Выполняет запрос и показывает план с реальными метриками
EXPLAIN ANALYZE SELECT * FROM users WHERE registration_date > '2023-01-01';
Ключевое различие
EXPLAIN— это гипотеза о том, как будет выполнен запрос.EXPLAIN ANALYZE— это эксперимент, который выполняет запрос и показывает, как он был выполнен на самом деле.
Важно: Используйте
EXPLAIN ANALYZEс осторожностью дляUPDATE,DELETE,INSERT, так как команда реально выполнит изменение данных. Для таких запросов её лучше оборачивать в транзакцию с последующимROLLBACK.
Ответ 18+ 🔞
А, ну это же классика, блядь! Сидишь ты такой, пишешь запрос, а он тормозит, как черепаха в патруле. И тут встаёт вопрос: а что, сука, там у него в голове, у этой базы данных? Как она собирается мою красоту исполнять? Так вот, слушай сюда, есть два подхода, и они, блядь, как небо и земля.
EXPLAIN — это как спросить у прораба: «Ну чё, как будем строить?»
Он тебе, этот оптимизатор, достаёт свои чертежи, смотрит на статистику (которая может быть хуёвой, кстати), и начинает теоретизировать. «Вот тут, — говорит, — индекс подцепим, тут сджойним, тут отфильтруем». Запрос при этом НЕ ВЫПОЛНЯЕТСЯ, НИ ХУЯ! Это просто план-намерение, гипотеза, ёпта. Быстро, безопасно, но может оказаться полной хуйнёй, если статистика устарела.
EXPLAIN SELECT * FROM users WHERE registration_date > '2023-01-01';
Выдаст тебе сухую теорию. «О, я планирую вот так вот, индекс idx_reg_date использовать, отсею примерно 10к строк». А на деле там овердохуища строк, и индекс кривой.
EXPLAIN ANALYZE — это как сказать прорабу: «А теперь построй нахуй, а я с секундомером постою».
Вот это, блядь, уже серьёзно. Команда сначала план построит, а потом РЕАЛЬНО ВЫПОЛНИТ ТВОЙ ЗАПРОС, СУКА! И после этого выдаст отчёт: «Так, я планировал 10к строк, а на самом деле их было 1.5 миллиона, и этот шаг занял не 0.1 мс, а ебаные 15 секунд, я обосрался».
EXPLAIN ANALYZE SELECT * FROM users WHERE registration_date > '2023-01-01';
Вот тут ты увидишь уже не «планируемое время», а actual time, реальные цифры, пиздец как полезные. Прямо покажет, где планировщик обманулся, как последняя мартышлюшка.
Так в чём, блядь, соль?
EXPLAIN— это ГИПОТЕЗА, гадание на кофейной гуще от СУБД.EXPLAIN ANALYZE— это ОТЧЁТ ПО ФАКТУ, где всё по-чесноку, с реальными замерами и признаниями «ой, я тут ошибся, прости».
ВНИМАНИЕ, КАПСЛОКОМ ДЛЯ ОСОБО ОДАРЁННЫХ: EXPLAIN ANALYZE на запросах UPDATE, DELETE, INSERT РЕАЛЬНО ИЗМЕНИТ ТВОИ ДАННЫЕ! Ты ж не хочешь на продовой базе всё случайно удалить, пидарас шерстяной? Для таких трюков оборачивай всё в транзакцию и тут же ROLLBACK, чтобы просто посмотреть план, но не нагадить.
BEGIN;
EXPLAIN ANALYZE DELETE FROM temp_logs WHERE created_at < now() - interval '30 days';
ROLLBACK; -- ВАЖНЕЙШАЯ СТРОКА, БЛЯДЬ!
Вот и вся магия, ебать мои старые костыли. Сначала EXPLAIN для быстрой прикидки, а если что-то не так — EXPLAIN ANALYZE для вскрытия правды, какой бы горькой она ни была.