Понимание функции EXPLAIN в Postgresql

Пытаюсь понять функцию EXPLAIN - у меня есть два запроса - первый запрос оптимизирован, он выполняется 600 мс (у меня 100 тыс. строк), а второй запрос выполняется 900 мс. Но когда я запускаю EXPLAIN ANALYZE - первый запрос, который выполняется быстро, показывает мне стоимость - 64296 и второй запрос, который выполняется медленно, показывает мне стоимость - 20873, не могу понять, почему более быстрый запрос имеет большую стоимость, и почему более длительный запрос имеет меньшую стоимость. Может ли кто-нибудь дать мне подсказку?


person Ivan Ursul    schedule 10.10.2015    source источник
comment
Возможно потому, что оптимизатор запутался и выбрал неверный план выполнения для второго запроса.   -  person Gordon Linoff    schedule 10.10.2015


Ответы (2)


PostgreSQL EXPLAIN — это животное, у которого действительно много рук и ног, каждая из которых может заставить его работать таким образом, который поначалу будет нелегко понять.

Чтобы ответить на ваш вопрос, я понимаю, что, хотя выполняется первый запрос Q1 (не его EXPLAIN), он выполняется быстрее, чем второй (Q2), но когда вы выполняете EXPLAIN ANALYSE, Q1 на самом деле имеет более высокую стоимость.

Я мог бы назвать две причины, которые приходят на ум в этот момент:

  • Если запросы являются LIMIT запросами, возможно, что Q1 будет выполняться быстрее и по-прежнему будет иметь более высокую «стоимость», поскольку Планировщик PostgreSQL (намеренно) планирует не меньшую общую стоимость, а меньшую стоимость требуемого результата (в данном случае , меньшее количество строк).
  • Другая причина может заключаться в том, что кеширование может испортить ваше время. Не могли бы вы подтвердить, сохраняется ли наблюдение при нескольких (3+) прогонах?

Помимо этих догадок, если вы действительно хотите углубиться в понимание EXPLAIN, рекомендуем вам обратиться к следующим статьям здесь, здесь и здесь.

person Robins Tharakan    schedule 10.10.2015

Стоимость — это то, что планировщик думает о том, сколько ресурсов (время ввода-вывода и ЦП) потребуется для выполнения запроса. Это всего лишь оценка, рассчитанная по математической модели.

В вашем случае планировщик ошибся, выбрал неоптимальный план. Это иногда случается.

Почему? Причин может быть много. Возможно, статистика неадекватна (попробуйте сначала запустить analyze для своих таблиц). Возможно, со статистикой все в порядке, но планировщик использует неправильную модель (например, в вашем запросе могут быть коррелированные предикаты, которые, как известно, вызывают проблемы). Возможно, ваш запрос охватывает несколько десятков таблиц, и планировщик просто не может просмотреть все возможные планы. И так далее.

person Egor Rogov    schedule 10.10.2015