объяснить анализировать - отношение стоимости к фактическому времени

Обычно при улучшении моих запросов я вижу совпадающее улучшение как с cost, так и с actual time при выполнении explain analyze как до, так и после запросов.

Однако в одном случае запрос до сообщает

"Hash Join  (cost=134.06..1333.57 rows=231 width=70) 
            (actual time=115.349..115.650 rows=231 loops=1)"
<cut...>
"Planning time: 4.060 ms"
"Execution time: 115.787 ms"

и отчеты после

"Hash Join  (cost=4.63..1202.61 rows=77 width=70) 
            (actual time=0.249..0.481 rows=231 loops=1)"
<cut...>
"Planning time: 2.079 ms"
"Execution time: 0.556 ms"

Итак, как вы можете видеть, затраты одинаковы, но фактическое и реальное время выполнения сильно различаются, независимо от порядка, в котором я запускаю тесты.

Использование Постгреса 8.4.

Может ли кто-нибудь прояснить мое понимание того, почему стоимость не показывает улучшения?


person Scary Wombat    schedule 31.05.2019    source источник
comment
Можете ли вы уточнить, что вы подразумеваете под запросами до и после?   -  person Jeremy    schedule 31.05.2019
comment
Они действительно показывают улучшение. (по крайней мере: кажется, что в части ‹cut...› выбран другой план)   -  person wildplasser    schedule 28.10.2019
comment
@wildplasser Спасибо за ваш отзыв. Я предполагаю, что меня смущает то, что cost выглядит не так уж по-другому, но время выполнения сильно отличается.   -  person Scary Wombat    schedule 28.10.2019
comment
План тоже отличается (возможно: если запрос занимает мало места и интервал между двумя запросами короткий, это может быть эффектом буфера/кеша. Короче говоря: недостаточно информации. Кстати: оценка стоимости находится в Произвольные единицы.)   -  person wildplasser    schedule 28.10.2019
comment
Обратите внимание, что Postgres 8.4 не поддерживается более 5 лет. возможный.   -  person a_horse_with_no_name    schedule 28.10.2019


Ответы (1)


В деталях, указанных в вопросе, не так много информации, но несколько указателей могут помочь другим, кто приходит сюда в поисках по теме.

  • Стоимость – это числовая оценка, основанная на статистике таблиц, которая рассчитывается при анализе таблиц, задействованных в запросе. Если таблица никогда не анализировалась, то план и стоимость могут быть далеко не оптимальными. На план запроса влияет статистика таблицы.
  • Фактическое время — это фактическое время, затраченное на выполнение запроса. Опять же, это может не соотноситься должным образом со стоимостью в зависимости от того, насколько свежа статистика в таблице. План может быть достигнут в зависимости от текущей статистики таблицы, но фактическое выполнение может обнаружить, что условия реальных данных отличаются от того, что сообщает статистика таблицы, что приводит к искажению времени выполнения.

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

Несколько заметок:

  • analyze <table> - обновляет статистику таблицы.
  • vacuum analyze <table> - удаляет устаревшие версии обновленных записей из таблицы и затем обновляет статистику таблицы.
  • explain <query> - только формирует план запроса, используя статистику таблиц, участвующих в запросе.
  • explain (analyze) <query> — генерирует план запроса, используя существующую статистику таблиц, задействованных в запросе, а также запускает запрос, собирая фактические данные времени выполнения. Поскольку запрос фактически выполняется, если запрос является запросом DML, следует позаботиться о том, чтобы включить его в начало и откат, если изменения не предназначены для сохранения.
person Dhwani Katagade    schedule 05.12.2019
comment
Спасибо за ваш ответ. Может быть, я могу спросить еще кое-что. Вы утверждаете, что на план запроса влияет статистика таблицы, поэтому будет ли explain analyze обновлять эту статистику или сначала будет выполняться какой-то отдельный vacuum analyse, даже если он автоматически запускается ежедневно? - person Scary Wombat; 06.12.2019
comment
@scary-wombat - Статистика таблицы обновляется analyze <table>. По моему опыту explain analyze <query> не обновляет статистику, понятное дело, потому что работает с запросом. Если vacuum analyze <table> запускается автоматически, статистика вашей таблицы должна быть достаточно актуальной. - person Dhwani Katagade; 07.12.2019