杂项维度是什么
杂项维度把多个低基数的标志位合并成一张小维表:是否首单、是否含赠品、是否加急、是否使用优惠券各自取值只有两三个,单独建维表会碎片化,直接放事实表又会让列数持续膨胀。做法是把这些标志的组合枚举成一个组合键,事实表只存一个代理键,分析时 join 回杂项维度还原各标志。它与迷你维度的区别在于:杂项维度放的是枚举标志,迷你维度放的是会随成员变化的离散属性。
基本信息
| 数据来源 | 多个布尔或低基数枚举标志 |
|---|---|
| 结构 | 标志组合枚举表,一组合一行 |
| 收益 | 减少事实表列数,避免维表碎片化 |
| 维护 | 新增标志需重建组合,行数按乘积增长 |
典型使用场景
- 订单标志组合:首单、含赠品、加急、线上支付,四个标志各自建维表过于零碎
- 风控标记归集:是否命中规则、是否人工复核等标志集中在同一张表便于切片
- 维度表数量治理:把十来个两值标志收敛为一张维度,总线矩阵更清晰
- 事实表瘦身:列存引擎下减少列数直接降低扫描与维护成本
- 指标下钻:按标志组合分析订单金额分布,无需为每个标志单独写条件
组合维与查询
组合维与查询
-- 杂项维度:三个标志的组合枚举,最多 8 行
-- dim_order_flag(flag_key, is_first, has_gift, is_urgent)
SELECT d.is_first, -- 是否首单
d.has_gift, -- 是否含赠品
sum(f.amount) AS amt
FROM fact_order f
JOIN dim_order_flag d ON f.flag_key = d.flag_key
GROUP BY 1, 2; -- 按标志组合切片,无需拆多张维表适用与不适用
| 情形 | 结论 | 原因 |
|---|---|---|
| 标志数 3-5 个、基数低 | 适合入杂项维度 | 组合数可控,收敛效果明显 |
| 标志数超过 8 个 | 先评估组合爆炸 | 组合数按乘积增长,维护成本陡升 |
| 标志会持续新增 | 评估拆回事实表 | 每次新增都要重建组合与回刷事实 |
| 单个标志基数很高 | 不适合 | 组合数失控,失去收敛意义 |
组合数估算很简单:把各标志的取值个数相乘。三个二值标志只有 8 行,六个二值标志就是 64 行,看起来仍然很小,但每新增一个标志都要全量回刷事实表的组合键,工程成本才是真正的约束。
杂项维度里的标志要保证互斥且覆盖完全,出现未匹配组合时应有默认键兜底,否则加载阶段会出现意外空值。