物化视图解决什么
物化视图把查询结果真实落盘存储,而普通视图只是把定义存下来、每次查询时重新展开。Hive 3.x 在命中时可借助 CBO 把查询自动改写成读取物化视图,省去对基表的重复扫描。它适合结果集远小于明细的固定聚合,代价是需要自行安排重建来保持数据新鲜。
基本信息
| 适用平台 | Apache Hive 3.x 能力较完整,2.3 起有基础支持 |
|---|---|
| 存储 | 默认落在 Hive 仓库目录,也可指定存储位置 |
| 刷新方式 | ALTER ... REBUILD,支持 FULL 与 INCREMENTAL |
| 改写开关 | hive.materializedview.rewriting 决定是否自动改写 |
| 权限 | 建视图需库写权限,重建需表属主或管理员 |
典型使用场景
- 门店日销、渠道日报这类固定维度聚合,明细每天全量扫描成本高
- 同一张宽表被多个报表按完全相同的分组反复统计,结果集稳定
- 上游明细极大而聚合结果很小,用一份存储换掉每天的扫描量
- 临时没有 DWS 层承接口径,先用物化视图顶一段时间
- 跨表 Join 后的小结果集,且关联逻辑长期不变
创建与重建
创建与重建
-- 建视图:预先物化门店日聚合
CREATE MATERIALIZED VIEW mv_trade_store_day AS
SELECT store_id, dt, sum(pay_amt) AS pay_amt -- 口径与下游报表保持一致
FROM dwd_trade_order_di
GROUP BY store_id, dt; -- 分组列决定改写能否匹配
ALTER MATERIALIZED VIEW mv_trade_store_day REBUILD; -- 基表更新后重建
SHOW MATERIALIZED VIEWS; -- 查看视图与刷新时间
EXPLAIN SELECT store_id, sum(pay_amt) FROM dwd_trade_order_di WHERE dt='2026-10-12' GROUP BY store_id; -- 看是否命中改写维护动作对照
| 动作 | 命令 | 说明 |
|---|---|---|
| 重建 | ALTER ... REBUILD | 按定义重算,耗时取决于基表规模 |
| 查看 | SHOW MATERIALIZED VIEWS | 确认视图列表、刷新状态与时间 |
| 删除 | DROP MATERIALIZED VIEW | 先确认没有下游脚本直接引用 |
| 开关改写 | hive.materializedview.rewriting | 关闭后只能显式查询该视图 |
自动改写要求查询的聚合函数、分组列与过滤条件跟视图定义足够接近,并依赖准确的表统计信息。改写不生效时先用 EXPLAIN 看执行计划,判断是改写未命中还是统计缺失,再决定是否手工改写 SQL。
物化视图不会随基表自动刷新,调度里必须把 REBUILD 排在被依赖任务之前。漏了刷新不会报错,只会让下游静默读到旧快照。