序列代理键的特点
序列代理键由自增序列或号段生成:键短、有序、索引效率高,存储与关联成本都低。代价是生成过程有状态——并行加载需要集中分配或号段预留,回填历史数据时还要防止键重复,否则事实表会关联到错误的维度成员。
基本信息
| 常见形态 | 数据库序列、号段服务、偏移量加行号 |
|---|---|
| 优点 | 键短、有序、索引友好、存储省 |
| 缺点 | 生成有状态,并行与回填容易冲突 |
| 并行方案 | 每任务预分配号段,例如每任务预留一百万区间 |
| 回填方案 | 预留独立号段或按批次递增,禁止序列回退 |
典型使用场景
- 维度加载:新成员分配代理键,事实表按此回填关联
- 高并发写入:号段服务批量取号,减少数据库往返
- 分区表设计:有序键有利于范围查询与分区裁剪
- 跨表一致性:同一维度在多个主题共用一份键空间
- 性能优化:整数键做关联比字符串自然键快得多
批量分配键空间
批量分配键空间
-- 批量分配键空间后本地编号,避免逐行取序列
SELECT
:seq_base + row_number() OVER (ORDER BY customer_id) AS customer_sk,
customer_id
FROM stg_new_member;
-- stg_new_member 只含本批新增成员,行号从 1 开始生成方式对比
| 生成方式 | 特点 | 适用场景 |
|---|---|---|
| 数据库序列 | 逐行取号,往返次数多 | 低并发、小批量 |
| 号段服务 | 一次取一段,性能好 | 高并发写入 |
| 偏移加行号 | 批量分配区间本地编号 | 数仓批量加载 |
| 最大值加行号 | 无需外部服务但需并发控制 | 单任务批处理 |
回填要占用独立号段:如果回填时从历史起点重新取号,会与已分配的键冲突,事实表随之关联到错误的维度成员。
序列缓存会跳号:数据库为性能缓存序列值时,实例重启会丢弃未使用的号码,因此代理键允许存在空洞,不要假设连续。