摘要:《Materialized View 加分項目 Query rewrite》
什麼是 Query rewrite? 顧名思義就是"重寫 Query"嘛!(爛透了~~)
Query rewrite process 請參考 oracle 文件 (文後網址)
簡單的說,client 執行 SQL 送到 oracle database server,
server會依收集的statistics決定需不需要 rewrite client 送出的 SQL,
目的是透過 mview 篩選過的資料,至較小的Table中取得需要的資料,以加快Query的速度。
聽起來很神奇,姑且相信 oracle 會找到最好的 Query 吧!
要開啟 Query rewrite 的功能,依文件內容要完成下列四個設定:
1. create materialized view 時要 enable query rewrite
(也可以事後用 alter materialized view MVIEW enable query rewrite 開啟)
2. parameter QUERY_REWRITE_ENABLED 要開啟 (可以 By session or system)
3. optimizer_mode 必須是 CBO (cost base optimizer),或是 CHOOSE 並且收集 statistics
(※是收集 mview 的來源資料表,不是 mview 的)
(optimizer_mode 如果是CHOOSE,oracle 會判斷有沒有收集 statistics,如果有就會跑 CBO,反之RBO (rule base optimizer))
4. OPTIMIZER_FEATURES_ENABLE 版本要大於 8.1.6 才有支援
實作:
【沒有 Query rewrite 的執行計劃】
SQL> set autotrace off
SQL> show parameter query_re
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
query_rewrite_enabled string TRUE
query_rewrite_integrity string enforced
-- 先將 query_rewrite_enabled 關閉
SQL> alter session set query_rewrite_enabled=false;
已更改階段作業.
目前歷時: 00:00:00.00
SQL> set autotrace traceonly
SQL> select * from mview_source where in_date is null;
已選取 15271 個資料列.
目前歷時: 00:01:04.05
執行計畫
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=12821 Card=15271 Byt
es=1817249)
1 0 TABLE ACCESS (FULL) OF 'MVIEW_SOURCE' (Cost=12821 Card=15271 By
tes=1817249)
統計值
----------------------------------------------------------
0 recursive calls
0 db block gets
84978 consistent gets
84259 physical reads
0 redo size
910257 bytes sent via SQL*Net to client
11701 bytes received via SQL*Net from client
1020 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
15271 rows processed
【Query rewrite 的執行計劃】
-- 清空 buffer cache
SQL> alter system set events='immediate trace name flush_cache';
已更改系統.
目前歷時: 00:00:00.06
SQL> set autotrace traceonly
SQL> select *from mview_source where in_date is null;
已選取 15271 個資料列.
目前歷時: 00:00:01.04
執行計畫
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=75 Card=19750 Bytes=
2804500)
1 0 TABLE ACCESS (FULL) OF 'MVIEW_SOURCE_MV' (Cost=75 Card=19750 By
tes=2804500)
統計值
----------------------------------------------------------
0 recursive calls
0 db block gets
1475 consistent gets
486 physical reads
0 redo size
910228 bytes sent via SQL*Net to client
11701 bytes received via SQL*Net from client
1020 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
15271 rows processed
參考文件:
Query Rewrite
http://download.oracle.com/docs/cd/B10501_01/server.920/a96520/qr.htm#37883