# 物化视图
物化视图（Materialized View）是DWS中预计算并物化的查询结果，可加速复杂聚合查询。hwc-dws-cli提供物化视图子命令组，支持查看物化视图列表、依赖树、DDL定义、刷新管理、调度修复、级联重建等功能，帮助DBA全面掌握物化视图的运行状况。
表1**全局参数** 
| 参数                                          | 说明              |
|:---|:---|
| --dry-run                                   | 预览SQL，不执行；仅写命令支持。 |
| --verbose                                  | 同步打印执行的SQL。      |
| --format \<json\|\\table\|\\csv\|\\vertical\> | 结果的输出格式。          |
   
表2**物化视图只读子命令** 
| 子命令                                                                                                                                                                   | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
|:---|:---|
| matview list \[--schema \<s\>\] \[--owner \<o\>\]                                                                                                                       | 列出所有物化视图，含依赖层级、分区标记、属主、大小。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| matview tree \<view\>                                                                                                                                                 | 展示物化视图 / 基表的级联依赖树（DAG），含每个节点的直接依赖。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| matview define \<view\> \[--output \<f\>\]                                                                                                                              | 查询物化视图及其级联依赖的 DDL 定义语句，支持导出到文件。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| matview grants \<view\> \[--output \<f\>\]                                                                                                                              | 查询物化视图及其级联依赖的 GRANT 语句（ALTER OWNER + GRANT），支持导出到文件。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| matview partition \<view\>                                                                                                                                              | 查询物化视图的分区刷新状态，以及基表与物化视图的分区映射。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| matview duration \[\<view\>\] \[--schema \<s\>\] \[--owner \<o\>\] \[--name \<n\>\] \[--partition\] \[--history\] \[--limit \<N\>\] \[--broken-only\] \[--stale-only\] | 查询物化视图刷新耗时，省略视图名（\<view\>）时扫描全库。 - \[--partition\] 查询物化视图各分区的刷新耗时。  - \[--history\] 查询最近10条刷新历史记录，仅适用于单视图模式（指定\<view\>参数），不可与 \[--partition\] 同时使用。  - \[--name \<n\>\] 支持使用通配符按名称模糊匹配， % 匹配任意长度字符串， _ 匹配单个字符。   |
   
\<view\> 参数为物化视图或基表的名称，需带上所属schema前缀，格式为 schema.name 。
```
# 列出所有物化视图（按 schema / owner 过滤）
hwc-dws-cli matview list --format table
hwc-dws-cli matview list --schema public --owner dbadmin
# 查看基表 / 物化视图的级联依赖树
hwc-dws-cli matview tree public.mview
# 查询物化视图的 DDL 定义（可写入文件）
hwc-dws-cli matview define public.mview --output mv_ddl.sql
# 查询物化视图的 GRANT 语句（可写入文件）
hwc-dws-cli matview grants public.mview --output mv_grant.sql
# 查询物化视图的分区刷新状态和映射关系
hwc-dws-cli matview partition public.mview
# 查询单个物化视图的刷新耗时
hwc-dws-cli matview duration public.mview
hwc-dws-cli matview duration public.mview --partition
hwc-dws-cli matview duration public.mview --history
# 全库扫描所有物化视图刷新耗时摘要（可按 schema / owner 过滤、 名称模糊匹配）
hwc-dws-cli matview duration --schema public --owner dbadmin --name mv% --limit 20
```
表3**物化视图写子命令** 
| 子命令                                                                                                                                                                                                                                                                             | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
|:---|:---|
| matview refresh \<view\> \[--partition \<s\>\] \[--resetrict\] \[--cascade \<forward\\\|backward\\\|all\>\]                                                                                                                           | 刷新物化视图数据。 - \[--partition\] 指定分区名进行分区刷新，不可与 \[--cascade\] 同时使用。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| matview alter \<view\> \[--rename \<s\>\] \[--query-rewrite \<enable\\\|\\disable\>\] \[--refresh-start \<s\>\] \[--refresh-every \<s\>\] \[--refresh-restrict\] \[--refresh-on-demand\] \[--set \<key=value\>\] \[--reset \<key\>\] | 修改物化视图。 - \[--refresh-start\] 刷新启动表达式，如 now() 或 '2026-01-01 16:00:00'::timestamp 。  - \[--refresh-every\] 刷新间隔表达式，如 interval '30 second' 。  - \[--refresh-restrict\] 不进行级联刷新，必须与 \[--refresh-start\] 或 \[--refresh-every\] 同时使用。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| matview rebuild \<view\> \[--sql \<s\>\] \[--sql-file \<f\>\] \[--extra-users \<s\>\] \[--grant \<s\>\] \[--output \<f\>\] \[--no-lock\] \[--kill-sessions \<prompt\\\|always\\\|never\>\] \[--lock-timeout \<N\>\]                 | 级联重建物化视图 / 普通视图 / 基表。 - 重建DDL语句为必填，使用 \[--sql\] 直接输入或 \[--sql-file\] 从文件中读取，二者不能同时使用。  - 支持以下 \<view\>类型 + DDL 组合 1. 物化视图 + CREATE MATERIALIZED VIEW：删除重建物化视图  2. 普通视图 + CREATE OR REPLACE VIEW：替换视图  3. 基表 + ALTER TABLE：级联重建基表  4. 基表 + CREATE TABLE \<table\>_new：重建新表，并将旧表数据备份至 \<table\>_old；DDL 中新表名必须带_new后缀，重建完成后会自动重命名至原名。    - \[--kill-sessions\]：DROP锁冲突时kill策略， prompt - 交互确认（默认） / always - 直接 kill / never -不 kill，中止重建。  - \[--lock-timeout\]：DROP/RENAME锁等待超时秒数，默认5s，超时触发被动响应查持锁会话。仅约束锁等待；DDL 后立即清零，不影响后续重建/数据填充。   |
| matview rebuild-batch \[--sql \<s\>\] \[--sql-file \<f\>\] \[--extra-users \<s\>\] \[--grant \<s\>\] \[--output \<f\>\] \[--no-lock\] \[--kill-sessions \<prompt\\\|always\\\|never\>\] \[--lock-timeout \<N\>\]                    | 批量级联重建多个同质目标，重复依赖只DROP/CREATE一次。无\<view\>参数，目标名从DDL解析。 - 重建DDL语句为必填，使用 \[--sql\] 直接输入或 \[--sql-file\] 从文件中读取，可重复，但二者不能同时使用。DDL语句必须同质（例如全 ALTER TABLE、全 CREATE MV ......）  - 支持类型及参数与 rebuild 命令相同。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| matview repair \[\<view\>\] \[--schema \<s\>\] \[--all\] \[--stale-factor \<N\>\] \[--stall-intervals \<N\>\]                                                                                                                   | 修复 stale 和 broken 的物化视图刷新调度。 - \<view\>、\[--schema\]、\[--all\] 三选一：\<view\> 修复单张指定物化视图；\[-schema\] 扫描指定schema下所有物化视图，进行批量修复，\[--all\] 扫描所有schema下物化视图，进行批量修复。  - broken：后台调度任务因异常被标记中断，刷新任务不再自动执行。  - \[--stale-factor\]：过期容忍因子，默认为1.0。age \> interval \* stale-factor 为过期，stale-factor 越小越严格。  - \[--stall-intervals\]：停滞阈值，默认为3。过期interval最大可超过的值。  - 同时满足以下三个条件的物化视图判定为stalled，需要修复 1. 已过期（age \> interval \* stale-factor）  2. 调度未激活或已停止（active=false）  3. 过期时间超过N个interval（停滞阈值）                                      |
| matview drop \<view\> \[--cascade\] \[--kill-sessions \<prompt\\\|always\\\|never\>\] \[--lock-timeout \<N\>\]                                                                                                                        | 删除物化视图。 - \[--cascade\]：级联删除目标及所有上游依赖。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
   
执行写命令需要 --write 参数；执行 drop 命令需要 --write 和 --confirm-dangerous 参数。
![](https://support.huaweicloud.com/dws-ai-dws/public_sys-resources/caution_3.0-zh-cn.png)
alter、drop、repair、rebuild、rebuild-batch 为事务性命令，失败或中断后自动回滚；refresh为非事务命令，提交后无法回滚。执行写命令前建议使用 --dry-run 进行预览。
```
# 刷新物化视图
hwc-dws-cli matview refresh public.mview --write
hwc_dws_cli matview refresh public.part_mview --partition p1 --write
# 修改物化视图
hwc-dws-cli matview alter public.mview --rename mview_new --query-rewrite enable --refresh-start "now()" --refresh-every "interval '30s'" --write
hwc-dws-cli matview alter public.mview --set mv_refresh_guc=enable_nestloop=off --reset mv_pck_column --write
# 删除物化视图
hwc-dws-cli matview drop public.mview --write --confirm-dangerous
hwc-dws-cli matview drop public mview drop public.mview --cascade --kill-sessions always -lock-timeout 30 --write --confirm-dangerous
# 修复物化视图
hwc-dws-cli matview repair public.mview --dry-run    # dry-run 预览是否需要修复
hwc-dws-cli matview repair public.mview --write
hwc-dws-cli matview repair --all --stale-factor 0.5 --stall-intervals 2 --write
# 重建物化视图
hwc-dws-cli matview rebuild public.mview --sql "CREATE MATERIALIZED VIEW public.mview AS SELECT * FROM public.table WHERE a > 10" --write
hwc-dws-cli matview rebuild public.view --sql "CREATE OR REPLACE VIEW public.view AS SELECT * FROM public.table WHERE a > 1" --write
hwc-dws-cli matview rebuild public.table --sql "ALTER TABLE public.table MODIFY c bigint" --kill-sessions never --lock-timeout 10 --write
hwc-dws-cli matview rebuild public.table --sql "CREATE TABLE public.table_new AS SELECT * from public.table" --extra-users user_read --grant SELECT --write
# 批量重建多个同质目标
hwc-dws-cli matview rebuild-batch --sql "CREATE MATERIALIZED VIEW public.mv1 AS SELECT * FROM public.t WHERE a > 10" 
  --sql "CREATE MATERIALIZED VIEW public.mv2 AS SELECT t1.a AS t1a, t1.b AS t1b, t2.a AS t2a, t2.b AS t2b FROM public.table t1 LEFT JOIN public.table2 t2 ON t1.a = t2.a WHERE t2.b > 1"
  --kill-sessions prompt --lock-timeout 10 --no-lock --write
```
