《Materialized View 加分項目 Query rewrite》

摘要:《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