1. 程式人生 > >看懂PL/SQL執行計劃的顯示結果

看懂PL/SQL執行計劃的顯示結果


統計資訊解釋:

recursive calls          

遞迴呼叫,有時為了執行使用者發出的一個sql語句,Oracle必須執行一些額外的語句,我們將這些額外的語句稱之為''recursive                                           calls''或''recursive SQL statements'',如當一個DDL語句發出後,ORACLE總是隱含的發出一些recursive SQL語句,來修改資料字典資訊,以便使用者可以成功的執行sql語句。

db block gets           

從buffer cache中讀取的block的數量

當前請求的塊數目,當前模式塊意思就是在操作中正好提取的塊數目,而不是在一致性讀的情況下而產生的正常情況下,一個查詢提取的塊是在查詢查詢開始的那個時間點上存在的資料庫,當前塊是在這個時候存在資料塊,而不是這個時間點之前或者之後的的資料塊數目。

consistent gets          

從buffer cache中讀取的undo資料的block的數量資料請求總數在回滾段Buffer中的資料一致性讀所需要的資料塊,,這裡的概念是在你處理你這個操作的時侯需要在一致性讀狀態上處理多個塊,這些塊產生的主要原因是因為你在查詢過程中,由於其它會話對資料 塊進行操作,而對所要查詢的塊有了修改,但是由於我們的查詢是在這些修改之前呼叫的,所要需要對回滾 段中的資料塊的前映像進行查詢,以保證資料的一致性。這樣就產生了一致性讀。

physical reads          

 物理讀 就是從磁碟上讀取資料塊的數量。其產生的主要原因是:

                  1:在資料庫快取記憶體中不存在這些塊。

                  2:全表掃描

                  3:磁碟排序

redo size              

DML生成的redo的大小

sorts (memory)           

在記憶體執行的排序量

sorts (disk)             

在磁碟執行的排序量

2091 bytes sent via SQL*Net to client

    

從SQL*Net向客戶端傳送了2091位元組的資料

416 bytes received via SQL*Net from client  

客戶端向SQL*Net傳送了416位元組的資料。

---------------------------------------------------------------------------

參考文件:SQLPlus User’s Guide and Reference Release 11.1

clip_image018

db block gets 、 consistent gets 、 physical reads這三者的關係可以概括為:邏輯讀指的是ORACLE從記憶體讀到的資料塊塊數量,一般來說是:

consistent gets + db block gets. 當在記憶體中找不到所需要的資料塊的話,就需要從磁碟中獲取,於是就產生了物理讀。

-----------------------------------------------------------------------------------------------------

 Plan hash Value

這一行是這一條語句的的hash值,我們知道ORACLE對每一條ORACLE語句產生的執行計劃放在SHARE POOL裡面,第一次要經過硬解析,產生hash值。下次再執行時比較hash值,如果相同就不會執行硬解析。

 COST

COST沒有單位,是一個相對值,是SQL以CBO方式解析執行計劃時,供ORACLE來評估CBO成本,選擇執行計劃用的。沒有明確的含義,但是在對比是就非常有用。

公式:COST=(Single Block I/O COST + MultiBlock I/O Cost + CPU Cost)/ Sreadtim

 對上面執行計劃列欄位的解釋:

Id: 執行序列,但不是執行的先後順序。執行的先後根據Operation縮排來判斷(採用最右最上最先執行的原則看層次關係,在同一級如果某個動作沒有子ID就最先執行。一般按縮排長度來判斷,縮排最大的最先執行,如果有2行縮排一樣,那麼就先執行上面的。)

    Operation:當前操作的內容。

    Name:操作物件

    Rows:也就是10g版本以前的Cardinality(基數),Oracle估計當前操作的返回結果集行數。

    Bytes:表示執行該步驟後返回的位元組數。

    Cost(CPU):表示執行到該步驟的一個執行成本,用於說明SQL執行的代價。

    Time:Oracle 估計當前操作的時間。

謂詞說明:

Predicate Information (identified by operation id):

---------------------------------------------------

2 - filter("B"."MGR" IS NOT NULL)

4 - access("A"."EMPNO" = "B"."MGR")

    Access: 表示這個謂詞條件的值將會影響資料的訪問路勁(全表掃描還是索引)。

    Filter:表示謂詞條件的值不會影響資料的訪問路勁,只起過濾的作用。

    在謂詞中主要注意access,要考慮謂詞的條件,使用的訪問路徑是否正確。

動態分析

如果在執行計劃中有如下提示:

Note

------------

-dynamic sampling used for the statement

這提示使用者CBO當前使用的技術,需要使用者在分析計劃時考慮到這些因素。 當出現這個提示,說明當前表使用了動態取樣。我們從而推斷這個表可能沒有做過分析。

這裡會出現兩種情況:

(1) 如果表沒有做過分析,那麼CBO可以通過動態取樣的方式來獲取分析資料,也可以或者正確的執行計劃。

(2) 如果表分析過,但是分析資訊過舊,這時CBO就不會在使用動態取樣,而是使用這些舊的分析資料,從而可能導致錯誤的執行計劃。

摘錄自: 作者:瀟湘隱者