WITH AS and materialize hints
加--+materialize提示,Oracle會先將查詢結果寫入一張臨時表,然再查詢臨時表。
WITH AS: 就是將一個子查詢部分獨立出來,有時候是為了提高SQL語句的可讀性,有時候是為了提高SQL語句效能。
如果一個SQL語句中,某個表會被訪問多次,而且每次訪問的限制條件一樣的話,就可以使用with as來提高效能。
注意:如果 with as 短語沒有被呼叫2次以上,CBO就不會將 with as短語獲取的資料放入temp表,如果想要將資料放入temp表需要使用materialize hint
如果 with as 短語被呼叫了2次以上,CBO會自動將 with as 短語的資料放入一個臨時表,這個時候不用寫materialize hint
舉個例子(本例基於Scott使用者)
SQL> explain plan for with a as (select /*+ materialize */ ename,job,deptno from emp where sal>(select avg(sal) from emp)) select * from a ;
Explained.
SQL> select * from table(dbms_xplan.display);
去掉 /*+ materialize */ ,由於只訪問了一次a,所以CBO不會將a的查詢結果生成一個臨時表
SQL> explain plan for with a as (select ename,job,deptno from emp where sal>(select avg(sal) from emp)) select * from a ;
Explained.
SQL> select * from table(dbms_xplan.display);
如上:WITH AS 語句呼叫一次 使用多次需要寫hints。
繼續測試:
SQL> explain plan for with a as (select ename,job,deptno from emp where sal>(select avg(sal) from emp)) select * from a union all select * from a;
Explained.
SQL> select * from table(dbms_xplan.display);
充分證明 :
1.當with as 語句沒有被呼叫2次以上時,如果需要訪問多次,那麼需要加hints /*+ materialize */
2.如果with as 語句被呼叫2次以上時,自動會將 with as 短語的資料放入一個臨時表,這個時候不用寫materialize hint.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25583515/viewspace-2871458/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Using hints for PostgresqlSQL
- 【譯】Resource Hints
- Materialize快速入門教程
- 利用hints控制outline
- Extended Window Manager Hints(1)
- 淺談在 Laravel 中使用 MaterializeLaravel
- Pycharm,Python 3 與 Type HintsPyCharmPython
- Python -型別提示 Type HintsPython型別
- [20221130]with+materialize會產生日誌嗎.txt
- Python Type Hints 從入門到實踐Python
- 微信授權報code been used, hints: [ req_id: XYv1Ha07042046 ]