timescaledb 索引是否与 postgreSQL 一样?
Does timescaledb index works the same as postgreSQL?
我正在为时间序列数据测试名为 Timescaledb 的 PostgreSQL 扩展。
如果我正确阅读了 PostgreSQL 的文档,例如
的查询
WHERE x = 'somestring' and timestamp between 't1' and 't2'
最适合索引 (x,timestamp)
。 运行 EXPLAIN
在那个 SQL 查询上表明它有效。
当我在 Timescaledb hypertable 上尝试相同的查询时,它包含相同的数据但没有索引 (x,timestamp)
。性能大致相同(如果不是更好的话)。创建索引(x,timestamp)
后,性能没有提高。
我知道 hypertable 有一个内置的时间戳索引。所以,我应该有一个不同的策略来将索引添加到 table,例如仅使用 (x)
的索引。是吗?
关于 TimescaleDB 如何处理查询的一些事情:
基于时间的查询提高性能的主要方式是
通过块排除。数据按时间划分成块,因此
当执行特定时间范围的查询时,
planner 可以忽略具有该时间范围之外的数据的块。
然后将索引应用于正在搜索的块。
如果您正在搜索包含所有块的时间范围,块
排除不适用,因此您的查询时间更接近
标准 PostgreSQL.
如果您的查询匹配块中的大量行
被扫描时,查询规划器可以选择顺序扫描
而不是索引扫描以节省 I/O 操作
https://github.com/timescale/timescaledb/issues/317.
内置索引本身没有什么特别之处,您可以在创建超表后删除索引,或者在 运行 create_hypertable
时关闭它们(参见 timescale api docs).
我正在为时间序列数据测试名为 Timescaledb 的 PostgreSQL 扩展。 如果我正确阅读了 PostgreSQL 的文档,例如
的查询WHERE x = 'somestring' and timestamp between 't1' and 't2'
最适合索引 (x,timestamp)
。 运行 EXPLAIN
在那个 SQL 查询上表明它有效。
当我在 Timescaledb hypertable 上尝试相同的查询时,它包含相同的数据但没有索引 (x,timestamp)
。性能大致相同(如果不是更好的话)。创建索引(x,timestamp)
后,性能没有提高。
我知道 hypertable 有一个内置的时间戳索引。所以,我应该有一个不同的策略来将索引添加到 table,例如仅使用 (x)
的索引。是吗?
关于 TimescaleDB 如何处理查询的一些事情:
基于时间的查询提高性能的主要方式是 通过块排除。数据按时间划分成块,因此 当执行特定时间范围的查询时, planner 可以忽略具有该时间范围之外的数据的块。 然后将索引应用于正在搜索的块。
如果您正在搜索包含所有块的时间范围,块 排除不适用,因此您的查询时间更接近 标准 PostgreSQL.
如果您的查询匹配块中的大量行 被扫描时,查询规划器可以选择顺序扫描 而不是索引扫描以节省 I/O 操作 https://github.com/timescale/timescaledb/issues/317.
内置索引本身没有什么特别之处,您可以在创建超表后删除索引,或者在 运行
create_hypertable
时关闭它们(参见 timescale api docs).