當前位置:
首頁 >
利用DBMS_ADVISOR.TUNE_MVIEW包生成物化视图创建语句
發布時間:2023/12/13
33
豆豆
生活随笔
收集整理的這篇文章主要介紹了
利用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
總結
以上是生活随笔為你收集整理的利用DBMS_ADVISOR.TUNE_MVIEW包生成物化视图创建语句的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10万级两厢轿车彻底无敌手!比亚迪海豚7
- 下一篇: 保时捷被甩几条街!马斯克:2021年特斯