我正在测试一个名为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/