当前视图解决什么
多数报表只关心维度成员的当前值,而 SCD2 维度表里同一个自然键有多行历史版本。用 is_current 过滤,或建一个只暴露当前行的视图,既能减少扫描行数,也让所有下游共用同一套「当前」定义,避免有人忘记加过滤条件而把历史行也算进来。
基本信息
| 过滤列 | is_current = 1,或结束日期为最大值 |
|---|---|
| 视图形式 | v_dim_xxx 只包含当前行 |
| 收益 | 少扫历史数据,口径统一 |
| 风险 | 视图谓词无法下推时退化为全历史扫描 |
| 配套优化 | 分区化维度把当前版本集中在最新分区 |
典型使用场景
- 报表取数:绝大多数分析只看当前归属,用视图省掉重复的过滤条件
- 口径统一:下游不再各自判断哪一行算当前版本
- 性能优化:历史版本很多时按当前标志过滤可显著减少扫描
- 权限隔离:视图只暴露当前行,历史敏感属性不被随意读取
- 下游开发:新同事默认引用当前视图,降低出错概率
当前视图的建法与用法
当前视图的建法与用法
-- 当前视图:每个自然键只暴露当前版本
CREATE VIEW v_dim_customer AS
SELECT customer_id, name, tier, city, start_date
FROM dim_customer
WHERE is_current = 1;
-- 查询侧直接引用视图,不再重复写过滤条件
SELECT tier, count(1) AS cnt
FROM v_dim_customer
GROUP BY tier;三种取数对象
| 对象 | 数据范围 | 适用场景 |
|---|---|---|
| 维度全量表 | 包含全部历史版本 | 历史归属回溯、时点分析 |
| 当前视图 | 每键一行当前版本 | 日常报表、维度关联 |
| 分区分层表 | 当前版本集中在最新分区 | 大维度按分区裁剪 |
混用当前视图与历史表最容易出错:同一份报表里一个指标按当前视图算、另一个按历史全量表算,同期数据就会对不上,而且很难看出是口径问题。
视图谓词能否下推决定性能:部分引擎在视图外层再加过滤时无法下推,仍会扫描全部历史数据,这种情况要改成物化的当前版本表。