參考文檔:https://www.cnblogs.com/yhoralce/p/7735890.html
一、定義
執行計划是一條查詢語句在Oracle中的執行過程或訪問路徑的描述,注意,是查詢語句。
二、查看執行計划
1)打開PL/SQL數據庫管理工具;
2)在SQL窗口選中一條 SELECT 語句后,或者選中Tools > Explain Plan,或者按 F5 即可查看剛剛執行的這條查詢語句的執行計划;
3)打開執行計划后,可以點擊配置按鈕進行顯示配置。如圖
三、執行計划分析
1)執行順序
根據下圖中description列的縮進來判斷,縮進最多的最先執行,縮進相同時,最上面的最先執行,可以通過點擊圖中箭頭,查看執行順序
說明:
表訪問方式
表訪問的幾種方式:(非全部)
- TABLE ACCESS FULL(全表掃描)
- TABLE ACCESS BY INDEX ROWID(通過ROWID的表存取)
- INDEX FULL SCAN(索引掃描)
如果sql關聯的數據表數據量較大,使用全表掃描會影響交易性能,需要增加索引;
(1) TABLE ACCESS FULL(全表掃描):
Oracle會讀取表中所有的行,並檢查每一行是否滿足SQL語句中的 Where 限制條件;
全表掃描時可以使用多塊讀(即一次I/O讀取多塊數據塊)操作,提升吞吐量;
使用建議:數據量太大的表不建議使用全表掃描,除非本身需要取出的數據較多,占到表數據總量的 5% ~ 10% 或以上
(2) TABLE ACCESS BY ROWID(通過ROWID的表存取) :
行的ROWID指出了該行所在的數據文件、數據塊以及行在該塊中的位置,所以通過ROWID可以快速定位到目標數據上,這也是Oracle中存取單行數據最快的方法;
(3) INDEX FULL SCAN(索引掃描):
索引掃描分五種:
- INDEX UNIQUE SCAN(索引唯一掃描)
- INDEX RANGE SCAN(索引范圍掃描)
- INDEX FULL SCAN(索引全掃描)
- INDEX FAST FULL SCAN(索引快速掃描)
- INDEX SKIP SCAN(索引跳躍掃描)
a) INDEX UNIQUE SCAN(索引唯一掃描):
針對唯一性索引(UNIQUE INDEX)的掃描,每次至多只返回一條記錄;
表中某字段存在 UNIQUE、PRIMARY KEY 約束時,Oracle常實現唯一性掃描;
b) INDEX RANGE SCAN(索引范圍掃描):
使用一個索引存取多行數據;
發生索引范圍掃描的三種情況:
- 在唯一索引列上使用了范圍操作符(如:> < <> >= <= between)
- 在組合索引上,只使用部分列進行查詢(查詢時必須包含前導列,否則會走全表掃描)
- 對非唯一索引列上進行的任何查詢
c) INDEX FULL SCAN(索引全掃描):
進行全索引掃描時,查詢出的數據都必須從索引中可以直接得到(注意全索引掃描只有在CBO模式下才有效)
d) INDEX FAST FULL SCAN(索引快速掃描):
掃描索引中的所有的數據塊,與 INDEX FULL SCAN 類似,但是一個顯著的區別是它不對查詢出的數據進行排序(即數據不是以排序順序被返回)
e) INDEX SKIP SCAN(索引跳躍掃描):
Oracle 9i后提供,有時候復合索引的前導列(索引包含的第一列)沒有在查詢語句中出現,oralce也會使用該復合索引,這時候就使用的INDEX SKIP SCAN;
表連接方式
表(row source)之間的連接順序對於查詢效率有很大的影響,對首先存取的表(驅動表)先應用某些限制條件(Where過濾條件)以得到一個較小的row source,可以使得連接效率提高。
表連接的幾種方式:
- SORT MERGE JOIN(排序-合並連接)
- NESTED LOOPS(嵌套循環)
- HASH JOIN(哈希連接)
- CARTESIAN PRODUCT(笛卡爾積)
(1) SORT MERGE JOIN(排序-合並連接):
排序-合並連接的表無驅動順序,誰在前面都可以;
排序-合並連接適用的連接條件有: < <= = > >= ,不適用的連接條件有: <> like
(2) NESTED LOOPS(嵌套循環):
row source 1 (即驅動表)中返回了 N 行數據,則 row source 2 也相應的會被全表遍歷 N 次。
應盡可能使用限制條件(Where過濾條件)使驅動表(row source 1)返回的行數盡可能少,同時在匹配表(row source 2)的連接操作關聯列上建立唯一索引(UNIQUE INDEX)或是選擇性較好的非唯一索引,此時嵌套循環連接的執行效率會變得很高。若驅動表返回的行數較多,即使匹配表連接操作關聯列上存在索引,連接效率也不會很高。
(3)HASH JOIN(哈希連接) :
哈希連接只適用於等值連接(即連接條件為 = )