怎麼看懂oracle的執行計劃

項目須要,要獲取oracle的sql的對應的執行計劃,以前mysql的版本已經實現過了。mysql的執行計劃能夠參考這個博客: mysql

http://my.oschina.net/zimingforever/blog/60233 sql

首先toad,PLsql這類工具自己就帶有查看執行計劃的功能,如何經過sql命令來實現呢 數據庫

A設置autotrace,autotrace有如下幾種取值 express

?
1
2
3
4
5
SET AUTOTRACE OFF 此爲默認值,即關閉Autotrace
SET AUTOTRACE ON EXPLAIN 只顯示執行計劃
SET AUTOTRACE ON STATISTICS 只顯示執行的統計信息
SET AUTOTRACE ON 包含2,3兩項內容
SET AUTOTRACE TRACEONLY 與ON類似,但不顯示語句的執行結果
因爲本機沒有試驗環境,因此直接從網上摘了個demo,執行效果以下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
SQL>setautotrace on
SQL>select* from dave;
        ID NAME
---------- ----------
         8 安慶
         1 dave
         2 bl
         1 bl
         2 dave
         3 dba
         4 sf-express
         5 dmm
  
已選擇8行。
  
執行計劃
----------------------------------------------------------
Planhashvalue: 3458767806
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     8 |    64 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| DAVE |     8 |    64 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------
  
統計信息
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          4  consistent gets
          0  physical reads
          0  redo size
        609  bytes sent via SQL*Net to client
        416  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/fromclient
          0  sorts (memory)
          0  sorts (disk)
          8  rows processed
B 是使用explain的SQL來查看,語法是explain plan for sql
?
1
explain planforselect*fromZZ_TEST
而後調用以下語句來顯示結果
?
1
SELECTplan_table_outputFROMTABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));
?
1
select*fromtable(dbms_xplan.display);
顯示結果以下:
?
1
2
3
4
5
6
7
8
Planhashvalue: 1944298366
  
-----------------------------------------------------------------------------
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         |     5 |    40 |    15   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| ZZ_TEST |     5 |    40 |    15   (0)| 00:00:01 |
-----------------------------------------------------------------------------

執行計劃出來了,接下來咱們要看懂每個字段的含義了。 oracle

id是一個序號,可是並不表示執行的前後順序,執行的前後順序與縮進有關。 工具

operation表示當前操做的內容。 性能

row表示當前操做的的cardinality,是對當前操做返回結果集的一個估計值。 優化

cost表示一個代價的值 spa

time是估計的執行時間。 .net

接下來是統計信息裏的一些字段:

db block gets,表示從buffer cache中讀取的block數量

consistent gets,表示從buffer cache中讀取的undo數據的block數量。

physical reads,表示從磁盤上讀取的block數量。

redo size,表示dml生成的redo的大小。

sorts(memory),表示在內存上執行的排序量。

sorts(disk),表示在硬盤上執行的排序量。

Physical Reads一般是咱們最關心的,若是這個值很高,說明要從磁盤請求大量的數據到Buffer Cache裏,一般意味着系統裏存在大量全表掃描的SQL語句,這會影響到數據庫的性能,所以儘可能避免語句作全表掃描,對於全表掃描的SQL語句,建議增 加相關的索引,優化SQL語句來解決。
內容參考:

http://blog.csdn.net/tianlesoftware/article/details/5827245

不過我今天在程序裏使用的一個歷史版本的查看執行計劃的方法。我沒有封裝,直接使用的原有的方法:


?
1
explain PLAN setstatement_id='1111'forselect*fromZZ_TEST


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SELECT
    ID,
    REPLACE(
        LPAD (' ', 4 *(LEVEL- 1)),
        ' ',
        ' '
    ) || operation ||' '|| options operation,
    optimizer,
    DECODE (
        object_name,
        NULL,
        NULL,
        object_owner ||'.'|| object_name
    ) object_name,
    COST,
    CARDINALITY,
    other_tag,
    access_predicates,
    filter_predicates,
    bytes
FROM
    plan_table A STARTWITHID = 0
ANDSTATEMENT_ID ='1111'CONNECTBYPRIORID = parent_id
ANDSTATEMENT_ID ='1111'

結果以下:

在執行問這個後須要手動執行下del操做


?
1
deleteplan_tablewherestatement_id=1111

這裏有個參考文檔:

http://www.iteye.com/topic/586256

總結一下:這裏咱們須要學會用sql語句來查看orale的執行計劃和統計信息,知道執行計劃和統計信息中各個字段的含義。

相關文章
相關標籤/搜索