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

标签 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 秒

我最后运行了查询 D,如果有的话,由于缓存问题,它应该是最快的。由于基于此 Q+A,在没有缓存的情况下运行查询似乎很困难:

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

我如何衡量哪个查询最有效?

最佳答案

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

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

除此之外,计划者还被迫进行一些苹果与橘子的比较;以某种方式比较查找所需的时间与在内存中的关系上运行紧密循环所需的时间。由于不同的硬件可以以不同的相对速度做这些事情,所以有时,特别是对于接近的关系,postgres 可能会猜错。这些相对成本可以在您的配置中进行调整 server's config file

编辑: postgesql 收集的统计数据与“查询性能”无关,也不会被后续查询更新。它们仅描述每个表的每个列中值的频率和分布(禁用的除外)。拥有准确的统计信息对于准确的查询计划很重要,但是运算符(operator)告诉 PostgreSQL 多久一次以及详细程度是什么应该收集这些统计数据。您观察到的差异表明统计数据已过时,或者您可以从调整其他规划器参数中受益。

关于postgresql - 如何准确衡量查询的效率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9537980/

相关文章:

PostgreSQL:通过 ZeosLib/Lazarus 从客户端连接捕获 RAISE NOTICE

mysql - 如何加快MySQL查询

php - 我还能做些什么来优化这个 MySQL 查询吗?

sql - 超过阈值时查询执行停止

postgresql - 大表上的 Postgres 慢查询

postgresql - 如何降低 Postgres 中 set_bit 的成本?

sql - 在多个查询中使用 postgres CTE

sql - 如何合并行并在 SQL 表中添加列?

sql - 哪一种是更快/更好的 sql 实践?

sql - 将 MySQL 存储过程转换为 PostgreSQL 函数。我该如何处理这些replace() 调用?