Oracle優化工具——AutoTrace

SQLPLUS的AutoTrace是分析SQL的執行計劃,執行效率的一個非常簡單方便的工具,在絕大多數情況下,也是非常有用的工具。利用AutoTrace工具提供的SQL執行計劃和執行狀態可以爲我們優化SQL的時候提供優化的依據,以及優化效果的明顯的對比效果。

一.AutoTrace的設置

SQL> connect / as sysdba 
SQL> @?/rdbms/admin/utlxplan.sql 
Table created. 
SQL> create public synonym plan_table for plan_table; 
Synonym created. 
SQL> grant select,update,insert,delete on plan_table to public;
Grant succeeded. 
SQL> @?/sqlplus/admin/plustrce.sql 
SQL>grant plustrace to public. 

二.AutoTrace的使用
在SQLPLUS中輸入相關AUTOTRACE命令,輸入想要優化的SQL語句,即可得到SQL的執行計劃和執行狀態信息。

SQL> conn ny_lx/test
已連接。
SQL> set timing on        //開啓時間顯示
SQL> set autot traceonly  //僅顯示trace結果,不顯示SQL執行結果
SQL> select * from ac01 where aac001='9990000111';

已用時間:  00: 00: 00.62

Execution Plan
----------------------------------------------------------
  	 0      SELECT STATEMENT Optimizer=CHOOSE
  	 1    0   TABLE ACCESS (BY INDEX ROWID) OF 'AC01'
  	 2    1     INDEX (UNIQUE SCAN) OF 'PK_AC01' (UNIQUE)
Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          3  consistent gets
          2  physical reads
          0  redo size
       1875  bytes sent via SQL*Net to client
        424  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

用法: SET AUTOT[RACE] {OFF | ON | TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]
舉例:
SET AUTOT[RACE] OFF          停止AutoTrace
SET AUTOT[RACE] ON           開啓AutoTrace,顯示AUTOTRACE信息和SQL執行結果
SET AUTOT[RACE] TRACEONLY 開啓AutoTrace,僅顯示AUTOTRACE信息
SET AUTOT[RACE] ON EXPLAIN   開啓AutoTrace,僅顯示AUTOTRACE的EXPLAIN信息
SET AUTOT[RACE] ON STATISTICS開啓AutoTrace,僅顯示AUTOTRACE的STATISTICS信息

三.執行計劃的分析

Execution Plan
----------------------------------------------------------
  	 0      SELECT STATEMENT Optimizer=CHOOSE
  	 1    0   TABLE ACCESS (BY INDEX ROWID) OF 'AC01'
 2    1     INDEX (UNIQUE SCAN) OF 'PK_AC01' (UNIQUE)
----------------------------------------------------------

這個就是SQL select * from ac01 where aac001='9990000111';執行計劃。
執行的過程爲:
1) INDEX (UNIQUE SCAN) OF 'PK_AC01' (UNIQUE)
2) TABLE ACCESS (BY INDEX ROWID) OF 'AC01'
執行計劃是一個樹狀結構,計劃的執行是從葉結點開始,直到根結點。所以不同的層上,越底層的越先被執行(第一列數字中較大的);不同層上,越左邊的越先被執行(第二列數字中較小的)。
通過分析這個實行計劃可以知道以下幾點:
a) 這是一條SELECT語句
b) 數據庫系統現在使用的優化器模式爲CHOOSE
c) 執行的時候先通過AC01表上的唯一索引PK_AC01查找到相應記錄的ROWID,然後通過索引的ROWID直接訪問AC01表,找到相應的記錄。
這是一條比較簡單的SQL,所以執行計劃也相對來說比較簡單,沒有涉及到過多的連接和索引等


四.執行狀態的分析

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          3  consistent gets
          2  physical reads
          0  redo size
          1875  bytes sent via SQL*Net to client
         424  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

這些數據就是這條SQL語句的執行狀態。下面分別說一下各個數據項的含義:
(1)recursive calls 
遞歸調用——執行SQL的時候的產生的遞歸調用的數量,這個參數和訪問數據字典的次數有很大的關係。一般來說,這個參數值不會很大。
(2)db block gets   
DB塊取——在發生INSERT,DELETE,UPDATE,SELECT FOR UPDATE的時候,數據庫緩衝區中的數據庫塊的個數。在SELECT語句中一般爲0。
(3)consistent gets 
一致性讀——除了SELECT FOR UPDATE的時候,從數據庫緩衝區中讀取的數據塊的個數
(4)physical reads  
物理讀——執行SQL的過程中,從硬盤上讀取的數據快個數
(5)redo size       
重做數——執行SQL的過程中,產生的重做日誌的大小
(6)bytes set via sql*net to client 
通過sql*net發送給客戶端的字節數
(7)bytes received via sql*net from client
通過sql*net接受客戶端的字節數
(8)sql*net roundtrips to/from client
(9)sorts(memory)
在內存中發生的排序
(10)sorts(disk)
不能在內存中發生的排序,需要硬盤來協助
(11)rows processed 
結果的記錄數

五.用AutoTrace進行優化的注意事項
1. 可以通過設置timing來得到執行SQL所用的時間,但不能僅把這個時間來當作SQL執行效率的唯一量度。這個時間會包括進行AUTOTRACE的一些時間消耗,所以這個時間並不僅僅是SQL執行的時間。這個時間會與SQL執行時間有一定的誤差,而在SQL比較簡單的時候尤爲明顯。
2. 判斷SQL效率高低應該通過執行SQL執行狀態裏面的邏輯讀的數量
邏輯讀 =(db block gets+ consistent gets)


六.總結
AutoTrace是ORACLE中優化工具中最基本的工具,雖然功能比較有限,但足以滿足我們日常工作的需要。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章