天天看點

Oracle執行計劃

一、配置執行計劃

Tools—Preferences—Window Types—Plan Window

Oracle執行計劃

二、檢視執行計劃

選中代碼塊

Tools—Explain plan 或者 F5

1、執行 計劃的常用列字段解釋

基數(Cardinality) : Oracle 估計的目前操作的傳回結果集行數

位元組(Bytes) :執行該步驟後傳回的位元組數

耗費(COST)、CPU耗費: Oracle 估計的該步驟的執行成本,用于說明SQL執行的代價,理論.上越小越好(該值可能與實際有出入)

時間(Time):Oracle估計的目前操作所需的時間

2、執行順序

縮進最多的最先執行; (縮進 相同時,最上面的最先執行)

三、表通路的幾種方式(非全部) 

TABLE ACCESS FULL (全表掃描)

Oracle會讀取表中所有的行,并檢查每一行是否滿足SQL語句中的Where 限制條件;

使用建議:資料量太大的表不建議使用全表掃描,除非本身需要取出的資料較多,占到

表資料總量的5%~ 10%或以上

TABLE ACCESS BY NDEX ROWID (通過ROWID的表存取)

ROWID是由Oracle自動加在表中每行最後的一列僞列,既然是僞列,就說明表中并不

會實體存儲ROWID的值。

你可以像使用其它列一樣使用它,隻是不能對該列的值進行增、删、改操作。

一旦一行資料插入後,則其對應的ROWID在該行的生命周期内是唯-的,即使發生行

遷移,該行的ROWID值也不變。

行的ROWID指出了該行所在的資料檔案、資料塊以及行在該塊中的位置,是以通過

ROWID可以快速定位到目标資料上,這也是Oracle中存取單行資料最快的方法:

TABLE ACCESS BY INDEX SCAN (索引掃描)

在索引塊中,既存儲每個索引的鍵值,也存儲具有該鍵值的行的ROWID.

1、索引掃描實際分兩步:

—掃描索引得到對應的ROWID,

—通過ROWID定位到具體的行讀取資料。

2、五種索引掃描

INDEX UNIQUE SCAN (索引唯一掃描):

 針對唯:唯一性索引(UNIQUE INDEX)的掃描,每次至多隻傳回一條記錄;

表中某字段存在UNIQUE、PRIMARYKEY限制時,Oracle 常實作唯一性掃描

INDEX RANGE SCAN (索引範圍掃描):

使用一一個索引存取多行資料:

發生索引範圍掃描的三種情況:

在唯一索引列上使用了範圍操作符(如: >, <, <>,  >=, <=, between) ;

在組合索引上,隻使用部分列進行查詢(查詢時必須包含前導列,香則會走全表掃描);

對非唯一索引列上進行的任何查詢;

INDEX FULL SCAN (索引全掃描):

進行全索引掃描時,查詢出的資料都必須從索引中可以直接得到;

INDEX FAST FULL SCAN (索引快速掃描):

掃描索引中的所有的資料塊,與NDEX FULL SCAN類似,但是一個顯著的差別是它

不對查詢出的資料進行排序( 即資料不是以排序順序被傳回) ;

INDEX SKIP SCAN (索引跳躍掃描):

表有一個複合索引,且在查詢時有除了前導列(索引中第一列) 外的其他列作為條件:

四、Oracle優化器

RBO (Rule-Based Optimization)基于規則的優化器

RBO有嚴格的使用規則,隻要按照這套規則去寫SQL語句,無論資料表中的内容怎樣,

也不會影響到你的執行計劃。換句話說,RBO對資料“不敏感”,它要求SQL編寫人員必

須要了解各項細則。RBO -直沿用至ORACLE 9i,從ORACLE 10g開始,RBO已經徹底

被抛棄。

CBO (Cost-Based Optimization)基于代價的優化器

CBO是一種比RBO更加合理、可靠的優化器,

在ORACLE 10g中完全取代RBO. CBO

通過計算各種可能的執行計劃的“代價",即COST,從中選用COST最低的執行方案作為實

際運作方案。