Можно ли использовать 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 или "дорогими" триггерами, которые замедляют запись.