oracle執行計划分析


參考文檔: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(哈希連接) :

哈希連接只適用於等值連接(即連接條件為  =  )

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM