如何准确衡量查询的效率?

时间:2012-03-02 17:49:36

标签: postgresql query-optimization

我正在比较PostgreSQL 8.3.14上返回相同结果集的查询。

我在查询中使用了EXPLAIN来跟踪估算的总费用。我还运行了几次查询并记录了运行所花费的总时间。我知道连续运行会导致更多数据被缓存并使实际的无缓存运行时偏斜。

我仍然希望EXPLAIN成本与总运行时间(与缓存偏差)成比例。

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

  1. 查询A.
    • 总费用:119 500
    • 平均运行时间:28.101秒
  2. 查询B.
    • 总费用:115 700
    • 平均运行时间:28.291秒
  3. 查询C.
    • 总费用:116 200
    • 平均运行时间:32.409秒
  4. 查询D.
    • 总费用:93 200
    • 平均运行时间:37.503秒
  5. 我最后运行了查询D,如果由于缓存问题,它应该是最快的。由于在没有缓存的情况下运行查询似乎很难基于此Q + A:

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

    如何衡量哪种查询效率最高?

2 个答案:

答案 0 :(得分:1)

规划器显示的查询成本是索引结构的函数,也是相关表中某些值的相对频率。 PostgreSQL跟踪所有表中所有列中最常见的值,以便了解每个计划的每个阶段可能运行的行数。

此信息可能已过期。如果您真的想要准确了解查询的成本,请通过执行VACUUM ANALYZE语句确保postgres使用的统计信息是最新的。

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

的配置中调整这些相对费用

修改 postgesql收集的统计信息与“查询性能”无关,并且不会通过连续查询进行更新。它们仅描述每个表的每列中的值的频率和分布(除非禁用。)具有准确的统计信息对于准确的查询计划非常重要,但是对于您(操作员)来说,它可以告诉PostgreSQL多长时间以及详细程度如何应该收集那些状态。您所观察到的差异性表明该事件已经过时,或者您可以从调整其他规划者参数中受益。

答案 1 :(得分:0)

尝试通过解释分析运行它们并将其输出发布到http://explain.depesz.com/