5

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

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

最适合使用 index (x,timestamp)。并EXPLAIN在该 SQL 查询上运行表明它有效。

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

我知道超表有一个内置的时间戳索引。所以,我应该有一个不同的策略来向表中添加索引,例如只使用(x). 那正确吗?

4

1 回答 1

7

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

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

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

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

  3. 内置索引本身并没有什么特别之处,您可以在创建超表后删除索引或在运行时关闭它们create_hypertable(请参阅timescale api docs)。

于 2018-05-31T18:40:25.263 回答