轉載:https://www.cnblogs.com/Dreamer-1/p/6076440.html
一:什么是Oracle執行計划?
執行計划是一條查詢語句在Oracle中的執行過程或訪問路徑的描述
二:怎樣查看Oracle執行計划?
因為我一直用的PLSQL遠程連接的公司數據庫,所以這里以PLSQL為例:
①:配置執行計划需要顯示的項:
工具 —> 首選項 —> 窗口類型 —> 計划窗口 —> 根據需要配置要顯示在執行計划中的列
執行計划的常用列字段解釋:
基數(Rows):Oracle估計的當前操作的返回結果集行數
字節(Bytes):執行該步驟后返回的字節數
耗費(COST)、CPU耗費:Oracle估計的該步驟的執行成本,用於說明SQL執行的代價,理論上越小越好(該值可能與實際有出入)
時間(Time):Oracle估計的當前操作所需的時間
②:打開執行計划:
在SQL窗口執行完一條select語句后按 F5 即可查看剛剛執行的這條查詢語句的執行計划
注:在PLSQL中使用SQL命令查看執行計划的話,某些SQL*PLUS命令PLSQL無法支持,比如SET AUTOTRACE ON
三:看懂Oracle執行計划
①:執行順序:
根據Operation縮進來判斷,縮進最多的最先執行;(縮進相同時,最上面的最先執行)
例:上圖中 INDEX RANGE SCAN 和 INDEX UNIQUE SCAN 兩個動作縮進最多,最上面的 INDEX RANGE SCAN 先執行;
同一級如果某個動作沒有子ID就最先執行
同一級的動作執行時遵循最上最右先執行的原則
例:上圖中 TABLE ACCESS BY GLOBAL INDEX ROWID 和 TABLE ACCESS BY INDEX ROWID 兩個動作縮進都在同一級,則位於上面的 TABLE ACCESS BY GLOBAL INDEX ROWID 這個動作先執行;這個動作又包含一個子動作 INDEX RANGE SCAN,則位於右邊的子動作 INDEX RANGE SCAN 先執行;
圖示中的SQL執行順序即為:
INDEX RANGE SCAN —> TABLE ACCESS BY GLOBAL INDEX ROWID —> INDEX UNIQUE SCAN —> TABLE ACCESS BY INDEX ROWID —> NESTED LOOPS OUTER —> SORT GROUP BY —> SELECT STATEMENT, GOAL = ALL_ROWS
( 注:PLSQL提供了查看執行順序的功能按鈕(上圖中的紅框部分) )




