跳到主要内容

TimescaleDB:时序数据与 K线 (Time-Series)

针对高频生成的成交数据,系统集成了 TimescaleDB 插件。它通过 Hypertable (超表)Continuous Aggregates (持续聚合) 机制,解决了海量数据下的插入性能和聚合查询速度(K线)问题。

1. 成交数据超表 (trades)

trades 表已按 created_at(时间戳)转化为 Hypertable。

分区与策略

  • Chunk 间隔: 每 24 小时为一个 Chunk,确保存储紧凑。
  • 数据保留 (Retention): 默认保留 90 天的原始成交流水。
  • 压缩 (Compression): 对 7 天以前的数据进行分列压缩,最高可节省 90% 的存储空间。

2. 自动聚合 K 线 (Continuous Aggregates)

系统定义了一系列物化视图,利用持续聚合技术实时生成各周期的 K 线柱:

视图名周期刷新策略 (Refresh Policy)
klines_1m1 minute每分钟自动刷新
klines_5m5 minutes每 5 分钟刷新一次
klines_1h1 hour每小时刷新一次
klines_1d1 day每日刷新一次

聚合逻辑示例 (SQL)

SELECT
symbol,
time_bucket('1 minute', created_at) AS bucket,
FIRST(price, created_at) AS open,
MAX(price) AS high,
MIN(price) AS low,
LAST(price, created_at) AS close,
SUM(amount) AS volume
FROM trades
GROUP BY symbol, bucket;

3. 运维指令集

查看超表分区信息

SELECT * FROM timescaledb_information.chunks WHERE hypertable_name = 'trades';

查看聚合作业状态

SELECT job_id, last_run_duration, last_run_status 
FROM timescaledb_information.job_stats;

手动强制刷新指定范围的 K 线

-- 刷新最近 12 小时的 15 分钟 K 线
CALL refresh_continuous_aggregate('klines_15m', NOW() - INTERVAL '12 hours', NOW());