稠密与稀疏快照
快照事实表记录实体在某个时点的状态。稠密快照每天为每个实体落一行,哪怕当天毫无变化;稀疏快照只在状态变化那天落行。前者查询简单、任意日期直接取当日行,代价是行数等于实体数乘天数;后者省存储,查任意日期时要向前填充最近一次变化值。选哪种取决于实体基数、变化频率与查询性能要求。
基本信息
| 稠密形态 | 每个实体每天一行,无变化也落 |
|---|---|
| 稀疏形态 | 状态变化日才落行 |
| 行数关系 | 稠密约等于实体数乘以天数 |
| 查询差异 | 稀疏需窗口函数向前填充 |
| 常见实体 | 账户余额、库存、会员等级、设备配置 |
典型使用场景
- 账户日终余额:稠密快照,任意日期直接取当日行做报表
- 设备配置留存:稀疏快照,设备数周才改一次配置,稠密会写出大量无变化行
- 会员等级分布:等级变化少,稀疏快照足够且便于回溯升级路径
- 库存日结存:仓与 SKU 组合数量大、出入频繁,稠密更贴合业务节奏
- 指标对账:稠密快照便于逐日比对,稀疏快照要先填充再比
稀疏向前填充
稀疏向前填充
-- 稀疏快照:向前取最近一次变化值补全每一天
SELECT dt, account_id,
last_value(balance, true) OVER (
PARTITION BY account_id ORDER BY dt
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS balance
FROM fact_balance_sparse;
-- 稠密快照:直接按日期取数,无需填充
SELECT sum(balance) FROM fact_balance_daily WHERE dt = '2026-10-12';两种形态对比
| 维度 | 稠密快照 | 稀疏快照 |
|---|---|---|
| 行数 | 实体数乘天数 | 只等于变化次数 |
| 任意日期取值 | 直接按分区取 | 必须向前填充 |
| 无变化日 | 有一行记录 | 无行,容易被误读为数据缺失 |
| 适用场景 | 变化频繁或需逐日比对 | 实体多、变化极少 |
稀疏快照填充要划清边界:实体首次出现之前的日期本就没有值,报表应显示为空而不是零,否则会把「尚未持有」与「余额为零」混为一谈,平均值与占比类指标随即失真。
稠密快照的实体集合通常取自维表当天切片,维表加载延迟或成员减少会直接造成幽灵行、漏行;写入前应校验快照实体数与本日维表有效成员数的差异,超出阈值就阻断。