Таблицы и SQL
Разбор плана EXPLAIN
Превращает вывод EXPLAIN (ANALYZE) в дерево с долями времени и подсказками: где не хватает индекса, где планировщик промахнулся, где сортировка ушла на диск.
Как получить план
PostgreSQL: EXPLAIN (ANALYZE, BUFFERS) ваш_запрос; — вставьте вывод как есть, рамку psql можно не убирать. Годится и FORMAT JSON. MySQL: EXPLAIN FORMAT=JSON ваш_запрос;
4
узлов
PG текст
формат
0.201 мс
планирование
143.086 мс
выполнение
Что стоит посмотреть
Hash Join
Планировщик ошибся в оценке строк в 1040 раз (ждал 3, получил 3 120) — помогает ANALYZE и увеличение статистики по колонке.
Seq Scan на orders
Последовательное чтение 30 000 строк — вероятно, не хватает индекса под условие фильтра.
Seq Scan на orders
Фильтр отбросил 470 000 строк уже после чтения — условие стоит перенести в индекс.
Seq Scan на orders
Самый дорогой шаг: 69% всего времени (98.01 мс собственного времени).
Дерево плана
Hash Cond: (o.user_id = u.id)
Filter: (total > 100)
Rows Removed by Filter: 470000
Buckets: 1024 Batches: 1 Memory Usage: 40kB