Умеешь ли читать план выполнения запросов в PostgreSQL
Что проверяют
Умеете ли вы находить причину медленного запроса, а не подбирать индексы наугад.
Как отвечать
Скажите, чем смотрите и что ищете.
Команды: обычный вывод показывает предполагаемый план, а вариант с фактическим выполнением дополнительно показывает реальное время и число строк на каждом узле. Полезно добавлять вывод по буферам: он показывает, сколько страниц прочитано из кэша, а сколько с диска.
Важное предупреждение: вариант с выполнением действительно выполняет запрос, включая изменяющие. Такие запросы разбирают внутри транзакции с последующим откатом.
Как читать: план это дерево, читают его снизу вверх и изнутри наружу. Отступы показывают вложенность.
На что смотреть в первую очередь:
- расхождение между ожидаемым и фактическим числом строк. Если планировщик ждал сотню, а пришёл миллион, он выбрал неверный способ соединения. Причина обычно в устаревшей статистике, лечится её обновлением, а для связанных колонок расширенной статистикой. Это самая частая настоящая причина плохих планов;
- последовательное сканирование большой таблицы там, где выбирается мало строк: не хватает индекса или он неприменим из-за функции над колонкой;
- сколько строк отброшено фильтром: большое число означает, что читали много лишнего;
- сортировка на диске: не хватает памяти под операцию, и она вылилась во временные файлы;
- число повторов внутреннего узла при соединении вложенными циклами: оно умножается на стоимость;
- чтение с диска против попаданий в кэш.
Типы узлов, которые надо узнавать: последовательное сканирование, сканирование по индексу, чтение только по индексу, соединение вложенными циклами, хешем и слиянием, сортировка, агрегация.
Полезно упомянуть визуализаторы планов: на большом дереве они экономят время, подсвечивая самый дорогой узел.
Где спотыкаются
Смотрят только на итоговое время, игнорируя узлы.
Добавляют индексы, не посмотрев план.
Не замечают расхождения оценок и не обновляют статистику.
Запускают выполняющий вариант на изменяющем запросе вне транзакции.