迟到维度是什么
迟到维度指事实数据先到达、它引用的维度成员却还没到:订单当日落库,客户主数据次日才从源系统同步进来。此时事实行的维度外键解析不出来,直接丢行会损失收入数据,于是先挂一个未知成员键(如 -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 一起权衡后定策略。