7

需要有关 PostgreSQL 中查询性能的帮助。它似乎与索引有关。

这个查询:

  • 筛选依据type
  • timestamp,升序排列:

SELECT * FROM the_table WHERE type = 'some_type' ORDER BY timestamp LIMIT 20

索引:

 CREATE INDEX the_table_timestamp_index ON the_table(timestamp);

 CREATE INDEX the_table_type_index ON the_table(type);

type字段的值只是大约 11 个不同字符串中的一个。
问题是查询似乎在 O(log n) 时间内执行,大多数时候只需要几毫秒,除了一些type需要几分钟才能运行的值。

在这些示例查询中,第一个查询只需要几毫秒即可运行,而第二个查询则需要 30 多分钟:

SELECT * FROM the_table WHERE type = 'goq' ORDER BY timestamp LIMIT 20
SELECT * FROM the_table WHERE type = 'csp' ORDER BY timestamp LIMIT 20

我怀疑,大约 90% 的确定性,我们拥有的索引不是正确的。我认为,在阅读了关于索引性能的类似问题之后,我们最需要的是一个复合索引,over typeand timestamp

我运行的查询计划在这里:

  1. 预期性能,特定类型索引(即,WHERE子句中 type = 'csq' 的新索引)。
  2. 最慢,有问题的情况,索引如上所述。
  3. 快速案例,与上述相同的索引。

非常感谢您的帮助!任何指针将不胜感激!

4

2 回答 2

2

索引可用于where子句或order by子句。使用 index thetable(type, timestamp),则可以对两者使用相同的索引。

我的猜测是 Postgres 正在根据它收集的统计数据来决定使用哪个索引。当它使用索引作为 where 然后尝试排序时,你会得到非常糟糕的性能。

这只是一个猜测,但值得创建上述索引以查看是否可以解决性能问题。

于 2013-01-31T20:42:39.180 回答
2

解释输出都使用时间戳索引。这可能是因为类型列的基数太低,因此对该列的索引进行扫描与表扫描一样昂贵。

要创建的复合索引应该是:

create index comp_index on the_table ("timestamp", type)

以该顺序。

于 2013-01-31T21:03:20.830 回答