利用DBMS_ADVISOR.TUNE_MVIEW包生成物化视图创建语句

不少人大概和我一样在创建物化视图的时候会犯头痛,怎样合理的改写SQL语句以及添加物化视图日志需要经过慎重精密的考虑。有了DBMS_ADVISOR.TUNE_MVIEW存储过程这个帮手后,极大地方便了DBA或应用设计人员创建和优化物化视图。该TUNE_MVIEW存储过程可以做到优化物化视图中的查询定义,修正物化视图日志的问题,此外它还能为原先不能refresh fast的物化视图提出建议以使得其可以快速刷新。
SQL> CREATE MATERIALIZED VIEW MACLEAN.STRMTS 2  USING INDEX REFRESH FAST ON DEMAND 3  ENABLE QUERY REWRITE 4  AS select distinct t1,t2 from MACLEAN.strb;
AS select distinct t1,t2 from MACLEAN.strb*
ERROR at line 4:
ORA-12015: cannot create a fast refresh materialized view from a complex query/* 以select distinct查询语句为例,该语句本身不符合refresh fast的标准,但TUNE_MVIEW存储过程可以将这种查询变形使得满足快速刷新的条件 */--    PROCEDURE DBMS_ADVISOR.TUNE_MVIEW
--    PURPOSE: Tune a Create Materialized View statement to
--    ADVISOR SUPPORT:        SQL Access Advisor
--    PARAMETERS:
--         TASK_NAME
--            The user can pass in a user-defined task name or
--            get a returned system-generated task name.
--         MV_CREATE_STMT
--            CREATE MATERIALIZED VIEW SQL statement to tuneprocedure tune_mview (task_name      in out varchar2,mv_create_stmt in     clob);SQL> set serveroutput on;SQL> declare2    tn varchar2(200);3  begin4    DBMS_ADVISOR.TUNE_MVIEW(tn,5                            mv_create_stmt => 'CREATE MATERIALIZED VIEW MACLEAN.STRMTS 6                     USING INDEX REFRESH FAST ON DEMAND 7                     ENABLE QUERY REWRITE 8                     AS select distinct t1,t2 from MACLEAN.strb');9    dbms_output.put_line(tn);10  end;11  /
TASK_484PL/SQL procedure successfully completed.SQL> select script_type,statement2    from dba_tune_mview3   where task_name = 'TASK_484'4   order by action_id;SCRIPT_TYPE    STATEMENTIMPLEMENTATION CREATE MATERIALIZED VIEW LOG ON "MACLEAN"."STRB" WITH ROWID, SEQUENCE ("T1","T2")  INCLUDING NEW VALUES
IMPLEMENTATION ALTER MATERIALIZED VIEW LOG FORCE ON "MACLEAN"."STRB" ADD ROWID, SEQUENCE ("T1","T2")  INCLUDING NEW VALUES
IMPLEMENTATION CREATE MATERIALIZED VIEW MACLEAN.STRMTS USING INDEX  REFRESH FAST WITH ROWID ENABLE QUERY REWRITE AS SELECT MACLEAN.STRB.T2 C1, MACLEAN.STRB.T1 C2, COUNT(*) M1 FROM MACLEAN.STRB GROUP BY MACLEAN.STRB.T2, MACLEAN.STRB.T1
UNDO           DROP MATERIALIZED VIEW MACLEAN.STRMTS/* 可以看到TUNE_MVIEW存储过程将原查询变形为SELECT...GROUP BY的形式 */SQL> CREATE MATERIALIZED VIEW LOG ON "MACLEAN"."STRB" WITH ROWID, SEQUENCE ("T1","T2")  INCLUDING NEW VALUES;
Materialized view log created.SQL> ALTER MATERIALIZED VIEW LOG FORCE ON "MACLEAN"."STRB" ADD ROWID, SEQUENCE ("T1","T2")  INCLUDING NEW VALUES;
Materialized view log altered.SQL> CREATE MATERIALIZED VIEW MACLEAN.STRMTS USING INDEX  REFRESH FAST WITH ROWID 
ENABLE QUERY REWRITE AS SELECT MACLEAN.STRB.T2 C1, MACLEAN.STRB.T1 C2, COUNT(*) M1 
FROM MACLEAN.STRB GROUP BY MACLEAN.STRB.T2, MACLEAN.STRB.T1;Materialized view created.
针对那些确实无法快速刷新的复杂查询,TUNE_MVIEW过程也可能给出将一个查询分解为多个物化视图达到快速刷新和查询重写的目的:
SQL> CREATE MATERIALIZED VIEW MACLEAN.STRMTD 2  USING INDEX REFRESH FAST3  ON DEMAND ENABLE QUERY REWRITE AS 4  select t2,t3,count(*) from strc group by t2,t3 5  union all6  select t2,t3,count(*) from strd group by t2,t3;
select t2,t3,count(*) from strd group by t2,t3*
ERROR at line 6:
ORA-12015: cannot create a fast refresh materialized view from a complex querySQL> set serveroutput on;
SQL> declare2    tn varchar2(200);3  begin4    DBMS_ADVISOR.TUNE_MVIEW(tn,5                            mv_create_stmt => 'CREATE MATERIALIZED VIEW MACLEAN.STRMTC6                                                   USING INDEX REFRESH FAST7                                                   ON DEMAND ENABLE QUERY REWRITE AS8                                                   select t2,t3,count(*) from strc group by t2,t39                                                   union all10                                                  select t2,t3,count(*) from strd group by t2,t3');11    dbms_output.put_line(tn);12  end;13  /
TASK_547PL/SQL procedure successfully completed.SQL> select statement2    from dba_tune_mview3   where task_name = 'TASK_547'4   order by action_id;CREATE MATERIALIZED VIEW LOG ON "MACLEAN"."STRC" WITH ROWID, SEQUENCE ("T2","T3")  INCLUDING NEW VALUES
ALTER MATERIALIZED VIEW LOG FORCE ON "MACLEAN"."STRC" ADD ROWID, SEQUENCE ("T2","T3")  INCLUDING NEW VALUES
CREATE MATERIALIZED VIEW LOG ON "MACLEAN"."STRD" WITH ROWID, SEQUENCE ("T2","T3")  INCLUDING NEW VALUES
ALTER MATERIALIZED VIEW LOG FORCE ON "MACLEAN"."STRD" ADD ROWID, SEQUENCE ("T2","T3")  INCLUDING NEW VALUES
CREATE MATERIALIZED VIEW MACLEAN.STRMTC$SUB1 USING INDEX  REFRESH FAST WITH ROWID ON COMMIT ENABLE QUERY REWRITE AS SELECT MACLEAN.STRC.T3 C1, MACLEAN.STRC.T2 C2, COUNT(*) M1 FROM MACLEAN.STRC GROUP BY MACLEAN.STRC.T3, MACLEAN.STRC.T2
DROP MATERIALIZED VIEW MACLEAN.STRMTC$SUB1
CREATE MATERIALIZED VIEW MACLEAN.STRMTC$SUB2 USING INDEX  REFRESH FAST WITH ROWID ON COMMIT ENABLE QUERY REWRITE AS SELECT MACLEAN.STRD.T3 C1, MACLEAN.STRD.T2 C2, COUNT(*) M1 FROM MACLEAN.STRD GROUP BY MACLEAN.STRD.T3, MACLEAN.STRD.T2
DROP MATERIALIZED VIEW MACLEAN.STRMTC$SUB2
CREATE MATERIALIZED VIEW MACLEAN.STRMTC USING INDEX  REFRESH FORCE WITH ROWID ENABLE QUERY REWRITE AS  (SELECT "STRMTC$SUB1"."C2" "T2","STRMTC$SUB1"."C1" "T3","STRMTC$SUB1"."M1" "COUNT(*)" FROM "MACLEAN"."STRMTC$SUB1" "STRMTC$SUB1") UNION ALL  (SELECT "STRMTC$SUB2"."C2" "T2","STRMTC$SUB2"."C1" "T3","STRMTC$SUB2"."M1" "COUNT(*)" FROM "MACLEAN"."STRMTC$SUB2" "STRMTC$SUB2")
DROP MATERIALIZED VIEW MACLEAN.STRMTC
DBMS_ADVANCED_REWRITE.BUILD_SAFE_REWRITE_EQUIVALENCE ('MACLEAN.STRMTC$RWEQ','select t2,t3,count(*) from strc group by t2,t3union allselect t2,t3,count(*) from strd group by t2,t3',' (SELECT "STRMTC$SUB1"."C2" "T2","STRMTC$SUB1"."C1" "T3","STRMTC$SUB1"."M1" "COUNT(*)" FROM "MACLEAN"."STRMTC$SUB1" "STRMTC$SUB1") UNION ALL  (SELECT "STRMTC$SUB2"."C2" "T2","STRMTC$SUB2"."C1" "T3","STRMTC$SUB2"."M1" "COUNT(*)" FROM "MACLEAN"."STRMTC$SUB2" "STRMTC$SUB2")',600916906)DBMS_ADVANCED_REWRITE.DROP_REWRITE_EQUIVALENCE('MACLEAN.STRMTC$RWEQ')SQL> CREATE MATERIALIZED VIEW LOG ON "MACLEAN"."STRC" WITH ROWID, SEQUENCE ("T2","T3")  INCLUDING NEW VALUES;Materialized view log created.SQL> ALTER MATERIALIZED VIEW LOG FORCE ON "MACLEAN"."STRC" ADD ROWID, SEQUENCE ("T2","T3")  INCLUDING NEW VALUES;Materialized view log altered.SQL> CREATE MATERIALIZED VIEW LOG ON "MACLEAN"."STRD" WITH ROWID, SEQUENCE ("T2","T3")  INCLUDING NEW VALUES;Materialized view log created.SQL> ALTER MATERIALIZED VIEW LOG FORCE ON "MACLEAN"."STRD" ADD ROWID, SEQUENCE ("T2","T3")  INCLUDING NEW VALUES;Materialized view log altered.SQL> CREATE MATERIALIZED VIEW MACLEAN.STRMTC$SUB1 USING INDEX  REFRESH FAST WITH ROWID 
ON COMMIT ENABLE QUERY REWRITE AS SELECT MACLEAN.STRC.T3 C1, MACLEAN.STRC.T2 C2, COUNT(*) M1 
FROM MACLEAN.STRC GROUP BY MACLEAN.STRC.T3, MACLEAN.STRC.T2;Materialized view created.SQL> CREATE MATERIALIZED VIEW MACLEAN.STRMTC$SUB2 USING INDEX  REFRESH FAST WITH ROWID 
ON COMMIT ENABLE QUERY REWRITE AS SELECT MACLEAN.STRD.T3 C1, MACLEAN.STRD.T2 C2, COUNT(*) M1 
FROM MACLEAN.STRD GROUP BY MACLEAN.STRD.T3, MACLEAN.STRD.T2;Materialized view created.SQL> CREATE MATERIALIZED VIEW MACLEAN.STRMTC USING INDEX  REFRESH FORCE WITH ROWID 
ENABLE QUERY REWRITE AS  
(SELECT "STRMTC$SUB1"."C2" "T2","STRMTC$SUB1"."C1" "T3","STRMTC$SUB1"."M1" "COUNT(*)" FROM "MACLEAN"."STRMTC$SUB1" "STRMTC$SUB1") 
UNION ALL  
(SELECT "STRMTC$SUB2"."C2" "T2","STRMTC$SUB2"."C1" "T3","STRMTC$SUB2"."M1" "COUNT(*)" FROM "MACLEAN"."STRMTC$SUB2" "STRMTC$SUB2");Materialized view created.declarev_state varchar2(2000);
beginselect statementinto v_statefrom dba_tune_mviewwhere task_name = 'TASK_547'and action_id = 15;v_state := 'begin ' || v_state || '; end;';dbms_output.put_line(v_state);execute immediate v_state;
end;
PL/SQL procedure successfully completed.SQL> set linesize 200 pagesize 1400;
SQL> select t2,t3,count(*) from strc group by t2,t3 2  union all3  select t2,t3,count(*) from strd group by t2,t3;
no rows selected---------------------------------------------------------------------------------------------
| Id  | Operation                     | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |             |     2 |    74 |     4  (50)| 00:00:01 |
|   1 |  UNION-ALL                    |             |       |       |            |          |
|   2 |   MAT_VIEW REWRITE ACCESS FULL| STRMTC$SUB1 |     1 |    37 |     2   (0)| 00:00:01 |
|   3 |   MAT_VIEW REWRITE ACCESS FULL| STRMTC$SUB2 |     1 |    37 |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------/* 可以看到查询成功被rewrite为对2个物化视图的扫描 */

转载于:https://www.cnblogs.com/macleanoracle/archive/2013/03/19/2967682.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle批量update数据_东方国信大数据面试真题

东方国信学长1Hadoop工程师笔试题(金融事业部)1)技术基础题(共十题,每题5分)(1)列举在Linux系统下可以在看系统各项性能的工具(区分CPU、内存、硬盘、网络等)…

android 搜狗地图包名,搜狗地图(免费语音导航)

权限信息 读取您的USB存储设备中的内容 android.permission.REQUEST_INSTALL_PACKAComGES android.permission.RECEIVE_USER_PRESENT 完全的网络访问权限 android.permission.ACCESS_BACKGROUND_LOCATION 大致位置(基于网络) 精确位置(基于GPS和网络) 查看网络连接 修改或删除您…

eclipse定制化配置调优、初始化配置指南、可以解决启动慢等问题

配置eclipse的jvm参数 打开eclipse根目录下的eclipse.ini在最后面加上如下的jvm参数 -Xms400m -Xmx1400m -XX:NewSize128m -XX:MaxNewSize512m -XX:PermSize96m -XX:MaxPermSize128m -server -XX:CompileThreshold100 -XX:UseParNewGC -XX:UseConcMarkSweepGC -XX:CMSInitiatin…

SEC SOC Test Board 在WIN 7下的安装

首先找到“设备和打印机”点击打开 如果你插上了USB线,会看到,安装不成功时会有个“!” 双击它,出现 点击“属性”,出现 点击“改变设置”,出现 点击“更新驱动程序”,出现 点击进去&#xff0c…

ora-00054:resource busy and acquire with nowait specified解决方法

当某个数据库用户在数据库中插入、更新、删除一个表的数据,或者增加一个表的主键时或者表的索引时,常常会出现ora-00054:resource busy and acquire with nowait specified这样的错误。主要是因为有事务正在执行(或者事务已经被锁&#xff09…

吴枫 python小课怎么样_编程中,有哪些好的习惯从一开始就值得坚持?

电影《喜剧之王》里,周星驰饰演的尹天仇,是一个渴望成为真正的演员,却不断沦为落魄跑龙套的小人物。即便如此,他对演戏的态度始终认真而可敬。他每天不但锲而不舍寻找演戏机会,还在街坊福利社开了个戏剧训练班&#xf…

android常用控件实验报告,ui设计实验报告.doc

ui设计实验报告ui设计实验报告篇一:UI设计实验报告实验项目四:UI设计一、 实验目的和要求1、熟练运用Eclipse软件中的swing设计。2、掌握UI编写的软件。3、能都熟练的进行操作,理解每个按钮的含义并懂得修改参数。4、理解其幕后的Java代码。二…

星期三,今天早上上了四节JS课程,下午听健康讲座,晚上装系统

星期三,今天早上上了四节JS课程,下午听健康讲座,晚上装系统。我想说装系统是最浪费时间的,以前大一的时候,有一段时间喜欢上装系统,我去有时候一个系统装了两三天,因为有很多问题。 ~ 后面就不研…

在欲而无欲,居尘不染尘

僧人竺法深在东晋简文帝处作客,刘尹问:「法师是学道之人,为什么要来官宦之门中走动?」竺法深回答说:「你自见这是朱门高第,在贫道眼里,同走在茅屋草舍间并无任何差别。」   法师的境界&#x…

设置width不生效_关于padding被计算在width中问题——box-sizing相关

前一阵子遇到一个小问题,在同样的样式(主要是宽高边距之类的)条件下,DIV在移动端和PC端的宽度不一样,排除了绝大多数样式的问题,但是有个比较陌生,就是box-sizing,其实经常看到&…

C# 遍历List 并删除某个元素

1、我们选择用for循环, for(int i0;i { if(list[i]) { list.RemoveAt(i); } } 如果这样循环,肯定不对, {A B C D E F G H} 假设当前遍历到D(i3),移除,接着遍历i4(F), 此时跳过了E(i3&a…

android studio不能更新代码,解决Android Studio 和 Android SDK Manager 无法在线更新的问题....

升级时提示 Connection failed. Please check your network connection and try again修改安装目录下bin\studio.exe.vmoptions文件,如E:\Android\android-studio\bin\studio.exe.vmoptions添加内容:-Djava.net.preferIPv4Stacktrue-Didea.updates.urlhttp://dl.google.com/and…

我的Python成长之路---第六天---Python基础(19)---2016年2月20日(晴)

shelve模块shelve模块是pickle模块的扩展,可以通过key,value的方式访问pickle持久化保存的数据持久化保存:12345678910111213import shelvesw shelve.open(shelve_test.pkl) # 创建shelve对象name [13, 14, 145, 6] # 创建一个列表dist_tes…

NH3.X与2.X使用上的一些区别

NH用了很长时间一直都是用2.X版本&#xff0c;今天体验了一下3.3。记录一下两者使用上的一些区别。 一、代理 //2.x 写法 <property nameproxyfactory.factory_class>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>//3.X…

(转)DirectShow9在VS2005或vc6.0下编译出现问题的解决方法

1。我用的版本是DirectX9.0b &#xff0c;没有安装&#xff0c;直接解压后放到一个文件夹里用 2。我按照以下的步骤操作成功。明天试着做个播放器。 VFW(Video for Windows)是Microsoft推出的关于数字视频的一个软件开发包;DirectShow是微软公司在VFW的基础上推出的新一代基于C…

apache 设置404 页面_SpringBoot自定义错误页面

SpringBoot请求错误如404可能看到如下页面&#xff1a;有时可能需要自定义错误页面针对不同的http.status,如404/400。【1】解决方法① 注册错误页面如下所示&#xff1a;Componentpublic class ErrorPageConfig implements ErrorPageRegistrar { Override public void r…

ios android cpu占用率,iPhone-iOS-从应用程序获取CPU使用率

iPhone-iOS-从应用程序获取CPU使用率有谁知道如何获取应用程序的CPU使用率&#xff1f; 绝对有可能&#xff0c;因为应用商店中有一些可以显示它的应用程序(活动监视器触摸)。3个解决方案74 votes更新。 这段代码为我工作&#xff1a;更新2。thread_list泄漏&#xff0c;因此添…

Java 编程:如何提高性能?(简单总结篇)

2019独角兽企业重金招聘Python工程师标准>>> 开发者在编程中除了要有编程规范&#xff0c;还要注意性能&#xff0c;在 Java 编程中有什么提高性能的好办法呢&#xff1f; 本文转自国内 ITOM 行业领军企业 OneAPM Cloud Insight&#xff08;一款能够优雅监控多种操作…

ActiviteX 服务控件

ActiviteX 控件和ActiviteX 服务(dll ,exe) ActiveX 控件是由软件提供商开发的可重用的软件组件 我们可以使用vb自己编写控件,他们三个都是对过程 ,类,等功能块的封装. 区别就是在vb中使用ActiviteX控件的时候要先实例化..比如画出控件. 而使用ActiviteX时是先注册.然后再引用中…

mysql没有开启binlog能恢复数据吗_神了!一个妹子 rm -rf 把公司整个数据库删没了......

经历了两天不懈努力&#xff0c;终于恢复了一次误操作删除的生产服务器数据。对本次事故过程和解决办法记录在此&#xff0c;警醒自己&#xff0c;也提示别人莫犯此错。也希望遇到问题的朋友能找到一丝灵感解决问题。01事故背景安排一个妹子在一台生产服务器上安装 Oracle&…