具有不同性能的相同postgresql查询

具有不同性能的相同postgresql查询

问题描述:

我有一个包含数据,connected_id(传感器)和时间戳的测量数据表。我正在搜索此表以获取特定传感器的第一个时间戳。对于某些传感器,我在2ms内得到结果,其他传感器需要几秒钟才能完成。此外,当我删除搜索特定传感器的条件时,结果在毫秒内。具有不同性能的相同postgresql查询

screen shot with <code>EXPLAIN ANALYZE</code> output

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

我已经尝试过创建,connected_id和这两列上的btree和hash索引。这没有任何区别。

+6

不要截图文本,而是将其粘贴到文本中。 – oals

+0

如何定义索引'data_index'? – donkopotamus

+0

它也取决于数据量。 count(*)'返回两组条件的值是多少? – Rahul

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

现在有connected_id = 19created,所以很快找到了匹配。

但显然connected_id = 26的所有行都有相当高的created,所以查询必须在找到匹配之前扫描许多索引条目。

这解释了区别。
如果您使用的是PostgreSQL版本较新的较不受支持的版本,则可以使用更多的诊断程序来显示发生的情况,如EXPLAIN (BUFFERS)

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

+0

谢谢你的回答。我尝试过'(created,connected_id)'多列索引。首先在connected_id上进行排序是有道理的。会尝试让你知道结果。 – slonkie