ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 物化视图半攻略

物化视图半攻略

原创 Linux操作系统 作者:flying_warrior 时间:2011-04-23 00:08:19 0 删除 编辑

首先 物化视图是可以被更新的

假设 test_alex; 1条数据    col_a =1  物化视图建立方式

CREATE MATERIALIZED VIEW LOG ON test_alex WITH PRIMARY KEY;

CREATE MATERIALIZED VIEW test_alex_mv REFRESH FAST WITH PRIMARY KEY for update AS SELECT * FROM test_alex;

 

col_a被更新的时候 假设 a=2  那么 flush 一下物化视图   那么 物化视图 也会变成2

那么好 接下来 先把物化视图更新成3.  把表中数据更新为4

 

再次刷新  居然两者的a都等于4

 

再实验 把物化视图更新成表中数据不动。

 

再次刷新数据 物化视图中的数据又回到了4.

 

 

物化视图有快速刷新和完全刷新两种模式  默认是 如果不能快速 则完全刷新

CALL  dbms_mview.refresh('TEST_ALEX_MV’[,’F’|’C’]);

 

 

第一次物化视图已经建立成功,下面建立嵌套物化视图:

SQL> CREATE MATERIALIZED VIEW LOG ON MV_ABC WITH ROWID (BNAME, CNAME, NUM) INCLUDING NEW VALUES;

实体化视图日志已创建。

SQL> CREATE MATERIALIZED VIEW MV_MV_ABC REFRESH FAST ON COMMIT ENABLE QUERY REWRITE AS
  2  SELECT CNAME, BNAME, COUNT(*) COUNT, SUM(NUM) SUM_NUM FROM MV_ABC
  3  GROUP BY CNAME, BNAME;
SELECT CNAME, BNAME, COUNT(*) COUNT, SUM(NUM) SUM_NUM FROM MV_ABC
                                                           *
ERROR
位于第 2 :
ORA-12053:
这不是一个有效的嵌套实体化视图

错误出现了,不过错误的描述包含的信息量并不大。我们看看Oracle的文档上是如何描述这个错误的。

ORA-12053 this is not a valid nested materialized view

Cause: The list of objects in the FROM clause of the definition of this materialized view had some dependencies upon each other.

Action: Refer to the documentation to see which types of nesting are valid.

文档上的描述也是十分笼统的,并没有指出具体问题所在。

接下来,我们通过使用DBMS_MVIEW.EXPLAIN_MVIEW过程来定位错误。

使用EXPLAIN_MVIEW 过程首先要建立MV_CAPABILITIES_TABLE表,建表的脚步是$ORACLE_HOME/rdbms/admin /utlxmv.sql。(EXPLAIN_MVIEW过程是两个过程的重载,一个输出到MV_CAPABILITIES_TABLE表,另一个以PL /SQLVARRAY格式输出,为了简单起见,我们建立MV_CAPABILITIES_TABLE表)。

SQL> @?rdbmsadminutlxmv.sql

表已创建。

下面简单研究一下EXPLAIN_MVIEW过程。

DBMS_MVIEW.EXPLAIN_MVIEW(mv IN VARCHAR2, Statement_id IN VARCHAR2:= NULL);

该过程可以输入已经存在的物化视图名称(或USER_NAME.MV_NAME),也可输入建立物化视图的查询语句。另外一个参数STATEMENT_ID输入一个语句ID,为了标识出表中对应的记录。

SQL> BEGIN
  2  DBMS_MVIEW.EXPLAIN_MVIEW('SELECT CNAME, BNAME, COUNT(*) COUNT, SUM(NUM) SUM_NUM FROM MV_ABC
  3  GROUP BY CNAME, BNAME', 'MV_MV_ABC');
  4  END;
  5  /

PL/SQL 过程已成功完成。

SQL> SELECT CAPABILITY_NAME, RELATED_TEXT, MSGTXT FROM MV_CAPABILITIES_TABLE
  2  WHERE STATEMENT_ID = 'MV_MV_ABC' AND POSSIBLE = 'N' AND CAPABILITY_NAME NOT LIKE '%PCT%';

CAPABILITY_NAME                RELATED_TEXT    MSGTXT
------------------------------ --------------- --------------------------------------------------
REFRESH_FAST_AFTER_ONETAB_DML  SUM_NUM        
使用 SUM(expr) , 未提供 COUNT(expr)
REFRESH_FAST_AFTER_ANY_DML     YANGTK.MV_ABC   mv
日志没有序列号
REFRESH_FAST_AFTER_ANY_DML                    
查看禁用 REFRESH_FAST_AFTER_ONETAB_DML 的原因

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21818314/viewspace-693201/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-06-21

  • 博文量
    49
  • 访问量
    78959