Можно ли использовать EXPLAIN ANALYZE для запросов, изменяющих данные (UPDATE, INSERT, DELETE)?

Ответ

Да, в PostgreSQL можно и нужно использовать EXPLAIN ANALYZE для UPDATE, INSERT и DELETE запросов. Это мощный инструмент для анализа и оптимизации производительности не только SELECT, но и операций записи.

Важно: В отличие от EXPLAIN, который только строит план, EXPLAIN ANALYZE реально выполняет запрос, а затем показывает план вместе с фактическими метриками (время выполнения, количество затронутых строк).

Пример:

EXPLAIN ANALYZE 
UPDATE users SET status = 'active' WHERE last_login_at < NOW() - INTERVAL '30 days';

Что покажет вывод:

  • План выполнения: Как именно СУБД нашла строки для обновления (например, Index Scan или Seq Scan).
  • Фактическое время: Сколько миллисекунд заняла каждая операция.
  • Количество строк: Сколько строк было обработано на каждом шаге.
  • Работа триггеров: Если на таблице есть триггеры, их время выполнения также будет учтено.

Ключевые моменты:

  1. Осторожность на production: Поскольку запрос выполняется, его запуск на больших таблицах в рабочей среде может быть долгим и ресурсоемким.
  2. Использование в транзакции: Безопасный способ проверить запрос на production — обернуть его в транзакцию, которую вы затем откатите:
    BEGIN;
    EXPLAIN ANALYZE UPDATE ...;
    ROLLBACK;
  3. Поиск узких мест: Помогает выявить проблемы с отсутствующими индексами, неэффективными условиями WHERE или "дорогими" триггерами, которые замедляют запись.

Ответ 18+ 🔞

А, ну ты про это! Да, конечно, в PostgreSQL можно и нужно EXPLAIN ANALYZE для UPDATE, INSERT и DELETE засовывать. Это ж не только для чтения, блядь, а для всего подряд, чтобы понять, куда время и ресурсы уходят, как в помойку.

Слушай, главное помнить: EXPLAIN — это он только план нарисует, как будто бы. А EXPLAIN ANALYZE — это, сука, реальный выстрел! Он запрос-то на самом деле выполнит, а потом уже отчитается, сколько и чего потратил. Пиздец важное отличие, а то некоторые, блядь, путают.

Вот смотри, как это выглядит:

EXPLAIN ANALYZE 
UPDATE users SET status = 'active' WHERE last_login_at < NOW() - INTERVAL '30 days';

И он тебе нахуярит в ответ целую простыню:

  • Как искал: Через индекс пролетел или всю таблицу, как дурак, построчно (Seq Scan) прочесал.
  • Сколько времени: Реальные миллисекунды, а не фантазии оптимизатора.
  • Сколько строк: Вот тут зацепил сто штук, тут тысячу, а тут, блядь, оказалось, что ни одной.
  • Триггеры: Если они есть, эти подлючие, то их работу и время тоже впишет, чтоб они подавились.

Теперь, блядь, важные нюансы, чтоб не обосраться:

  1. На продакшене осторожно, ёпта! Это ж не игрушка. Если таблица на триллион записей, то этот ANALYZE её так обновит, что все кластеры встанут колом. Запрос-то ВЫПОЛНИТСЯ.
  2. Спасительная транзакция — наш бронежилет. Хочешь на живую базу ткнуть? Оберни в транзакцию и потом откати, как ни в чём не бывало:
    BEGIN;
    EXPLAIN ANALYZE UPDATE ...;
    ROLLBACK; -- И все дела, чики-пуки!
  3. Ищешь слабое звено? Вот тут он и покажет: ага, блядь, индекс на last_login_at отсутствует, вот почему запрос три часа ползает! Или триггер на UPDATE такой хуёвый, что половину времени именно он и жрёт.

Короче, инструмент охуенный, но как скальпель — в руках дурака опасный. Используй с мозгом, и он тебе всю подноготную любой операции записи вывернет наизнанку.