淺析物化檢視與查詢重寫(Enable query rewrite)
查詢重寫是指當對物化檢視的基表進行查詢時,Oracle會自動判斷能否通過查詢物化檢視來得到結果,如果可以,則避免了聚集或連線操作,而直接從已經計算好的物化檢視中讀取資料
通過如下實驗說明,物化檢視給我們帶來的效能提高,以及查詢重寫的好處
1 執行一段普通的連線查詢,並檢視執行計劃以及統計資訊
SQL> alter system flush buffer_cache;
System altered.
SQL> set autotrace traceonly
SQL> select ename,job,dname
2 from emp,dept
3 where emp.deptno=dept.deptno;
14 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 844388907
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 420 | 6 (17)| 00:00:01 |
| 1 | MERGE JOIN | | 14 | 420 | 6 (17)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| DEPT | 4 | 52 | 2 (0)| 00:00:01 |
| 3 | INDEX FULL SCAN | PK_DEPT | 4 | | 1 (0)| 00:00:01 |
|* 4 | SORT JOIN | | 14 | 238 | 4 (25)| 00:00:01 |
| 5 | TABLE ACCESS FULL | EMP | 14 | 238 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")
filter("EMP"."DEPTNO"="DEPT"."DEPTNO")
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
11 consistent gets
9 physical reads
0 redo size
970 bytes sent via SQL*Net to client
524 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
14 rows processed
System altered.
SQL> set autotrace traceonly
SQL> select ename,job,dname
2 from emp,dept
3 where emp.deptno=dept.deptno;
14 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 844388907
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 420 | 6 (17)| 00:00:01 |
| 1 | MERGE JOIN | | 14 | 420 | 6 (17)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| DEPT | 4 | 52 | 2 (0)| 00:00:01 |
| 3 | INDEX FULL SCAN | PK_DEPT | 4 | | 1 (0)| 00:00:01 |
|* 4 | SORT JOIN | | 14 | 238 | 4 (25)| 00:00:01 |
| 5 | TABLE ACCESS FULL | EMP | 14 | 238 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")
filter("EMP"."DEPTNO"="DEPT"."DEPTNO")
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
11 consistent gets
9 physical reads
0 redo size
970 bytes sent via SQL*Net to client
524 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
14 rows processed
物理讀和一致性讀分別為11個 和9個
2 建立以上語句的物化檢視,並檢視通過物化檢視查詢所得到的執行計劃以及統計資訊
CREATE MATERIALIZED VIEW LOG ON emp
WITH ROWID
INCLUDING NEW VALUES;
CREATE MATERIALIZED VIEW LOG ON dept
WITH ROWID
INCLUDING NEW VALUES;
CREATE MATERIALIZED VIEW emp_dept_mv_01
BUILD IMMEDIATE
REFRESH force ON COMMIT
as select ename,job,dname
from emp,dept
where emp.deptno=dept.deptno;
WITH ROWID
INCLUDING NEW VALUES;
CREATE MATERIALIZED VIEW LOG ON dept
WITH ROWID
INCLUDING NEW VALUES;
CREATE MATERIALIZED VIEW emp_dept_mv_01
BUILD IMMEDIATE
REFRESH force ON COMMIT
as select ename,job,dname
from emp,dept
where emp.deptno=dept.deptno;
SQL> select * from emp_dept_mv_01;
14 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 2905768236
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 308 | 3 (0)| 00:00:01 |
| 1 | MAT_VIEW ACCESS FULL| EMP_DEPT_MV_01 | 14 | 308 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
2 physical reads
0 redo size
1079 bytes sent via SQL*Net to client
524 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
14 rows processed
14 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 2905768236
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 308 | 3 (0)| 00:00:01 |
| 1 | MAT_VIEW ACCESS FULL| EMP_DEPT_MV_01 | 14 | 308 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
2 physical reads
0 redo size
1079 bytes sent via SQL*Net to client
524 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
14 rows processed
通過物化檢視的查詢,發現只有4個一致性讀和2個物理讀
至此,說明物化檢視會為系統帶來一定的效能提升
3 將物化檢視設定為enable query rewrite(預設為disable),並執行原查詢語句,檢視執行計劃
SQL> alter MATERIALIZED VIEW EMP_DEPT_MV_01 enable query rewrite;
Materialized view altered.
Materialized view altered.
SQL> show parameter rewrite
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
query_rewrite_enabled string TRUE
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
query_rewrite_enabled string TRUE
SQL> alter system flush buffer_cache;
System altered.
SQL> select ename,job,dname
2 from emp,dept
3 where emp.deptno=dept.deptno;
14 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 1320338361
-----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 308 | 3 (0)| 00:00:01 |
| 1 | MAT_VIEW REWRITE ACCESS FULL| EMP_DEPT_MV_01 | 14 | 308 | 3 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
2 physical reads
0 redo size
1079 bytes sent via SQL*Net to client
524 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
14 rows processed
結果驗證,該語句實際上自動查詢的是與其對應的物化檢視
總結:
物化檢視提高查詢速度,但需要額外的儲存空間
查詢重寫: 無需改變程式碼,只需建立一個查詢重寫的物化檢視即可提高系統效能
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28719055/viewspace-1258720/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle最佳化技術---物化檢視查詢重寫query rewriteOracle
- 【MV】物化檢視查詢重寫
- 物化檢視和query_rewrite_enabled引數配合提高select查詢效能
- 【SQL】Oracle查詢轉換之物化檢視查詢重寫SQLOracle
- Oracle物化檢視2 -- Query Rewrite及引數Oracle
- 隱式轉換影響物化檢視查詢重寫
- 使用物化檢視查詢重寫 優化對於 UNION ALL檢視的CONNECT BY查詢優化
- 淺析query_rewrite_integrity引數
- 12c 查詢重寫物化檢視 - DBMS_ADVISOR.TUNE_MVIEW的使用View
- DB2資料庫物化檢視:MQT物化查詢表的使用DB2資料庫MQQT
- 淺析 Flutter 與 iOS 的檢視橋樑FlutteriOS
- 查詢重寫
- 淺析為何Oracle物化檢視對distinct, group by不支援快速重新整理Oracle
- 包含複雜查詢的快速重新整理的物化檢視
- 通過dbms_mviewdbms_mview.explain_rewrite檢測為什麼不使用查詢重寫的問題ViewAI
- 物化檢視prebuilt和線上重定義UI
- 物化檢視的快速重新整理測試與物化檢視日誌
- 查詢real-time apply、real-time query的檢視APP
- 【ORACLE】常用物化檢視相關後設資料查詢語句Oracle
- 物化檢視妙用__表同步使用物化檢視方法
- 【物化檢視】幾種物化檢視日誌分析
- .htaccess技巧: URL重寫(Rewrite)與重定向(Redirect)
- 【Flashback】使用檢視快速獲得Flashback Query閃回查詢資料
- 【物化檢視】根據物化檢視日誌快速重新整理物化檢視的過程
- 資料庫的查詢與檢視資料庫
- 淺析前端框架如何更新檢視前端框架
- Rewrite重寫教程前言
- oracle物化檢視Oracle
- Nginx location匹配及Rewrite重寫Nginx
- 物化檢視詳解
- oracle 建立物化檢視Oracle
- Oracle 物化檢視建立Oracle
- materialized view (物化檢視)ZedView
- 物化檢視 on commitMIT
- 【MV】group by查詢子句是否包含count(*)對物化檢視重新整理的影響
- 檢視查詢報錯
- 【MySQL】檢視&子查詢MySql
- oracle 常用查詢檢視Oracle