SuperAPI AI 工具集

timescaledb

数据与分析

查看项目

更新于 10-16 05:29

技能介绍

用途

TimescaleDB 2.24.0 技能用于在涉及时序数据的工作中,确保遵循 TimescaleDB 2.24.0 的最佳实践。当时序数据、超表、连续聚合或压缩相关模式被触及时,该技能为强制适用。其核心原则是:时序数据具有独特的访问模式,应从设计之初就面向“重追加、按时间范围查询”的场景。

技能声明:开始时宣布“I'm applying timescaledb to ensure TimescaleDB 2.24.0 best practices.”

适用触发条件

当以下文件名模式或代码内容出现时,该技能强制适用:

文件名模式包括:/hypertable、/timeseries、/metrics、/events、/logs、/sensor、/continuous_agg、/compression,例如 migrations/create_hypertable.sql、models/timeseries.ts、services/metricsService.ts、db/events.sql、tables/logs.sql、iot/sensor_data.sql、views/hourly_stats.sql、policies/compression.sql。

文件内容包含以下语句时也会触发:create_hypertable、continuous aggregate、compress_chunk、add_compression_policy。

TimescaleDB 2.24.0 的特性

1. 快速重压缩

2.24.0 引入 recompress := true,对压缩数据的更新显著加快。旧版(2.23 及更早)需要解压整个分块、更新、再压缩,大分块可能需要数分钟。新版可直接更新压缩数据,对压缩分块约快 100 倍。更新压缩分块时,会识别受影响段、只解压这些段、应用更新并立即重压缩。可通过查询 timescaledb_information.job_stats 并关联 proc_name = 'policy_recompression' 的任务来验证重压缩是否发生。该特性适用于迟到数据的修正、回填操作、数据质量修复和追溯性更新。

2. 连续聚合的直接压缩

连续聚合现在可以直接压缩,无需中间物化超表开销。创建连续聚合时可指定 timescaledb.compress = true,并直接对其添加压缩策略 add_compression_policy 与刷新策略 add_continuous_aggregate_policy。好处包括:无中间物化超表、自动压缩聚合数据、减少历史聚合的存储占用、管理更简单。

3. 连续聚合中的 UUIDv7

2.24.0 支持 PostgreSQL 18 原生 UUIDv7 用于连续聚合。超表可使用 uuid DEFAULT uuidv7() 作为主键(时间列需包含在主键中),连续聚合可引用 UUIDv7 列,例如 count(DISTINCT id)。

4. 布隆过滤器稀疏索引变化

2.24.0 修改了稀疏索引的布隆过滤器行为。对于包含大量 NULL 或低基数的稀疏列(如日志中的 error_code、trace_id),可通过 timescaledb.compress_bloomfilter 配置布隆过滤器,帮助在查询稀有非 NULL 值时跳过不含匹配项的分段。适用于稀疏列、稀有值查询、高基数精确匹配查询,但不适用于范围查询。

超表设计

创建超表使用 create_hypertable,可指定 chunk_time_interval 与 create_default_indexes。对于高基数维度,可配合 partitioning_column 与 number_partitions 进行空间分区。

分块间隔选择建议:数据量 < 1GB/天建议 1 周(分块更少、管理更简单);1-10 GB/天建议 1 天;10-100 GB/天建议 6 小时;> 100 GB/天建议 1 小时(最大化并行、快速删除)。可调用 set_chunk_time_interval 调整,使用 show_chunks 查看分块。

主键设计:时间列应包含在主键中,以有效进行分块裁剪。例如 PRIMARY KEY (id, time),而非仅 id 为主键而 time 不在其中。

压缩策略

通过 ALTER TABLE 设置 timescaledb.compress、timescaledb.compress_segmentby、timescaledb.compress_orderby、timescaledb.compress_chunk_time_interval。可手动调用 compress_chunk,或通过 add_compression_policy 设置自动压缩策略。

segment by 选择:应按常被过滤的维度分段,可多列;避免高基数的分段列(如百万级用户数的 user_id),高基数场景宜放入 orderby。orderby 可按时间降序、复合顺序(如 level, time DESC)或包含常被过滤的列,以匹配查询模式。

索引策略:create_hypertable 默认创建 (time DESC) 索引,可为常见查询添加复合索引(如 device_id, time DESC)或部分索引。压缩分块上不使用索引,查询规划依赖分块排除、段过滤和 orderby 优化,因此应按查询模式设计压缩设置,而非索引。

连续聚合

可创建基础连续聚合与层级聚合(聚合的聚合)。刷新策略通过 add_continuous_aggregate_policy 指定 start_offset、end_offset、schedule_interval。可设置 timescaledb.materialized_only = false 使用实时聚合(包含未刷新数据),或用 refresh_continuous_aggregate 强制刷新。2.24.0 中连续聚合可内置压缩,并可与刷新策略、压缩策略组合。

保留策略与分层存储

通过 add_retention_policy 设置保留策略,可查询 timescaledb_information.jobs 中 proc_name = 'policy_retention' 的任务,或使用 remove_retention_policy 移除。分层存储模式示例:原始数据 7 天不压缩、30 天压缩、90 天后删除;小时聚合约保留 1 年;日聚合永久保留。

查询模式

包括时间范围查询(利用索引)、按时间分桶聚合、按设备取最新值(DISTINCT ON),以及查询连续聚合而非原始数据。实时聚合会自动合并物化数据与实时数据。百分位与统计可使用 percentile_agg、stats_agg,并通过 approx_percentile、average、stddev 查询。

迁移模式

将普通表转为超表:确保时间列存在且 NOT NULL,使用 create_hypertable 并设置 migrate_data => true 和 chunk_time_interval,随后添加压缩与策略。向现有数据库添加 TimescaleDB:CREATE EXTENSION IF NOT EXISTS timescaledb,验证版本应为 2.24.0,并检查 PostgreSQL 兼容性。

实现产物

实现时序功能时,会发布 TimescaleDB 实现摘要产物,包含超表列表(分块间隔、空间分区、压缩)、压缩设置(segment by、order by、bloom filter)、连续聚合列表、策略列表(压缩、保留、刷新),以及所使用 2.24.0 特性的勾选项。

限制与缺失

本资料未提供该技能的独立安装命令、收费方式、许可条款或除 TimescaleDB 2.24.0 之外的平台兼容性细节;相关信息暂未提供。