ORACLE關於執行計畫的簡要分析

2021-09-22 09:22:41 字數 2806 閱讀 2547

一、如何開啟執行計畫:

開啟執行計畫(執行 set autotrace traceonly/off),如果提示sp2-0611,sp2-0618,按以下辦法建立相應使用者即可。

1、sys使用者登入,執行@$oracle_home/rdbms/admin/utlxplan.sql,建立plan_table ;

2、執行@$oracle_home/sqlplus/admin/plustrce.sql,建立plustrace角色;

3、賦給使用者grant plustrace to public;

執行 set autotrace traceonly即可。也可以採用以下方式:

1、explain plan for select * from student;

2、select * from table(dbms_xplan.display);

二、執行計畫的內容解析:

目前oracle優化器採用的是基於cost的cbo方式來對sql進行優化,因此優化器的判斷非常依賴於資料庫物件的統計分析資訊。只有提供給優化器正確的物件資訊(dbms_stat),才能使得優化器做出正確的選擇。

優化器選擇的方式無怪乎本文以下幾種方式,只要正確的理解執行計畫中這些內容,就可以根據資料庫物件的資料量和索引情況來改進sql的效能。

看執行計畫時,首先operation列是指當前操作的內容。從縮排最大的行看,它是最先被執行的步驟,對於兩行縮排相同的行,最上面的最先被執行;row列,是oracle估算當前行的返回結果集;cost和time是oracle估算的成本和時間。

oracle訪問資料的訪問方式有:

全表掃瞄(table access full):對所有表中記錄進行掃瞄。使用多塊讀操作,一次i/o能讀取多塊資料塊。表字段不涉及索引時往往採用這種方式。較大的表不建議使用全表掃瞄,除非結果資料超出全表資料總量的10%;

通過rowid的表訪問(table access by rowid):一次i/o只能讀取乙個資料塊。通過rowid讀取表字段,rowid可能是索引鍵值上的rowid;

索引掃瞄(index scan):索引掃瞄是首先掃瞄索引得到rowid值,該步驟的資料直接由記憶體讀取,速度較快;然後通過rowid讀出具體資料,如果表較大效率會下降。索引掃瞄有4種型別的索引掃瞄:

1、索引唯一掃瞄(index unique scan),如果表字段有unique 或primary key 約束,oracle實現索引唯一掃瞄,這種掃瞄方式條件比較極端,出現比較少;

2、索引範圍掃瞄(index range scan),這種是最常見的索引掃瞄方式。在非唯一索引上都使用索引範圍掃瞄。

使用index rang scan的3種情況:

1 ) 在唯一索引列上使用了以下圈定範圍的操作符(> < <> >= <= between等)

2 ) 在組合索引上,只使用部分列進行查詢,導致查詢出多行

3 ) 對非唯一索引列上進行的任何查詢。

3、 索引全掃瞄(index full scan):這種情況下,是查詢的資料都屬於索引字段,一般都含有排序操作

4、索引快速掃瞄(index fast full scan):如果查詢的資料都屬於索引字段,並且沒有進行排序操作,那麼是屬於這種情況。條件比較極端,出現比較少;

表之間的連線方式有

1、排序 - 合併連線(sort merge join):該種排序限制較大,出現比較少;

內部連線過程:

1) 首先生成表1需要的資料,然後對這些資料按照連線操作關聯列進行排序;

2) 隨後生成表2需要的資料,然後對這些資料按照與表1對應的連線操作關聯列進行排序;

3) 最後兩邊已排序的行被放在一起執行合併操作,即將2個表按照連線條件連線起來。

2、巢狀迴圈(nested loops)

該連線過程就是乙個2層巢狀迴圈,所以外層迴圈的次數越少越好。如果driving row source(外部表)比較小,並且在inner row source(內部表)上有唯一索引,或有高選擇性非唯一索引時,使用這種方法可以得到較好的效率。

3、雜湊連線(hash join)

在2個較大的row source之間連線時會取得相對較好的效率,在乙個row source較小時則能取得更好的效率。

三、統計資料的含義:

recursive calls 遞迴呼叫次數;

db block gets 當期操作時從記憶體讀取的當前最新塊資料,並不是在一致性讀的情況的塊數,即通過update/delete/select for update讀的塊數;

consistent gets 當期操作時在一致性讀狀態下讀取的塊數,即通過不帶for update的select 讀的塊數;

physical reads 物理讀,oracle從磁碟讀的資料塊數量 其產生的主要原因是:在資料庫快取記憶體中不存在這些塊;全表掃瞄;磁碟排序。其中邏輯讀指的是oracle從記憶體讀到的資料塊數量。一般來說是'consistent gets' + 'db block gets'。當在記憶體中找不到所需的資料塊的話就需要從磁碟中獲取,於是就產生了'phsical reads'。

redo size 執行sql的過程中產生的重做日誌;

423 bytes sent via sql*net to client 通過網路傳送給客戶端的資料

419 bytes received via sql*net from client 通過網路從客戶端接收到的資料

sql*net roundtrips to/from client

sorts (memory) 在記憶體中發生的排序;

sorts (disk) 在硬碟中發生的排序;

rows processed

ocacle 執行計畫 Oracle執行計畫

一 什麼是oracle執行計畫?執行計畫是一條查詢語句在oracle中的執行過程或訪問路徑的描述 二 怎樣檢視oracle執行計畫?因為我一直用的plsql遠端連線的公司資料庫,所以這裡以plsql為例 配置執行計畫需要顯示的項 工具 首選項 視窗型別 計畫視窗 根據需要配置要顯示在執行計畫中的列 ...

Oracle的執行計畫

今天來詳細說說oracle的執行計畫,所謂執行計畫,就是在執行某條sql之前作出的執行方案,或者說是執行路徑。oracle的優化器模式有兩大類,乙個是基於規則的 rbo rule based optimizer 乙個是基於代價的優化器 cbo cost based optimizer 又可細分為 c...

oracle執行計畫

對於一條sql語句,oracle是如何執行的,首先必須發揮你的想象,你認為它會如何去實現。是等子查詢結果全出來之後,還是子查詢每齣乙個結果,都觸發父節點去執行。沒錯,單純的 資料瀏覽當然不用等子查詢全部結束後,但涉及到排序,求和等需求的時候,就必須要等了,你可以幫它想想,全部資料不出來的話,何談去排...