我正在测试一个名为Timescaledb的PostgreSQL扩展来获取时间序列数据。
如果我正确阅读了PostgreSQL的文档,例如查询

WHERE x = 'somestring' and timestamp between 't1' and 't2'

最好与索引(x,timestamp)一起使用。并在该SQL查询上运行EXPLAIN可以正常工作。

当我在Timescaledb超表上尝试相同的查询时,该表包含相同的数据,但没有索引(x,timestamp)。性能大致相同(如果不是更好)。创建索引(x,timestamp)后,性能不会提高。

我知道该超表具有内置的时间戳索引。因此,我应该有一种不同的策略将索引添加到表中,例如仅使用(x)的索引。是对的吗?

最佳答案

有关TimescaleDB如何处理查询的一些事项:

  • 基于时间的查询提高性能的主要方法是
    通过块排除。数据按时间划分为多个块,因此
    当执行特定时间范围的查询时,
    计划者可以忽略数据超出该时间范围的数据块。
    然后将索引应用于要搜索的块。

    如果搜索的时间范围包括所有块,则块
    排除不适用,因此查询时间更接近
    标准PostgreSQL。
  • 如果您的查询与块中的大量行匹配
    在被扫描时,查询计划者可以选择顺序扫描
    代替索引扫描以节省I/O操作
    https://github.com/timescale/timescaledb/issues/317
  • 内置索引没有天生的特殊之处,您可以在创建超表之后删除索引,也可以在运行create_hypertable时将其关闭(请参阅timescale api docs)。
  • 关于performance - timescaledb index是否与postgreSQL相同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50621682/

    10-12 19:43