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
有人能澄清我对成本没有改善的理解吗?问题中给出的细节中没有太多信息,但一些提示可能会帮助其他来这里搜索该主题的人
- 成本是一个基于表统计信息的数字估算,在对查询中涉及的表运行分析时计算得出。如果从未对表格进行过分析,那么计划和成本可能是次优的。查询计划受表统计信息的影响
- 实际时间是运行查询的实际时间。同样,这可能与成本不正确相关,这取决于表统计信息的新鲜程度。根据当前表统计信息,可能会得出计划,但实际执行可能会发现实际数据条件与表统计信息不同,从而导致执行时间扭曲
-更新表的统计信息分析
-从表中删除更新记录的过时版本,然后更新表的统计信息vacuum analyze
-仅使用查询中涉及的表的统计信息生成查询计划explain
-使用查询中涉及的表的现有统计信息生成查询计划,并运行查询以收集实际运行时数据。由于查询实际上是运行的,如果查询是DML查询,那么如果不打算持久化更改,则应注意将其包含在begin和rollback中explain(analyze)
成本
看起来没有那么大的不同,但执行时间却大不相同。计划也不同(可能:如果查询占用空间小,且两个查询之间的间隔短,则可能是缓冲区/缓存效应。简言之:信息不足。顺便说一句:成本估算以任意单位表示。)请注意,Postgres 8.4不受支持。您应该尽快计划升级。感谢您的回复。也许我可以问更多问题-您声明“查询计划受表统计信息的影响”因此,explain analyze
是否会首先更新这些统计数据,或者执行一些单独的vacuum analysis
,即使它每天都自动运行?@burry wombat-表格统计数据由analyze
更新。根据我的经验,explain analysis
不会更新统计数据,这是可以理解的,因为它正在处理查询。如果自动运行vacuum analyze
,则表统计信息应该是最新的。