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_1m | 1 minute | 每分钟自动刷新 |
klines_5m | 5 minutes | 每 5 分钟刷新一次 |
klines_1h | 1 hour | 每小时刷新一次 |
klines_1d | 1 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());