postgresql中多列上的多个索引与单个索引

时间:2016-09-02 16:42:39

标签: postgresql database-indexes

我无法就此主题的一些现有帖子找到任何结论性答案。

过去10年,我在100个地点都有一些数据。该表有大约8亿行。我需要主要为每个位置生成年度统计数据。有时我需要生成每月变化统计数据和每小时变化统计数据。我想知道我是否应该生成两个索引 - 一个用于位置,另一个用于年份或在位置和年份生成一个索引。我的主键当前是序列号(可能我可以使用位置和时间戳作为主键)。

感谢。

2 个答案:

答案 0 :(得分:11)

无论您在关系上创建了多少个索引,在某个查询中只会使用其中一个索引(哪一个取决于查询,统计信息等)。因此,在您的情况下,您将无法通过创建两个单列索引获得累积优势。为了从索引获得最大性能,我建议在(位置,时间戳)上使用复合索引。

请注意,... WHERE timestamp BETWEEN smth AND smth之类的查询会在... WHERE location = 'smth'... WHERE location = 'smth' AND timestamp BETWEEN smth AND smth之类的查询中使用上面的索引。这是因为索引中的第一个属性对搜索和排序至关重要。

不要忘记执行

ANALYZE;
创建索引后

以收集统计信息。

<强>更新 正如评论中提到的 @MondKin ,某些查询实际上可以在同一关系上使用多个索引。例如,使用ORa = 123 OR b = 456子句进行查询(假设两列都有索引)。在这种情况下,postgres将对两个索引执行位图索引扫描,构建结果位图的并集并将其用于位图堆扫描。在某些条件下,相同的方案可以用于AND查询,但不是联合,而是会有一个交集。

答案 1 :(得分:1)

(location,timestamp)上的索引应该比2个单独的索引更适合你的情况。请注意,列的顺序很重要。

相关问题