我无法就此主题的一些现有帖子找到任何结论性答案。
过去10年,我在100个地点都有一些数据。该表有大约8亿行。我需要主要为每个位置生成年度统计数据。有时我需要生成每月变化统计数据和每小时变化统计数据。我想知道我是否应该生成两个索引 - 一个用于位置,另一个用于年份或在位置和年份生成一个索引。我的主键当前是序列号(可能我可以使用位置和时间戳作为主键)。
感谢。
答案 0 :(得分:11)
无论您在关系上创建了多少个索引,在某个查询中只会使用其中一个索引(哪一个取决于查询,统计信息等)。因此,在您的情况下,您将无法通过创建两个单列索引获得累积优势。为了从索引获得最大性能,我建议在(位置,时间戳)上使用复合索引。
请注意,... WHERE timestamp BETWEEN smth AND smth
之类的查询会在... WHERE location = 'smth'
或... WHERE location = 'smth' AND timestamp BETWEEN smth AND smth
之类的查询中使用上面的索引。这是因为索引中的第一个属性对搜索和排序至关重要。
不要忘记执行
ANALYZE;
创建索引后以收集统计信息。
<强>更新强>
正如评论中提到的 @MondKin ,某些查询实际上可以在同一关系上使用多个索引。例如,使用OR
等a = 123 OR b = 456
子句进行查询(假设两列都有索引)。在这种情况下,postgres将对两个索引执行位图索引扫描,构建结果位图的并集并将其用于位图堆扫描。在某些条件下,相同的方案可以用于AND
查询,但不是联合,而是会有一个交集。
答案 1 :(得分:1)
(location,timestamp)上的索引应该比2个单独的索引更适合你的情况。请注意,列的顺序很重要。