首页/数据/数仓建模速查/加载模式对照:覆盖/追加/拉链
分层与规范64 条

加载模式对照:覆盖/追加/拉链

四种加载模式:全量覆盖(小表)、增量追加(日志类)、拉链(维度历史)、upsert(主键更新);选择依据是源端能力与下游对历史的需求。

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

加载模式是什么

加载模式决定目标表里最终留下什么,常见四类:全量覆盖(每次重写整表或整分区,适合小表与每日快照)、增量追加(只插入新事件,适合日志类数据)、拉链(用生效时间与失效时间两列保留维度历史版本)、upsert(按主键更新为最新状态)。选择依据是源端能力与下游对历史的需求:要查历史某个时点的状态就上拉链,只需要最新值就用 upsert。

基本信息

全量覆盖适合小表与每日快照
增量追加适合事件与日志,依赖去重字段
拉链保留历史版本,记录生效与失效时间
upsert按主键更新为最新状态
选择依据源端能力 + 下游是否需要历史

加载模式对照

模式适用实现要点
全量覆盖小表、每日快照按分区 overwrite,其他历史分区不动
增量追加事件与日志靠批次号或事件 ID 去重
拉链需要历史版本的维度开链与闭链两段写入
upsert只要主键最新态用 merge 或主键模型实现

两种典型写法

两种典型写法
-- 增量追加:只插入当天新增,重跑前需先清空该分区
INSERT INTO TABLE dwd_user_login_di PARTITION (dt='2026-10-13')
SELECT user_id, login_time, '2026-10-13' AS dt
FROM stg_login
WHERE dt='2026-10-13';

-- 拉链:旧版本闭链填失效时间,再插入新版本开链
UPDATE dim_user SET end_date='2026-10-13'
WHERE user_id='U1' AND end_date='9999-12-31';
追加模式必须有去重字段兜底(批次号、事件 ID,或业务主键加时间),否则任务失败后重跑会把同一批数据写第二遍,指标翻倍而且不易察觉。
全量覆盖与增量追加混用在同一张表上很危险:若某个分区被覆盖、其他分区靠追加,表里同一时间段的语义就不一致,后续按分区重算时结果无法预期。
加载模式应当写进表注释,让下游知道这张表是快照、流水还是最新态:同样是订单表,快照表可以直接按主键取数,流水表则必须先按主键去重再取,差别不写清楚就只能靠猜。

易错点

  • 追加表重跑前不清分区:同一批数据写两遍,指标翻倍
  • 该用拉链却选了 upsert:目标表只剩最新值,历史状态无法还原
  • 拉链只写不闭链:同一主键出现多条结束时间为默认值的记录,取数出现重复行
  • 全量覆盖大表:每天重写整表,抽数窗口与存储成本都被放大
  • 变更加载模式却不通知下游:下游仍按旧语义取数,结果静默出错

数据来源与参考

  • Kimball《数据仓库工具箱(第3版)》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌