Как читать EXPLAIN ANALYZE и BUFFERS без догадок
Как читать дерево плана PostgreSQL, сравнивать оценки с фактом и понимать показания BUFFERS.
- СтрокиОценка планировщика и фактическое количество
- ВремяСтоимость узлов с учётом числа повторений
- БуферыПопадания в кэш и чтение блоков
Запрос медленный, но какой индекс ему нужен и нужен ли вообще? Ответ стоит искать в плане выполнения. 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 сами добавляют расходы.
