AutoTRACE是分析SQL的執行計劃,執行效率的一個很是簡單方便的工具

*環境:windowsXP + Oracle10gR2
*AutoTRACE是分析SQL的執行計劃,執行效率的一個很是簡單方便的工具
*/ sql

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

SQL*Plus AUTOTRACE 能夠用來替代 SQL Trace 使用,AUTOTRACE 的好處是您沒必要設置跟蹤文件的格式,而且它將自動爲 SQL 語句顯示執行計劃。然而,AUTOTRACE 分析和執行語句;而EXPLAIN PLAN僅分析語句。 ide

使用AUTOTRACE不會產生跟蹤文件。 函數

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

用法: SET AUTOT[RACE] {OFF | ON | TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]] post

舉例:
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 結果的記錄數  spa

   AutoTrace進行優化的注意事項 .net

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

使用索引以後:0.01秒

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

 COUNT(*)                                                                    
----------                                                                    
     1350                                                                      

已用時間:  00: 00: 00.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

什麼狀況下索引不起做用:
一、類型不匹配時

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

三、複合索引中的前導列沒有被做爲查詢條件

四、CBO模式下選擇的行數比例過大,優化器採起了全表掃描

五、CBO模式下表很就沒分析,表的增加明顯,優化器採起了全表掃描

相關文章
相關標籤/搜索