缩小维度是什么
缩小维度是从大维度中裁剪出事实表实际需要的那部分属性,再单独物化成一张窄表。比如商品维度有八十多个字段,而销售事实的统计路径只需要商品键与三级类目,那么可以建一张只含这几个列的子集维表。它减少 join 宽度与 IO,本质上是为稳定的高频统计路径做物化,思路接近物化视图,区别在于缩小维度只裁列不改行。
基本信息
| 来源 | 大维度的属性子集,行数与主维一致 |
|---|---|
| 目的 | 减少 IO 与 join 宽度,加速固定统计路径 |
| 适用 | 高频、稳定、列需求明确的报表 |
| 风险 | 子集定义若无管控会与主维漂移 |
典型使用场景
- 日销报表只需类目层级:从商品维度裁出三级类目,避免每次扫描全字段
- BI 模型简化:给业务方提供窄表,降低选错列与误解字段的概率
- 引擎限制应对:宽维表在部分引擎上 join 代价高,窄表可绕开
- 多环境复用:集市层与报表层共用同一套子集定义,减少重复加工
- 冷热属性分离:只把热属性放进窄维,冷属性留在主维按需取用
子集维表与查询
子集维表与查询
-- dim_product_shrunk 仅保留 join 键与统计所需的类目层级
-- 字段:product_sk / category_l1 / category_l2 / category_l3
CREATE OR REPLACE VIEW dim_product_shrunk AS
SELECT product_sk, category_l1, category_l2, category_l3
FROM dim_product
WHERE is_current = 1; -- 只取生效版本,历史版本按需另建
SELECT s.category_l1, sum(f.amount) AS amt
FROM fact_sale f
JOIN dim_product_shrunk s ON f.product_key = s.product_sk
GROUP BY 1;取舍判断
| 判断项 | 适合缩小维度 | 应直接连主维 |
|---|---|---|
| 查询稳定性 | 列需求长期固定 | 临时探索、列需求多变 |
| join 频率 | 高频核心报表 | 低频临时分析 |
| 维护成本 | 子集定义集中管控 | 子集散落各处无法统一 |
| 属性时效 | 层级基本不变 | 层级频繁调整需即时反映 |
缩小维度的边界很清楚:只裁列、不裁行。如果需要裁剪的是成员范围(比如只要某几个品类),那已经属于带过滤的派生表,会引入口径差异,应当单独评审。
子集的定义必须与主维同源同刷:手工维护的子集维表会随着主维演进悄悄变旧,报表数字与明细逐步对不上,而这类偏差通常要等到对账才暴露。