首页/数据/数仓建模速查/排序键与聚簇键的选择
建模基础69 条

排序键与聚簇键的选择

排序/聚簇键按高频过滤与 join 列选择(日期、用户、商品),高基数等值列优于低基数枚举;变更需重写数据要有成本预案。

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

排序键与聚簇键的选择

排序键与聚簇键决定数据在存储里的物理顺序,直接影响扫描量与 join 代价。选择原则是看高频查询的过滤与关联列:日期范围过滤、用户或商品等值关联是最常见的两类。高基数的等值列适合放在前面,低基数的枚举列打头会让裁剪效果大幅衰减。需要注意的是调整排序键通常意味着重写历史数据,因此要把重写成本与收益一并评估后再动手。

基本信息

选择优先级高频过滤列 + 高频 join 列
排列原则高基数等值列优先,低基数枚举避免打头
收益体现扫描数据量下降、join 与聚合更快
变更成本调整键通常需要重写历史数据,需评估窗口

典型使用场景

  • 日报表加速:按日期与门店过滤,排序键设为日期在前
  • 关联加速:事实与维度按同一键聚簇,减少 shuffle 数据量
  • 数据倾斜缓解:用高基数列打散热点,改善并行度
  • 存储优化:合理排序提升压缩率,降低长期存储成本
  • 性能回归排查:查询变慢时先核对排序键是否仍匹配查询模式

键选择示例

键选择示例
-- 常用查询:按日期范围 + 门店过滤,并在门店维度上关联
-- 聚簇键设计:(date_key, shop_sk)
--   date_key 在前:支撑时间范围裁剪
--   shop_sk 在后:支撑按门店过滤与关联
CLUSTERED BY (date_key, shop_sk) SORTED BY (date_key) INTO 128 BUCKETS

-- 反例:低基数枚举打头,过滤后仍需扫描大部分数据
-- CLUSTERED BY (is_weekend, order_type)

-- 变更评估:调整键后历史分区需重写,先估算数据量与重写窗口

键选择对照

查询模式推荐键顺序原因
按日期范围过滤date_key 打头支撑分区与排序裁剪
按高基数列等值过滤该列打头快速定位数据块
双列常用组合过滤列在前,关联列在后先缩小范围再关联
低基数枚举过滤不放在首位裁剪收益低,浪费排序位
排序键与查询模式脱节时,效果是扫描量不下降但也不报错,容易被误判为引擎能力不足,实际是设计问题。
排序键不是越多越好:多加一列会削弱前面的裁剪效果并增加写入开销,通常两三列覆盖主要查询即可。

易错点

  • 排序键与查询模式脱节:扫描量不降,优化投入没有回报
  • 频繁调整排序键:每次都要重写历史数据,重写成本与调度窗口失控
  • 低基数枚举列打头:裁剪效果衰减,查询仍需扫描大部分数据
  • 排序键列数过多:写入与压缩开销上升,收益反而下降

数据来源与参考

  • 数据仓库物理设计实践:排序键
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌