11
Профиль одного запроса
EXPLAIN ANALYZE
подзадачи — узлы плана
продолжительность — actual time
или страничный ввод-вывод — buffers
количество выполнений — loops
Особенности
помимо наиболее ресурсоемких узлов, кандидаты на оптимизацию —
узлы с большой ошибкой прогноза кардинальности
любое вмешательство может привести к полной перестройке плана
иногда приходится довольствоваться простым EXPLAIN
Так или иначе, среди выполненных запросов мы находим тот, который
будем оптимизировать. Как работать с самим запросом? Тут тоже
поможет профиль, который выдает команда EXPLAIN ANALYZE.
Подзадачами такого профиля являются узлы плана (план — не плоский
список, а дерево). Продолжительность выполнения узла и число его
повторений покажут time и loops из блока значений actual. С помощью
параметра buffers можно получить объем ввода-вывода (и время,
потраченное на операции ввода-вывода, если включен параметр
track_io_timing).
План выполнения содержит также крайне важную информацию об
ожидании оптимизатора относительно кардинальности каждого шага.
Как правило, если нет серьезной ошибки в прогнозе кардинальности,
то и план будет построен адекватный (если нет, то надо менять
глобальные настройки). Поэтому стоит обращать внимание не только
на наиболее ресурсоемкие узлы, но и на узлы с большим (на порядок
или выше) расхождением между rows и actual rows. Смотреть надо
на наиболее вложенный проблемный узел, поскольку ошибка будет
распространяться от него выше по дереву.
Бывают ситуации, когда запрос выполняется так долго, что выполнить
EXPLAIN ANALYZE не представляется возможным. В таком случае
придется довольствоваться простым EXPLAIN и пытаться разобраться
в причине неэффективности без полной информации.
Работать с большими планами в текстовом виде не всегда удобно. Для
лучшей наглядности можно пользоваться сторонними инструментами,