2023年4月25日 星期二

20. 查看及閱讀執行計畫

查看一句 SQL 的執行計畫除了可以透過 SQL Developer 等工具來查看之外,單純使用 SQL*PLUS 有以下的方式可以查看 :


  • set autotrace on(traceonly) [explain]

於 SQL*PLUS 中設置 autotrace 參數便可查閱 SQL 的執行計畫,使用 set autotrace on 語法可查看 SQL 的 Execution Plan 與統計資訊;若將 on 改為 traceonly 參數,則 SQL 指令只顯示出 Execution Plan 與統計資訊,不會實際執行 SQL 語法,亦不會回傳執行結果,當我們在調校一段 SQL 時,最常使用 set autotrace traceonly 參數來檢視 SQL 的執行計畫;最後在 set autotrace 語法加上 explain 關鍵字,表示只顯示出此段 SQL 的 Execution Plan ,但不顯示統計資訊。例如 :


若使用 set autotrace traceonly explain 就只會顯示出執行計畫而已 :


  • 使用EXPLAIN PLAN FOR語法

使用 EXPLAIN PLAN FOR 只會將 SQL 的執行計畫寫入系統的 PLAN TABLE 中,不會真正去執行 SQL ,透過 DBMS_XPLAN.DISPLAY 便可以從 PLAN TABLE 將執行計畫讀取出來,例如 :


Explained 之後便可以將執行計畫讀取出來 :


  • 使用 DBMS_XPLAN.DISPLAY_CURSOR

如果已經知道某句 SQL 的 SQL_ID ,並且此句 SQL 還存在 SGA 裡面,那麼就可以用 dbms_xplan.display_cursor(<sql_id>) 來將此 SQL 的執行計畫顯示出來,例如 :


Execution Plan 為一個階層式的樹狀結構,閱讀 Execution Plan 的方式為從裡至外,或是從樹狀結構當中由下至上來閱讀,例如一段 SQL 所產生的  Execution Plan 如下 :

SQL> select e.empno,e.ename,d.dname from emp e,dept d

 where e.deptno=d.deptno and e.deptno=10;


依照由裡至外的規則進行解析,首先最裡層為 Id 3 與 Id 5 ,因此最先執行的是透過 EMP_DEPTNO_IX 與 PK_DEP 將 EMP 與 DEPT 的資料篩選出來,篩選出來後,再將兩邊的 row set 進行 Id 1 的操作,也就是使用 NESTED LOOP 進行 JOIN ,最終導出結果。


上述的 Execution Plan 也可以使用樹狀結構表示如下 :


依照樹狀結構由下至上進行解析,最底層 Id 3 與 Id 5 最先被執行,透過PK_DEP 與 EMP_DEPTNO_IX 先找到 where 條件的資料,然後再以 ROWID 回表反查 DEPT 與 EMP 兩個 Table 的所有資料,最終於 Id 1 使用NESTED LOOP 將資料進行 join ,回傳出最終結果。


由於我們不是常常都有 SQL 相關的工具可以使用,所以學習如何使用 SQL*PLUS 來查看執行計畫也是很重要的。


沒有留言:

張貼留言