首页/数据/数仓建模速查/稠密快照与稀疏快照
维度与事实设计149 条

稠密快照与稀疏快照

稠密快照每天为每个实体落一行(无变化也落),任意日期直接查询;稀疏快照只记录变化日,省存储但查询需要向前填充。

数仓建模速查数据更新于 2026-10-13

稠密与稀疏快照

快照事实表记录实体在某个时点的状态。稠密快照每天为每个实体落一行,哪怕当天毫无变化;稀疏快照只在状态变化那天落行。前者查询简单、任意日期直接取当日行,代价是行数等于实体数乘天数;后者省存储,查任意日期时要向前填充最近一次变化值。选哪种取决于实体基数、变化频率与查询性能要求。

基本信息

稠密形态每个实体每天一行,无变化也落
稀疏形态状态变化日才落行
行数关系稠密约等于实体数乘以天数
查询差异稀疏需窗口函数向前填充
常见实体账户余额、库存、会员等级、设备配置

典型使用场景

  • 账户日终余额:稠密快照,任意日期直接取当日行做报表
  • 设备配置留存:稀疏快照,设备数周才改一次配置,稠密会写出大量无变化行
  • 会员等级分布:等级变化少,稀疏快照足够且便于回溯升级路径
  • 库存日结存:仓与 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';

两种形态对比

维度稠密快照稀疏快照
行数实体数乘天数只等于变化次数
任意日期取值直接按分区取必须向前填充
无变化日有一行记录无行,容易被误读为数据缺失
适用场景变化频繁或需逐日比对实体多、变化极少
稀疏快照填充要划清边界:实体首次出现之前的日期本就没有值,报表应显示为空而不是零,否则会把「尚未持有」与「余额为零」混为一谈,平均值与占比类指标随即失真。
稠密快照的实体集合通常取自维表当天切片,维表加载延迟或成员减少会直接造成幽灵行、漏行;写入前应校验快照实体数与本日维表有效成员数的差异,超出阈值就阻断。

易错点

  • 稀疏快照查询忘记填充:空白被当零参与求和,总量严重偏低却无人察觉
  • 稠密快照实体来自维表当天切片:维表延迟导致幽灵行,占比类指标分母错
  • 两种快照混用不声明口径:同一指标两个来源数字不同,对账时才发现
  • 向前填充未限定分区:跨分区取到别人的值,数据串行且难以定位
  • 时点定义不统一(日初还是日终):跟财务对账时每天差一天的余额

数据来源与参考

  • 数据仓库工具箱:周期快照变体
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌