首页/数据/数仓建模速查/大维度优化:编码与分桶
维度与事实设计149 条

大维度优化:编码与分桶

上亿行的客户/商品维度:代理键用整数或哈希、属性字典编码、按自然键哈希分桶,减少存储与 join 代价。

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

大维度为什么要专门优化

上亿行的客户或商品维度会同时放大三类成本:存储、关联时的洗牌数据量、以及加载时的排序开销。常用手段是代理键用整数或低碰撞哈希、高基数属性做字典编码、按关联键分桶,让维度与事实能做桶对桶关联,减少洗牌。

基本信息

代理键bigint 整数键或低碰撞哈希值
字典编码高基数文本属性映射为整数编码
分桶按关联键哈希分桶,维表与事实表桶数一致
压缩列式存储配合字典编码,压缩比通常很高
分区当前版本集中在最新分区,便于裁剪

典型使用场景

  • 客户维度:上亿会员的画像属性与关联优化
  • 商品维度:SKU 级明细的商品名称与类目关联
  • 设备维度:海量设备标识的映射与去重
  • 关联优化:桶数一致时避免全量洗牌
  • 存储优化:字典编码与列式压缩显著降低存储成本

分桶建表

分桶建表
-- Hive 分桶:按自然键哈希分桶,桶数与事实表保持一致
CREATE TABLE dim_product (
  product_sk   bigint COMMENT '代理键',
  product_id   string COMMENT '商品编码',
  product_name string COMMENT '商品名称',
  cat_id       int    COMMENT '类目编码'
)
CLUSTERED BY (product_id) INTO 64 BUCKETS
STORED AS ORC;

优化手段与代价

优化手段作用代价
整数代理键关联与存储成本低需要额外维护映射
字典编码高基数字段占用下降编码表要同步维护
分桶桶对桶关联省洗牌桶数不一致时失效
当前版本单独分区扫描量明显下降需要额外维护逻辑
维表与事实表的分桶数必须一致:否则优化器无法做桶对桶关联,仍然走全量洗牌,优化收益为零。
高基数字符串直接做关联键是常见性能陷阱:换成整数编码或哈希键后洗牌数据量明显下降,但编码映射表要纳入日常维护。

易错点

  • 维表与事实表分桶数不一致:桶对桶关联失效,仍全量洗牌
  • 直接用高基数字符串做关联键:洗牌数据量巨大,任务超时
  • 字典编码表不同步更新:新编码缺失导致关联丢行
  • 分桶键与关联键不一致:优化器无法利用分桶结构
  • 大维度全量重刷:加载窗口过长,影响下游时效
  • 向分桶表写入时未按桶键分发:小文件与桶数不匹配,读取性能反而下降

数据来源与参考

  • Hive 语言手册:分桶表;Spark SQL 参考
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌