更新时间:2026-11-03 GMT+08:00
分享

物化视图

物化视图(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 参数。

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

相关文档