Пытаюсь понять функцию EXPLAIN - у меня есть два запроса - первый запрос оптимизирован, он выполняется 600 мс (у меня 100 тыс. строк), а второй запрос выполняется 900 мс. Но когда я запускаю EXPLAIN ANALYZE - первый запрос, который выполняется быстро, показывает мне стоимость - 64296 и второй запрос, который выполняется медленно, показывает мне стоимость - 20873, не могу понять, почему более быстрый запрос имеет большую стоимость, и почему более длительный запрос имеет меньшую стоимость. Может ли кто-нибудь дать мне подсказку?
Понимание функции EXPLAIN в Postgresql
Ответы (2)
PostgreSQL EXPLAIN
— это животное, у которого действительно много рук и ног, каждая из которых может заставить его работать таким образом, который поначалу будет нелегко понять.
Чтобы ответить на ваш вопрос, я понимаю, что, хотя выполняется первый запрос Q1 (не его EXPLAIN
), он выполняется быстрее, чем второй (Q2), но когда вы выполняете EXPLAIN ANALYSE
, Q1 на самом деле имеет более высокую стоимость.
Я мог бы назвать две причины, которые приходят на ум в этот момент:
- Если запросы являются
LIMIT
запросами, возможно, что Q1 будет выполняться быстрее и по-прежнему будет иметь более высокую «стоимость», поскольку Планировщик PostgreSQL (намеренно) планирует не меньшую общую стоимость, а меньшую стоимость требуемого результата (в данном случае , меньшее количество строк). - Другая причина может заключаться в том, что кеширование может испортить ваше время. Не могли бы вы подтвердить, сохраняется ли наблюдение при нескольких (3+) прогонах?
Помимо этих догадок, если вы действительно хотите углубиться в понимание EXPLAIN
, рекомендуем вам обратиться к следующим статьям здесь, здесь и здесь.
Стоимость — это то, что планировщик думает о том, сколько ресурсов (время ввода-вывода и ЦП) потребуется для выполнения запроса. Это всего лишь оценка, рассчитанная по математической модели.
В вашем случае планировщик ошибся, выбрал неоптимальный план. Это иногда случается.
Почему? Причин может быть много. Возможно, статистика неадекватна (попробуйте сначала запустить analyze
для своих таблиц). Возможно, со статистикой все в порядке, но планировщик использует неправильную модель (например, в вашем запросе могут быть коррелированные предикаты, которые, как известно, вызывают проблемы). Возможно, ваш запрос охватывает несколько десятков таблиц, и планировщик просто не может просмотреть все возможные планы. И так далее.