Oracle with as + /* materialize*/ 優化

with as

概述:

  • WITH AS: 就是將一個子查詢部分獨立出來,有時候爲了提高 sql 語句的可讀性,有時候爲了提高 sql 語句性能

使用場景:

  • 當有多個相似子查詢的時候,用 with as 寫公共部分。
  • 因爲子查詢結果在內存臨時表中,故執行效率較高(臨時表在會話結束後自動被 PGA 清除)

注意情況:

  • 一般來說,如果 with as 短語定義的表名被調用 2 次及以上,則 CBO 優化器會自動把 with as 短語所獲取的數據放入臨時表中(對應執行計劃中的 SYS_TEMP_XXX)。
  • 如果只是被調用 1 次,則不會。

with as + /* materialize*/ 優化

hint 關鍵字 描述
/*+ materialize*/ 會強制性要求 with as 中的結果轉換爲 臨時表
/*+ inline*/ 與上相反,不轉換

實例1:當 with as 短語定義的表名被使用 1 次時

WITH t_emp AS
 (SELECT /*+ materialize*/ e.empno, e.ename, e.sal
    FROM scott.emp e
   WHERE e.sal > (SELECT AVG(e_1.sal) FROM scott.emp e_1))
SELECT * FROM t_emp;

執行計劃:
在這裏插入圖片描述

實例1:當 with as 短語定義的表名被使用 2 次及以上時

WITH t_emp AS
 (SELECT /*+ materialize*/ e.empno, e.ename, e.sal
    FROM scott.emp e
   WHERE e.sal > (SELECT AVG(e_1.sal) FROM scott.emp e_1))
SELECT * FROM t_emp t WHERE t.empno = '7566'
UNION ALL
SELECT * FROM t_emp t WHERE t.empno = '7698';

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章