【问题标题】:identical postgresql query with different performance具有不同性能的相同 postgresql 查询
【发布时间】:2016-09-20 12:52:04
【问题描述】:

我有一个包含测量数据的表,其中包含数据、connected_id(传感器)和时间戳。我正在此表中搜索特定传感器的第一个时间戳。对于某些传感器,我会在 2 毫秒内得到结果,而其他传感器则需要几秒钟才能完成。此外,当我删除搜索特定传感器的 where 条件时,结果在 ms 内。

两个查询使用相同的计划,使用 postgresql 8.4 在同一台服务器上执行。我已经对数据库进行了真空分析,并在 postgresql.conf 文件中使用了查询计划。

我已经在 created、connected_id 和这两个列上尝试了 btree 和 hash 索引。这没有任何区别。

【问题讨论】:

  • 不要截取文本,而是将其作为文本粘贴到此处。
  • 索引data_index是如何定义的?
  • 这也取决于数据量。两组条件的count(*) 返回值是多少?
  • @donkopotamus data_index 被定义为 btree(created)
  • @Rahul 说明中显示了记录数。 connected_id 26 有 3M 个结果,connected_id 19 有 5M 个结果。总表包含大约 5000 万条结果

标签: postgresql


【解决方案1】:

选择的查询计划按升序搜索由created 排序的索引,并在找到与connected_id 匹配的第一行时停止。

现在有connected_id = 19 和低created 的行,所以很快就找到了匹配项。

但显然所有带有connected_id = 26 的行都有相当高的created,因此查询必须扫描许多索引条目才能找到匹配项。

这就解释了差异。
如果您使用的是更新的、不受支持的 PostgreSQL 版本,则可以使用更多诊断信息来显示正在发生的事情,例如 EXPLAIN (BUFFERS)

我会在(connected_id, created) 上创建一个多列索引来加快这个查询。

【讨论】:

  • 感谢您的回答。我在(created, connected_id) 上尝试了多列索引。在 connected_id 上的第一个排序是有意义的。会尝试让你知道结果。
猜你喜欢
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
  • 2021-06-13
  • 2010-12-29
  • 2017-11-04
  • 1970-01-01
  • 2018-11-14
  • 1970-01-01
相关资源
最近更新 更多