Postgresql 解释分析-成本与实际时间的关系

Postgresql 解释分析-成本与实际时间的关系,postgresql,postgresql-8.4,Postgresql,Postgresql 8.4,通常,在改进我的查询时,在查询前后运行explain analyze时,我会同时看到成本和实际时间的改进 但是,在一种情况下,before查询报告 "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

通常,在改进我的查询时,在查询前后运行
explain analyze
时,我会同时看到
成本
实际时间
的改进

但是,在一种情况下,before查询报告

"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"
哈希连接(成本=134.06..1333.57行=231宽度=70) (实际时间=115.349..115.650行=231个循环=1)” “计划时间:4.060毫秒” “执行时间:115.787毫秒” 报告之后

"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"
哈希联接(成本=4.63..1202.61行=77宽度=70) (实际时间=0.249..0.481行=231个循环=1)” “计划时间:2.079毫秒” “执行时间:0.556毫秒” 正如您所看到的,成本是相似的,但是实际执行时间和实际执行时间相差很大,无论我运行测试的顺序如何

使用Postgres 8.4


有人能澄清我对成本没有改善的理解吗?

问题中给出的细节中没有太多信息,但一些提示可能会帮助其他来这里搜索该主题的人

  • 成本是一个基于表统计信息的数字估算,在对查询中涉及的表运行分析时计算得出。如果从未对表格进行过分析,那么计划和成本可能是次优的。查询计划受表统计信息的影响
  • 实际时间是运行查询的实际时间。同样,这可能与成本不正确相关,这取决于表统计信息的新鲜程度。根据当前表统计信息,可能会得出计划,但实际执行可能会发现实际数据条件与表统计信息不同,从而导致执行时间扭曲
这里需要注意的是,表格统计信息会影响计划和成本估算,其中计划和实际数据条件会影响实际时间。因此,作为最佳实践,在进行查询优化之前,始终对表运行analyze

请注意:

  • 分析
    -更新表的统计信息
  • vacuum analyze
    -从表中删除更新记录的过时版本,然后更新表的统计信息
  • explain
    -仅使用查询中涉及的表的统计信息生成查询计划
  • explain(analyze)
    -使用查询中涉及的表的现有统计信息生成查询计划,并运行查询以收集实际运行时数据。由于查询实际上是运行的,如果查询是DML查询,那么如果不打算持久化更改,则应注意将其包含在begin和rollback中

你能澄清一下你所说的询问前后是什么意思吗?它们确实显示了一种改进。(至少:该部分似乎选择了不同的计划)@wildplasser感谢您的反馈。我想我感到困惑的是,
成本
看起来没有那么大的不同,但执行时间却大不相同。计划也不同(可能:如果查询占用空间小,且两个查询之间的间隔短,则可能是缓冲区/缓存效应。简言之:信息不足。顺便说一句:成本估算以任意单位表示。)请注意,Postgres 8.4不受支持。您应该尽快计划升级。感谢您的回复。也许我可以问更多问题-您声明“查询计划受表统计信息的影响”因此,
explain analyze
是否会首先更新这些统计数据,或者执行一些单独的
vacuum analysis
,即使它每天都自动运行?@burry wombat-表格统计数据由
analyze
更新。根据我的经验,
explain analysis
不会更新统计数据,这是可以理解的,因为它正在处理查询。如果自动运行
vacuum analyze
,则表统计信息应该是最新的。