天天看點

oracle 11g autotrace,Oracle AutoTRACE使用分析+執行個體

*環境:windowsXP + Oracle10gR2

*AutoTRACE是分析SQL的執行計劃,執行效率的一個非常簡單友善的工具

*/

AUTOTRACE是一項 SQL*Plus 功能,自動跟蹤為 SQL 語句生成一個執行計劃并且提供與該語句的處理有關的統計。

SQL*Plus AUTOTRACE 可以用來替代 SQL Trace 使用,AUTOTRACE 的好處是您不必設定跟蹤檔案的格式,并且它将自動為 SQL 語句顯示執行計劃。然而,AUTOTRACE 分析和執行語句;而EXPLAIN PLAN僅分析語句。

使用AUTOTRACE不會産生跟蹤檔案。

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

用法: 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資訊

結果解釋

physical reads 實體讀——執行SQL的過程中,從硬碟上讀取的資料塊個數

redo size      重做數——執行SQL的過程中,産生的重做日志的大小

bytes set via sql*net to client  通過sql*net發送給用戶端的位元組數

bytes received via sql*net from client  通過sql*net接受用戶端的位元組數

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

sorts(disk)    不能在記憶體中發生的排序,需要硬碟來協助

rows processed 結果的記錄數

AutoTrace進行優化的注意事項

1.可以通過設定timing來得到執行SQL所用的時間,但不能僅把這個時間來當作SQL執行效率的唯一量度。這個時間會包括進行AUTOTRACE的一些時間消耗,是以這個時間并不僅僅是SQL執行的時間。這個時間會與SQL執行時間有一定的誤差,而在SQL比較簡單的時候尤為明顯。

2. 判斷SQL效率高低應該通過執行SQL執行狀态裡面的邏輯讀的數量

邏輯讀 =(db block gets+ consistent gets)

總結

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

在Oracle9i中需要運作$ORACLE_HOME\RDBMS\ADMIN\utlxplan.sql腳本生成plan_table表;

在Oracle10g中PLAN_TABLE不再需要建立,Oracle預設增加了一個字典表PLAN_TABLE$,然後基于PLAN_TABLE$建立公用同義詞供使用者使用

關于Autotrace幾個常用選項的說明:

SET AUTOTRACE OFF ---------------- 不生成AUTOTRACE 報告,這是預設模式

SET AUTOTRACE ON EXPLAIN ------ AUTOTRACE隻顯示優化器執行路徑報告

SET AUTOTRACE ON STATISTICS -- 隻顯示執行統計資訊

SET AUTOTRACE ON ----------------- 包含執行計劃和統計資訊

SET AUTOTRACE TRACEONLY ------ 同set autotrace on,但是不顯示查詢輸出

1 在where中使用索引

SQL> set timing on

SQL> set autotrace on

沒有使用索引之前:全表掃描花4.46秒

SQL> select count(*) from test where wner='RISENET';

COUNT(*)

----------

1350

已用時間:  00: 00: 04.46

SQL> create index test_owner_index

2  on test(owner);

索引已建立。

已用時間:  00: 00: 04.57

SQL> select count(*) from test where wner='RISENET';

COUNT(*)

----------

1350

已用時間:  00: 00: 00.01

使用索引之後:0.01秒

2  當用count(*)使用全表掃描時,可以建立主鍵,這樣可以使用到索引

SQL> select count(*) from test;

COUNT(*)

----------

205880

已用時間:  00: 00: 02.09

執行計劃

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

Plan hash value: 1950795681

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

| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |

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

|   0 | SELECT STATEMENT   |      |     1 |  4109   (1)| 00:00:50 |

|   1 |  SORT AGGREGATE    |      |     1 |            |          |

|   2 |   TABLE ACCESS FULL| TEST |   102K|  4109   (1)| 00:00:50 |

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

SQL> alter table mzl

2  add primary key (object_id)

3  using index;

表已更改。

已用時間:  00: 00: 00.53

SQL> select count(*) from mzl;

COUNT(*)

----------

51473

已用時間:  00: 00: 00.04

什麼情況下索引不起作用:

1、類型不比對時

2、條件列包含函數但沒有建立函數索引時

3、複合索引中的前導列沒有被作為查詢條件

4、CBO模式下選擇的行數比例過大,優化器采取了全表掃描

5、CBO模式下表很就沒分析,表的增長明顯,優化器采取了全表掃描

oracle 11g autotrace,Oracle AutoTRACE使用分析+執行個體