2012-03-02 65 views
1

我比较PostgreSQL 8.3.14上的查询返回相同的结果集。如何准确测量查询的效率?

我在查询中使用了EXPLAIN来跟踪估计的总成本。我也运行了几次查询并记录了运行所花费的总时间。我知道连续运行会导致更多的数据被缓存,并扭曲实际的no-cache运行时。

我仍然认为EXPLAIN的成本与总体运行时间有一定的比例(带有缓存偏移)。

我的数据否认这一点。我比较了4个查询。

  1. 查询
    • 总成本:119 500
    • 平均运行时间:28.101秒
  2. 查询乙
    • 总成本:115 700
    • 平均运行时间: 28.291秒
  3. 查询Ç
    • 总成本:116 200
    • 平均运行时间:32.409秒
  4. 查询d
    • 总成本:93 200
    • 平均运行时间:37.503秒

我最后运行了查询D,如果有什么,它应该是最快的,因为缓存问题。由于运行查询,而不缓存似乎在此基础上Q + A到困难:

[SO]:See and clear Postgres caches/buffers?

如何衡量它的查询是最有效的?

回答

1

规划器显示的查询成本是你的索引结构的功能,并且也一定值的相关表格中的相对频率。 PostgreSQL跟踪所有表格中所有列的最常见值,以便了解每个计划的每个阶段可能运行多少行。

此信息可能会过时。如果您确实想知道查询的成本如何,请通过执行VACUUM ANALYZE声明确保postgres统计信息使用的是最新的。

除此之外,计划者被迫做一些苹果比较桔子;以某种方式比较寻找所花费的时间与在内存关系上运行紧密循环所花费的时间。由于不同的硬件可以以不同的相对速度完成这些工作,有时候,特别是对于近距离关系,postgres可能会猜错。这些相对费用可以在server's config file

编辑的配置进行调整: 通过postgesql收集的统计数据不涉及“查询性能”,而不是通过连续查询更新。它们只描述每个表的每列中值的频率和分布(除非禁用)。准确的统计数据对于准确的查询计划非常重要,但它对您(运营商)告诉PostgreSQL的频率和详细程度应收集那些静音。你所观察到的差异是一个迹象,表明stastics过时了,或者你可以从调整其他计划器参数中受益。

+0

文档说'VACUUM ANALYZE [table]'将更新我包含的所有表的统计信息。在我看来,这会扭曲查询比较,因为每次连续运行都会有更好的统计数据。 – 2012-03-05 14:24:50

0

尝试运行他们通过讲解分析,并从输出张贴到http://explain.depesz.com/

+0

但是,我这样做并不能帮助我定量确定哪个查询效率最高。它使查找问题区域更容易,但不能比较查询效率。 – 2012-03-05 14:30:34