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%的确定性,我们拥有的指标并不合适。 我想,在阅读了关于指数表现的类似问题之后,我们最需要的是一个综合指数,即typetimestamp

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

  • 期望的性能,类型特定的索引(即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