首页/数据/数仓建模速查/迟到维度(Late-arriving dimension)
维度与事实设计149 条

迟到维度(Late-arriving dimension)

事实先到、维度成员后到:先挂未知成员占位,等维度数据到达后回刷(backfill)历史事实的维度键。

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

迟到维度是什么

迟到维度指事实数据先到达、它引用的维度成员却还没到:订单当日落库,客户主数据次日才从源系统同步进来。此时事实行的维度外键解析不出来,直接丢行会损失收入数据,于是先挂一个未知成员键(如 -1)占位,等维度数据到达后再回刷历史事实的维度键。它是事实表与维表加载顺序不一致时的标准补偿手段。

基本信息

占位键未知成员键,常用 -1 或 0
补偿动作维度到达后回刷事实行的维度键
监控指标未知键占比、滞留时长、最长滞留天数
关键前提事实表保留业务自然键,否则无从回刷
幂等要求回刷要可重复执行,结果一致

典型使用场景

  • 订单与客户不同源:交易库实时入仓,主数据每日批量同步
  • 设备与资产台账:设备日志先行上报,资产信息后录入
  • 门店维度:新开店铺先在交易里出现,主数据建档滞后
  • 渠道与供应商:合作方编码由外部系统定期下发
  • 多源合并:同一天从两个源来的维度成员到达时间不同
  • 历史回补:源系统补推了往期维度数据,需要重挂事实键

占位与回刷

占位与回刷
-- 1) 加载事实时解析不到维度,先落未知成员键
INSERT INTO fact_order(order_id, user_id_nk, user_sk, amt, dt)
SELECT order_id, user_id, -1, amt, dt FROM stg_order;

-- 2) 维度到达后回刷(可重复执行,结果一致)
UPDATE fact_order f
JOIN   dim_user d
  ON   f.user_id_nk = d.user_id_nk
 AND   d.is_current = 1
SET    f.user_sk = d.user_sk
WHERE  f.user_sk = -1;

-- 3) 看还有多少没挂上
SELECT count(*) FROM fact_order WHERE user_sk = -1;

处理策略对照

策略做法代价
未知成员占位挂 -1,维度到达后回刷需要回刷作业与进度监控
延迟事实加载等维度到位再加载事实事实时效被维度拖住,实时场景不可用
维度提前拉取调度上让维度先跑源系统本身没数据时无效
丢弃并补偿丢弃明细,事后按源重算重算范围大,容易与账不对
缓冲队列暂存入临时区等待补齐多一层存储与状态管理
未知成员占比是衡量链路健康度最直接的指标:白天有少量属正常,隔日仍高说明主数据同步已断。回刷成本与迟到窗口成正比,窗口越长需要重写的分区越多,应与事实表的时效 SLA 一起权衡后定策略。

易错点

  • 事实表不留业务自然键:维度到达后无法定位该挂哪一行,永久挂在未知成员上
  • 从不回刷:未知成员长期占位,按客户、门店维度做的报表持续少算
  • 回刷无幂等保证:重复执行把已挂好的行反复改写,或在带聚合的场景重复扣减
  • 回刷范围无边界:全表 UPDATE 大事实表,锁表时间远超调度窗口
  • 不监控未知键占比:主数据同步断了几天没人发现,直到业务对账才暴露

数据来源与参考

  • 数据仓库工具箱:迟到数据
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌