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

时间:2016-09-20 12:52:04

标签: postgresql

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

现在有connected_id = 19created为低的行,因此可以快速找到匹配项。

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

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

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