当您在超级表上执行查询时,您不会解析整个表;您仅访问满足查询所需的数据块。当查询的 WHERE
子句使用超级表的分区列时,此方法效果良好。例如,在一个超级表中,每一年中的每一天都是一个单独的数据块,对 9 月 1 日的查询仅访问该天的数据块。
然而,许多查询使用分区列以外的列。例如,一家卫星公司可能有一个包含两列的表:一列记录卫星收集数据的时间,另一列记录数据添加到数据库的时间。如果您按收集日期进行分区,则按添加日期进行的查询将访问超级表中的所有数据块,并降低性能。
为了提高查询性能,TimescaleDB 使您能够跳过超级表中非分区列上的数据块。
重要提示
数据块跳过只能在压缩超级表上启用。
您可以在表中的列上启用数据块跳过。TimescaleDB 跟踪每个数据块中该列的最小值和最大值。这些范围以起始值(包含)和结束值(不包含)格式存储在 chunk_column_stats
目录表中。当 SQL 查询的 WHERE
子句指定列上的范围时,TimescaleDB 使用这些范围进行动态数据块排除。

您可以为 smallint
、int
、bigint
、serial
、bigserial
、date
、timestamp
或 timestamptz
类型列的压缩超级表启用数据块跳过。
您可以根据需要为任意多列启用数据块跳过。但是,最佳实践是在以下列上启用它:
- 相关的,即在某种程度上与分区列相关联。
- 在查询的
WHERE
子句中被引用。
在上面的卫星示例中,将数据添加到数据库的时间不可避免地晚于收集数据的时间。顺序 ID 和两个实体的创建时间戳也同步增加。这意味着这两列是相关的。
有关数据块跳过的更深入了解,请参阅我们的博客文章。
要在列上启用数据块跳过,请在 hypertable
上为 column_name
调用 enable_chunk_skipping
。例如,以下查询在 orders
表的 order_id
列上启用数据块跳过
SELECT enable_chunk_skipping('orders', 'order_id');
有关如何实现数据块跳过的更多详细信息,请参阅 API 参考。
关键词
在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页。