我正在测试名为Timescaledb的PostgreSQL扩展以获取时间序列数据。 如果我正确阅读PostgreSQL的文档,例如查询
WHERE x = 'somestring' and timestamp between 't1' and 't2'
最适合索引(x,timestamp)
。并且在该SQL查询上运行EXPLAIN
表明它可以正常工作。
当我在Timescaledb hypertable上尝试相同的查询时,它包含相同的数据且没有索引(x,timestamp)
。性能大致相同(如果不是更好)。创建索引(x,timestamp)
后,性能不会提高。
据我所知,超文本具有内置时间戳索引。所以,我应该有一个不同的策略来为表添加索引,例如只有(x)
的索引。是吗?
答案 0 :(得分:5)
关于TimescaleDB如何处理查询的一些事项:
基于时间的查询提高性能的主要方式是 通过大块排除。数据按时间划分为块 当执行特定时间范围的查询时, planner可以忽略具有该时间范围之外的数据的块。 然后为正在搜索的块应用索引。
如果您正在搜索包含所有块,块的时间范围 排除不适用,因此您的查询时间更接近 标准的PostgreSQL。
如果您的查询与块中的大量行匹配 在被扫描时,查询计划器可以选择顺序扫描 而不是索引扫描来节省I / O操作 https://github.com/timescale/timescaledb/issues/317
内置索引没有任何固有的特殊之处,您可以在创建超文本后删除索引,或在运行ON ("AQE Source Data 5.30.2018"."EVENT_NO" = "400 Machines"."MIN(EVENT_NO)")
时关闭它们(请参阅timescale api docs)。