引用完整性检查是什么
维度引用完整性指事实表的每个外键都能在对应维度表里找到匹配行。加载完成后用左连把两个方向都查一遍,就能发现孤儿键:事实里有而维度里没有的键值。发现后先隔离异常行再定位来源,常见成因是新编码未同步、维表带过滤条件加载、批量任务时间差、维表分区缺失。它是所有维度模型的基础体检项,应当按批次或按日固化进质量校验。
基本信息
| 检查方向 | 事实外键左连维度表,筛出维度侧为 NULL 的行 |
|---|---|
| 执行频率 | 每个加载批次或每日一次,纳入质量门禁 |
| 处理动作 | 隔离异常行、定位成因、回补维度或落默认键 |
| 判定标准 | 孤儿键数量与占比双阈值,超限即阻断下游 |
典型使用场景
- 每日批量收尾:事实加载完成后先验完整性,再放行下游报表
- 新系统上线:主数据尚未打通,用完整性检查衡量同步缺口有多大
- 维表结构调整:分区或过滤条件变更后,确认是否有事实侧引用被误伤
- 增量维表延迟:维表比事实晚到,检查可量化影响行数为回补提供依据
- 上线前验收:把零孤儿键写进模型验收清单,作为交付硬指标
孤儿键巡检
孤儿键巡检
-- 方向一:事实外键在维度中找不到匹配(最常见)
SELECT f.product_sk, count(1) AS cnt
FROM fact_sale f
LEFT JOIN dim_product d ON f.product_sk = d.product_sk
WHERE d.product_sk IS NULL -- 维度侧为空即为孤儿键
GROUP BY f.product_sk;
-- 方向二:维表存在但被过滤掉(is_current 等条件写漏)
SELECT d.product_sk FROM dim_product d
LEFT JOIN fact_sale f ON f.product_sk = d.product_sk
WHERE f.product_sk IS NULL; -- 排查维度里的无引用成员常见成因与定位
| 成因 | 表现 | 定位与处理 |
|---|---|---|
| 新编码未同步 | 集中在近期日期的少量孤儿键 | 补齐维表再回刷事实 |
| 维表带过滤加载 | 孤儿键突然放量且跨全量日期 | 核对维表加载条件,去掉误伤过滤 |
| 任务时间差 | 维表比事实晚跑出结果 | 调整依赖顺序,或先落默认键再回补 |
| 维表分区缺失 | 仅某个分区出现大量孤儿键 | 检查维表分区与上游产出完整性 |
两个方向都要查:事实侧有孤儿键说明漏了维度,维度侧有无引用成员则可能是维表被过度加载或事实漏发,只查一个方向会留下盲区。
孤儿键不要直接放进上层。维表 join 失败后维度字段为空,报表会以空白或默认分组呈现,看起来像正常数据,实际已污染分组结果。