首页/数据/数仓建模速查/序列代理键:集中生成与号段
维度与事实设计149 条

序列代理键:集中生成与号段

自增序列键短小高效,但需要集中生成或号段分配维持唯一;并行加载与回填场景要防止键冲突。

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

序列代理键的特点

序列代理键由自增序列或号段生成:键短、有序、索引效率高,存储与关联成本都低。代价是生成过程有状态——并行加载需要集中分配或号段预留,回填历史数据时还要防止键重复,否则事实表会关联到错误的维度成员。

基本信息

常见形态数据库序列、号段服务、偏移量加行号
优点键短、有序、索引友好、存储省
缺点生成有状态,并行与回填容易冲突
并行方案每任务预分配号段,例如每任务预留一百万区间
回填方案预留独立号段或按批次递增,禁止序列回退

典型使用场景

  • 维度加载:新成员分配代理键,事实表按此回填关联
  • 高并发写入:号段服务批量取号,减少数据库往返
  • 分区表设计:有序键有利于范围查询与分区裁剪
  • 跨表一致性:同一维度在多个主题共用一份键空间
  • 性能优化:整数键做关联比字符串自然键快得多

批量分配键空间

批量分配键空间
-- 批量分配键空间后本地编号,避免逐行取序列
SELECT
  :seq_base + row_number() OVER (ORDER BY customer_id) AS customer_sk,
  customer_id
FROM stg_new_member;
-- stg_new_member 只含本批新增成员,行号从 1 开始

生成方式对比

生成方式特点适用场景
数据库序列逐行取号,往返次数多低并发、小批量
号段服务一次取一段,性能好高并发写入
偏移加行号批量分配区间本地编号数仓批量加载
最大值加行号无需外部服务但需并发控制单任务批处理
回填要占用独立号段:如果回填时从历史起点重新取号,会与已分配的键冲突,事实表随之关联到错误的维度成员。
序列缓存会跳号:数据库为性能缓存序列值时,实例重启会丢弃未使用的号码,因此代理键允许存在空洞,不要假设连续。

易错点

  • 多任务取同一序列:键冲突,维度主键报错或事实关联错乱
  • 回填时序列回退:产生重复键,关联结果出现一对多
  • 假设代理键连续:按最大值加一生成键与缓存机制冲突
  • 键空间不预留:并行任务互相抢占,出现等待或失败
  • 代理键被赋予业务含义(如按地区编码):业务调整后键的含义失效

数据来源与参考

  • 数据仓库工具箱:代理键生成
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌