物化视图:使用dbms_mview.explain_mview

本文通过dbms_mview.explain_mview函数分析Oracle物化视图的查询重写功能。首先创建测试环境,然后通过函数验证物化视图MV_TAN01未开启查询重写,接着创建启用查询重写的物化视图MV02_TAN01,并展示其成功实现查询重写。最后,探讨如何分析物化视图定义和创建语句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可以在《Oracle® Database Data Warehousing Guide》中找到更多内容

http://docs.oracle.com/cd/E11882_01/server.112/e25554/basicmv.htm#DWHSG8219

 

基本概况

用dbms_mview.explain_mview可以解释、分析物化视图,也可以用来排错。

dbms_mview.explain_mview能操作的对象有1.materialized view name,2.SQL语句, 3.CREATE MATERIALIZED VIEW的语句

分析完后可能的建议:  

         存在的物化视图详细情况。

         创建之前潜在的问题。

结果存在mv_capabilities_table或者数组中。

当前用户必须执行utlxmv.sql才会有权限创建mv_capabilities_table

SQL> @?/rdbms/admin/utlxmv.sql;

This procedure provides the following information:

       Is this materialized view fast refreshable?

       What type of query rewrite can be performed with this materialized view?

下面对3种对象进行实例测试。

一。对存在的MV进行分析


通过dbms_mview.explain_mview分析MV,验证MV的query rewrite功能:

创建测试环境

SQL> create table tan01 as select  * from dba_users;
SQL> create materialized view mv_tan01
  2  as select count(*) from tan01;
SQL> analyze table tan01 compute statistics;
SQL> set autot on;
SQL> select count(*) from tan01;
  COUNT(*)
----------
        56
Execution Plan
----------------------------------------------------------
Plan hash value: 761709626
--------------------------------------------------------------------
| Id  | Operation          | Name  | Rows  | Cost (%CPU)| Time     |
--------------------------------------------------------------------
|   0 | SELECT STATEMENT   |       |     1 |     2   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE    |       |     1 |            |          |
|   2 |   TABLE ACCESS FULL| TAN01 |    56 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------
Statistics
----------------------------------------------------------
          1  recursive calls
       

<think>我们正在讨论Oracle数据库中的DBMS_MVIEW.REFRESH过程。用户的问题集中在理解这个过程的作用以及特定语句`DBMS_MVIEW.REFRESH('$fundDividendTransferMV')`的功能。 根据之前的对话历史,我们已经解释了DBMS_MVIEW.REFRESH是用于刷新物化视图的,并介绍了不同的刷新方法(完全刷新、快速刷新、强制刷新)。现在用户要求更具体地解释这个语句的功能。 注意:用户提供的语句中有一个变量`$fundDividendTransferMV`,这可能是实际使用中会被替换为具体物化视图名称的占位符。在真实环境中,这个变量会被实际物化视图名替换。 核心解释: 1. **作用**:DBMS_MVIEW.REFRESH用于手动刷新一个或多个物化视图,使其数据与基表保持同步。 2. **参数**:这里只有一个参数`'$fundDividendTransferMV'`,它指定了要刷新的物化视图的名称(注意实际使用时变量会被替换)。 3. **刷新方式**:由于没有指定方法(method)参数,将使用默认的刷新方式。默认方式是“FORCE”,即Oracle会尝试快速刷新(FAST),如果不可行则使用完全刷新(COMPLETE)[^2]。 4. **执行方式**:这个语句通常以匿名PL/SQL块的形式执行,如: ```sql BEGIN DBMS_MVIEW.REFRESH('fundDividendTransferMV'); END; ``` 或者使用EXEC命令(在SQL*Plus等工具中): ```sql EXEC DBMS_MVIEW.REFRESH('fundDividendTransferMV'); ``` 附加说明: - 如果物化视图名称是大小写敏感的(例如创建时用了双引号),则参数中必须使用相同的大小写并用双引号包裹,例如:`"FundDividendTransferMV"`。 - 权限问题:执行该过程的用户需要具有刷新该物化视图的权限,否则会出现ORA-01031错误(如引用[1]所示)[^1]。 因此,语句`DBMS_MVIEW.REFRESH('$fundDividendTransferMV')`的功能是:刷新名为`fundDividendTransferMV`(实际替换变量后)的物化视图使用默认的FORCE刷新方式。 接下来,按照要求生成相关问题。这些问题应围绕物化视图刷新展开,并参考之前的讨论(如权限、刷新方式、并行性等)。</think>### DBMS_MVIEW.REFRESH 的作用详解 `DBMS_MVIEW.REFRESH('$fundDividendTransferMV')` 是 Oracle 数据库中用于**手动刷新物化视图**的核心操作。其核心功能是**强制更新物化视图中的数据,使其与源表保持同步**。具体作用如下: 1. **数据同步机制** - 物化视图(Materialized View)存储的是查询结果的物理副本 - 当源表数据变化时,物化视图不会自动更新 - 该过程强制将物化视图数据更新为最新状态 - 示例:`fundDividendTransferMV` 是基金分红转移相关物化视图 2. **刷新模式(默认 FORCE)** | 刷新模式 | 说明 | 适用场景 | |---------|------|---------| | `FORCE` (默认) | 先尝试快速刷新,失败则完全刷新 | 大多数场景 | | `FAST` | 仅增量更新变化数据 | 有物化视图日志时 | | `COMPLETE` | 全量重建物化视图 | 数据结构变更后 | ```sql -- 显式指定刷新模式示例 BEGIN DBMS_MVIEW.REFRESH('fundDividendTransferMV', 'C'); -- C=COMPLETE END; ``` 3. **执行过程解析** ```mermaid graph LR A[执行REFRESH命令] --> B{检查刷新模式} B -->|FORCE| C[尝试FAST刷新] C -->|成功| D[增量更新] C -->|失败| E[执行COMPLETE刷新] B -->|COMPLETE| E E --> F[全量重建MV] D --> G[更新完成] F --> G ``` 4. **关键特性** - **权限要求**:需要`CREATE MATERIALIZED VIEW`权限[^1] - **并行限制**:Oracle 10g+版本中`parallelism`参数可能不生效[^2] - **事务控制**:刷新操作在独立事务中完成 - **命名规范**:`$fundDividendTransferMV`中的`$`可能是变量占位符,实际应为有效物化视图名 ### 典型应用场景 1. **报表系统预计算** ```sql -- 每日收盘后刷新基金报表 BEGIN DBMS_MVIEW.REFRESH('fund_daily_report_mv'); END; ``` 2. **数据仓库ETL过程** ```sql -- 数据加载后刷新聚合视图 EXEC DBMS_MVIEW.REFRESH('sales_agg_mv', 'F'); ``` 3. **应用启动时初始化** ```sql -- 系统启动时确保数据最新 DBMS_MVIEW.REFRESH('user_portfolio_mv'); ``` ### 注意事项 1. 出现 **ORA-01031** 错误时,需检查执行用户权限: ```sql GRANT CREATE MATERIALIZED VIEW TO report_user; -- 授权语句 ``` 2. 大表刷新建议使用`ATOMIC_REFRESH => FALSE`避免长事务: ```sql BEGIN DBMS_MVIEW.REFRESH( list => 'large_mv', atomic_refresh => FALSE -- 非原子刷新 ); END; ``` 3. 快速刷新需满足条件: - 源表创建物化视图日志 - SELECT 语句符合快速刷新限制 - 包含主键或ROWID
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值