我发现在PostgreSQL上触发时,下面给出的两个查询会生成不同的查询执行时间:
查询1:
\timing
select s0.value,s1.value,s2.value,s3.value,s4.value
from (
select f0.subject as r0,f0.predicate as r1,f0.object as r2,f1.predicate as r3,f1.object as r4
from schemaName.facts f0,schemaName.facts f1
where f1.subject=f0.subject
) facts,schemaName.strings s0,schemaName.strings s1,schemaName.strings s2,schemaName.strings s3,schemaName.strings s4
where s0.id=facts.r0 and s1.id=facts.r1 and s2.id=facts.r2 and s3.id=facts.r3 and s4.id=facts.r4;
重写了Query1:
select s0.value,s1.value,s2.value,s3.value,s4.value
from schemaName.strings s0,schemaName.strings s1,schemaName.strings s2,schemaName.strings, schemaName.facts f0,schemaName.facts f1 s3,schemaName.strings s4
where s0.id=f0.subject and s1.id=f0.predicate and s2.id=f0.object and s3.id=f1.predicate and s4.id=f1.object, f0.subject=f1.subject;
我无法理解postgresql生成不同查询执行时间的原因。有人可以帮我理解这个吗?
答案 0 :(得分:2)
Postgresql带有一个非常好的命令:EXPLAIN和EXPLAIN ANALYZE。前者打印出查询计划,估计事情需要多长时间,后者在实际运行查询时输出查询计划,这样就可以将实际执行成本与计划放在一起。
Postgresql使用一整套标准和启发式方法来决定如何最好地运行查询。从顺序和随机访问成本(在配置中可调)到表格中数据的统计抽样的所有内容。
我发现很多时候它会提出相同的查询计划给出两个截然不同的查询(假设它们给出相同的结果),并且我已经看到查询结构影响了计划。了解它正在做什么的最好方法是要求它解释。
所有这些都说:第二次运行总是比第一次运行得快,因为现在缓存了数据。因此,如果您真的想要比较运行时,请务必至少运行四次查询,删除第一个查询,然后平均其余查询。