Как читать EXPLAIN ANALYZE и BUFFERS без догадок

2 мин чтения

Как читать дерево плана PostgreSQL, сравнивать оценки с фактом и понимать показания BUFFERS.

Что сопоставить в плане запроса
  1. СтрокиОценка планировщика и фактическое количество
  2. ВремяСтоимость узлов с учётом числа повторений
  3. БуферыПопадания в кэш и чтение блоков

Запрос медленный, но какой индекс ему нужен и нужен ли вообще? Ответ стоит искать в плане выполнения. EXPLAIN ANALYZE показывает, что сервер действительно сделал, а BUFFERS добавляет сведения о работе с буферами. Начнём с одного запроса и разберём цифры, которые легко прочитать неверно.

Первый план выполнения

EXPLAIN (ANALYZE, BUFFERS)
SELECT id, created_at
FROM orders
WHERE customer_id = 42
ORDER BY created_at DESC
LIMIT 20;

В примере предполагается таблица orders с указанными столбцами. Сначала сопоставьте предполагаемое и фактическое число строк в узлах плана. Большое расхождение может менять выбор соединения или способ чтения. Затем посмотрите, где выполняется сортировка и сколько строк пришлось обработать до LIMIT.

Как читать время узлов плана

План — дерево. Верхний узел получает строки от нижнего, а время родителя включает работу потомков. Поэтому простое сложение времён завышает итог. При повторном выполнении узла учитывайте loops: показанные значения нужно читать вместе с количеством проходов. Стоимость cost не измеряется в миллисекундах.

BUFFERS показывает работу с буферами, а не готовую оценку пропускной способности диска. Попадание в общий буфер PostgreSQL и чтение в него — разные события. Даже чтение может обслуживаться кэшем операционной системы. Сравнивайте планы в сходных условиях и не выдавайте один прогон за устойчивый результат.

Проверяем одну гипотезу

ANALYZE orders;
-- Повторите тот же EXPLAIN на сопоставимом наборе данных.

После изменения запроса, статистики или индекса сохраните оба плана вместе с параметрами запуска. Смотрите на объём работы и время нужной операции. Index Scan не является самоцелью: маленькую таблицу нередко быстрее прочитать целиком. Учитывайте и то, что подробные замеры EXPLAIN ANALYZE сами добавляют расходы.

Источники и дальнейшее чтение