PostgreSQL中的索引查询性能不稳定
在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%的确定性,我们拥有的指标并不合适。 我想,在阅读了关于指数表现的类似问题之后,我们最需要的是一个综合指数,即type
和timestamp
。
我运行的查询计划在这里:
WHERE
子句中类型='csq'的新索引)。 非常感谢您的帮助! 任何指针将非常感激!
索引可以用于where
子句或order by
子句。 使用索引表thetable(type, timestamp)
,则可以为两者使用相同的索引。
我的猜测是Postgres正在根据收集的统计数据决定使用哪个索引。 当它使用where索引,然后尝试排序时,您的性能会非常差。
这只是一个猜测,但值得创建上述索引以查看是否修复了性能问题。
解释输出全部使用时间戳索引。 这可能是因为类型列的基数太低,所以对该列索引的扫描与表扫描一样昂贵。
要创建的组合索引应该是:
create index comp_index on the_table ("timestamp", type)
以该顺序。
链接地址: http://www.djcxy.com/p/69141.html上一篇: Erratic indexed query performance in PostgreSQL
下一篇: Trying to implement HTTPS on selected pages which are making POST request