timescaledb index的工作原理与postgreSQL相同吗?

时间:2018-05-31 10:03:55

标签: performance indexing timescaledb

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

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

最适合索引(x,timestamp)。并且在该SQL查询上运行EXPLAIN表明它可以正常工作。

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

据我所知,超文本具有内置时间戳索引。所以,我应该有一个不同的策略来为表添加索引,例如只有(x)的索引。是吗?

1 个答案:

答案 0 :(得分:5)

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

  1. 基于时间的查询提高性能的主要方式是 通过大块排除。数据按时间划分为块 当执行特定时间范围的查询时, planner可以忽略具有该时间范围之外的数据的块。 然后为正在搜索的块应用索引。

    如果您正在搜索包含所有块,块的时间范围 排除不适用,因此您的查询时间更接近 标准的PostgreSQL。

  2. 如果您的查询与块中的大量行匹配 在被扫描时,查询计划器可以选择顺序扫描 而不是索引扫描来节省I / O操作 https://github.com/timescale/timescaledb/issues/317

  3. 内置索引没有任何固有的特殊之处,您可以在创建超文本后删除索引,或在运行ON ("AQE Source Data 5.30.2018"."EVENT_NO" = "400 Machines"."MIN(EVENT_NO)") 时关闭它们(请参阅timescale api docs)。