PostgreSQL中的索引查询性能不稳定

Jua*_*oto 7 sql postgresql indexing performance

需要有关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);
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

非常感谢您的帮助!任何指针都会非常感激!

Gor*_*off 2

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

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

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