【问题标题】:Why would there be varying response times for the same query?为什么同一个查询会有不同的响应时间?
【发布时间】:2017-08-29 22:36:05
【问题描述】:

执行多次的同一查询在响应时间上有巨大差异是否有原因?从 50% - 200% 预计响应时间是多少?尽管它是数据库中唯一的活动查询,但它们的范围从 6 秒到 20 秒不等。

上下文:

  1. AWS RDS 上 Postgres 9.6 上的数据库(带预置 IOPS)

  2. 包含一个包含五个数字列的表,以 id 为索引,包含 2 亿行

查询:

SELECT col1, col2 FROM calculations WHERE id > 0 AND id < 100000;

查询的解释计划:

Bitmap Heap Scan on calculation (cost=2419.37..310549.65 rows=99005 width=43) Recheck Cond: ((id > 0) AND (id <= 100000)) -> Bitmap Index Scan on calculation_pkey (cost=0.00..2394.62 rows=99005 width=0) Index Cond: ((id > 0) AND (id <= 100000))

这样的简单查询在响应时间上的可预测性有什么原因吗?

谢谢。

【问题讨论】:

    标签: postgresql query-performance rds


    【解决方案1】:

    当你在 PostgreSQL 中看到这样的东西时EXPLAIN ANALYZE:

    (cost=2419.37..310549.65)
    

    ...这并不意味着成本在 2419.37 和 310549.65 之间。这实际上是两种不同的措施。第一个值是启动成本,第二个值是总成本。大多数时候,您只关心总成本。您应该关注启动成本的时间是当执行计划的该组件与(例如)EXISTS 子句相关时,只需要返回第一行(因此您只关心启动成本,不是全部,因为它几乎在启动后立即退出)。

    PostgreSQL documentation on EXPLAIN 对此进行了更详细的说明。

    【讨论】:

      【解决方案2】:

      当您是服务器的唯一用户时,查询的响应时间可能(并且应该,不包括特殊情况)更可预测。在云服务器的情况下,您对实际服务器负载一无所知,即使您的查询是对数据库执行的唯一查询,因为服务器很可能同时支持多个数据库。正如您询问的响应时间,通过网络访问远程服务器可能还涉及各种情况。

      【讨论】:

      • 这里有一个更新。在将数据库转储到我自己的 EC2 实例 postgres 服务器并连续执行上述查询之后,我可以看到差异非常小——彼此相差 +/- 10%。所以现在认为我们没有正确配置(或者不完全理解预置 IOPS 如何在 RDS 上工作)。将对此进行更多研究。
      【解决方案3】:

      在调查历史负载后,我们发现我们最初配置的预置 IOPS 在环境上执行的最后一组负载测试中已经耗尽。

      根据亚马逊的文档@http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Storage.html,在此之后,亚马逊不保证执行时间的一致性,SLA 不再适用。

      我们已经确认,将数据库复制到具有相同配置的新 AWS RDS 实例时,在多次执行查询时会产生一致的响应时间。

      【讨论】:

        猜你喜欢
        • 2019-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-15
        • 1970-01-01
        • 2018-12-16
        • 1970-01-01
        相关资源
        最近更新 更多