首页/数据/数仓建模速查/维度表存储优化:分区与压缩
维度与事实设计149 条

维度表存储优化:分区与压缩

小维度用单文件紧凑格式;版本化大维度按 is_current 或更新时间分区;统一用 ORC/Parquet 压缩,避免大量小文件。

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

维度表存储怎么优化

维度表的存储选型要和它的使用方式匹配:小维度(行数在几万以内)用单文件紧凑格式,不必分区;版本化的大维度按 is_current 或更新时间分区,让「取当前版本」的查询只扫一个分区;文件格式统一用 ORC 或 Parquet 加压缩;同时控制小文件数量,避免小查询把时间耗在文件打开上。

基本信息

小维度不分区分桶,合并为单文件或少量文件
版本化大维度按 is_current 或更新时间分区
文件格式ORC / Parquet + 压缩(如 snappy、zstd)
分桶大维度可按常用 join 键分桶
小文件治理周期性合并或按分区重写
常见引擎Hive / Spark SQL,配置项随版本略有差异

典型使用场景

  • 当前版本查询加速:按 is_current 分区,只扫当前分区
  • 历史版本归档:旧版本单独分区,降低日常扫描量
  • 减少小文件:维度每日全量覆盖会产生大量小文件,需周期合并
  • join 优化:大维度按 join 键分桶,减少 shuffle
  • 成本控制:冷维度降低压缩成本或换更冷存储

按当前标志分区

按当前标志分区
CREATE TABLE dim_customer (
  customer_sk bigint,
  customer_id string,
  name string,
  start_date date,
  end_date date
)
PARTITIONED BY (is_current int)   -- 当前版本与历史版本分开存放
STORED AS ORC;   -- 列式存储 + 压缩,适合宽维度的部分列读取

存储选择对照

维度类型推荐做法注意点
小维度(万行级)单文件、不分区文件数少但别频繁改写
版本化大维度按 is_current 分区当前分区大小要可控
超大文本维度ORC/Parquet + 字典编码字符串列压缩效果最好
高频 join 维度按 join 键分桶分桶数要与下游一致
is_current 分区能让当前版本查询只扫一个分区,而历史查询仍可全扫;缺点是每次版本切换都要重写分区,因此要结合版本变更频率决定是否值得。
维度表每天全量覆盖写入会产生大量小文件:应按周期(例如每周)做一次合并重写,并注意重写期间下游查询的可见性,通常用临时表写好后整体替换。

易错点

  • 版本化维度每次全量覆盖写入,历史查询只能全扫,查询代价陡增
  • 每天生成一批小文件且长期不合并,小查询的调度开销超过计算本身
  • 小维度也照搬分区与分桶,元数据开销反而大于收益
  • 分桶数与下游表不一致,join 无法利用分桶优化,仍需全量 shuffle

数据来源与参考

  • Hive 语言手册:表与分区;文件格式实践
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌