首页/数据/数仓建模速查/维度引用完整性检查
建模基础69 条

维度引用完整性检查

加载后校验事实外键在维度中均有对应;发现孤儿键先隔离再定位来源(新编码、同步延迟、维度过滤)。

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

引用完整性检查是什么

维度引用完整性指事实表的每个外键都能在对应维度表里找到匹配行。加载完成后用左连把两个方向都查一遍,就能发现孤儿键:事实里有而维度里没有的键值。发现后先隔离异常行再定位来源,常见成因是新编码未同步、维表带过滤条件加载、批量任务时间差、维表分区缺失。它是所有维度模型的基础体检项,应当按批次或按日固化进质量校验。

基本信息

检查方向事实外键左连维度表,筛出维度侧为 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 失败后维度字段为空,报表会以空白或默认分组呈现,看起来像正常数据,实际已污染分组结果。

易错点

  • 维表带过滤条件加载:事实侧引用被误伤,整段时间的报表都缺一批维度
  • 孤儿键不隔离直接进上层:报表出现空维度分组,且不易被察觉
  • 只查事实侧不查维度侧:维表过度加载与事实漏发的问题长期隐藏
  • 检查频率太低(按周或按月):异常要在数天后才暴露,回补范围成倍扩大

数据来源与参考

  • 数仓工程实践:完整性校验
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌