Oracle性能分析工具介紹及使用

oracle數據庫級別優化分析工具介紹sql


當咱們對數據庫優化診斷時,須要收集相應的信息以供參考,從我的的使用經驗來講,這種統計數據分爲兩大類數據庫

 

一類是數據庫級別的統計信息
二類是os級別的統計信息
session

 

下面就分別介紹在不一樣的級別下,經常使用什麼工具來收集信息幫助優化診斷oracle

 

首先是oracle數據庫級別優化分析工具介紹工具

 

目錄:性能

 

1.statspack
2.ASH
3.AWR
4.ORACLE EXPLAIN PLAN的總結(查詢sql的執行計劃)
   a.autotrace
   b.explain的使用優化


1.statspackspa

 

a。安裝.net

 

sql> sqlplus "/ as sysdba"htm

 

SQL> select file_name from dba_data_files;

 

SQL> create tablespace perfstat datafile 'e:/oracle/oradata/skate/perfstat.dbf' size 2000m;

 

sql> @ORACLE_HOME/rdbms/admin/spcreate.sql

 

b。使用


SQL> conn perfstat/passwd

 

收集統計信息
sql> execute statspack.snap

SQL> exec statspack.SNAP(i_snap_level =>5);

 

生成報告
sql> @ORACLE_HOME/rdbms/admin/spreport.sql

 

定時收集信息有兩種方式,一種是oracle job,一種是os的crontab,我比較習慣用os級別的crontab

 

設定其每一個小時自動收集一次採樣的job


declare
Variable  job  number ; 
begin 
  dbms_job.submit(:job, "statspack.snap;" ,trunc( sysdate + 1/24 , 'hh24' ), "trunc(sysdate+1/24,'hh24')" ); 
  commit ; 
end ; 
/

 

查看job使用狀況

 

SQL> select job,schema_user,next_date,interval,what from user_jobs

 

 

自動中止採樣job


declare
Variable  job  number ; 
begin 
  dbms_job.submit(:job, "dbms_job.broken(44,true);" ,trunc( sysdate + 1 ), "null" ); 
  commit ; 
end ; 
/

 

 

清空全部stats統計信息表裏的數據


sql> @ORACLE_HOME/rdbms/admin/sptrunc.sql

 

 

snapshot的level,這能夠經過EXEC STATSPACK.MODIFY_STATSPACK_PARAMETER(i_snap_level=N)來修改,N能夠爲0,5,6,7,10,缺省爲5。

   0 僅提供通常性能統計
   5 增長了對SQL語句整體分析
   6 增長了SQL計劃和使用
   7 增長了分段(Segments)級的統計
   10增長了對閂鎖(Latches)的分析


  其中文檔建議對10要慎重,由於代價較高。

 

eg:
SQL> exec statspack.SNAP(i_snap_level =>6);

 

 

 

 

oracle不只提供生成數據庫報告的腳本spreport.sql,還提供另外一個statspack 報告腳本sprepsql.sql來生成SQL的報告

sql> @ORACLE_HOME/rdbms/admin/sprepsql.sql

 

參考文檔:
利用statspack來獲取生成環境中top SQL及其執行計劃
http://www.hellodba.com/Doc/statspack_report_sql.htm

 

 

 

2.AWR

 

awr是建庫是自動配置和啓用的,他對性能數據的收集默認是一小時,awr對歷史數據的分析

 

生成報告腳本在目錄下生成報告使用$ORACLE_HOME/rdbms/admin/,以下:

 

awrrpt.sql :生成指定快照區間的統計報表;
awrrpti.sql :生成指定數據庫實例,而且指定快照區間的統計報表;
awrsqlrpt.sql :生成指定快照區間,指定SQL語句(實際指定的是該語句的SQLID)的統計報表;
awrsqrpi.sql :生成指定數據庫實例,指定快照區間的指定SQL語句的統計報表;
awrddrpt.sql :指定兩個不一樣的時間週期,生成這兩個週期的統計對比報表;
awrddrpi.sql :指定數據庫實例,並指定兩個的不一樣時間週期,生成這兩個週期的統計對比報表;

 


修改Snapshots設置
  經過MODIFY_SNAPSHOT_SETTINGS過程,DBA能夠調整包括快照收集頻率、快照保存時間、以及捕獲的SQL數量三個方面的設置。 分別對應MODIFY_SNAPSHOT_SETTINGS的三個參數:

 

Retention :設置快照保存的時間,單位是分鐘。可設置的值最小爲1天,最大爲100年。設置該參數值爲0的話,就表示永久保留收集的快照信息。


Interval :設置快照收集的頻率,以分鐘爲單位。可設置的值最小爲10分鐘,最大爲1年。若是設置該參數值爲0,就表示禁用AWR特性。


Topnsql :指定收集的比較佔用資源的SQL數量,可設置的值最小爲30,最大不超過100000000。

 

AWR相關幾個視圖:

 

DBA_HIST_WR_CONTROL:查看當前快照收集的相關設置
v$active_session_history:由ASH自動在內存中維護,以每秒一次的頻率收集當前系統中活動session的信息
dba_hist_active_sess_history:是視圖v$active_session_history的歷史數據,保存在硬盤上
dba_hist_database_instance:顯示數據庫是實例的信息
dba_hist_snapshot:當前數據庫收集到的快照信息


3.ASH

 

ash和awr不是徹底分離的兩個功能,ash以秒爲單位從v$session中收集信息並保存在內存中,這塊內存能夠重用,內存滿時,ASH數據交給AWR,最後寫入系統視圖


ash包括兩部份內容,一部分是SGA中的,這部分反映是本次系統啓動以來的數據,而且ASH儘可能保留1小時的內容,這部份內容保存在v$active_session_history另外一部分保存在系統字典表裏dba_hist_active_sess_history,是永久的數據


ASH也有生成報告的腳本,在目錄下$ORACLE_HOME/rdbms/admin/

 

ashrpt.sql: 生成數據庫級別的ASH統計報表
ashrpti.sql: 生成數據庫實例級別的ASH統計報表,經常使用於RAC單實例

 

 

 

4.ORACLE EXPLAIN PLAN的總結(查詢sql的執行計劃)

 

a.autotrace


安裝

 

用sys用戶運行腳本ultxplan.sql

創建這個表的腳本是:(UNIX:$ORACLE_HOME/rdbms/admin, Windows:%ORACLE_HOME%/rdbms/admin)ultxplan.sql。

 

SQL> connect sys/sys@colm2 as sysdba;

 

SQL> @C:/oracle/ora92/rdbms/admin/utlxplan.sql;

 

SQL> create public synonym plan_table for plan_table;--創建同義詞

 

SQL> grant all on plan_table to public;--受權全部用戶

 

要在數據庫中創建一個角色plustrace,用sys用戶運行腳本plustrce.sql來建立這個角色,這個腳本在目
錄(UNIX:$ORACLE_HOME/sqlplus/admin, Windows:%ORACLE_HOME%/sqlplus/admin)中;

 

SQL> @C:/oracle/ora92/sqlplus/admin/plustrce.sql;

而後將角色plustrace授予須要autotrace的用戶;

SQL>grant plustrace to public;


通過以上步驟的設置,就能夠在sql*plus中使用autotrace了,autotrace功能只能在SQL*PLUS裏使用

 


AUTOTRACE Statistics經常使用列解釋

 

 db block gets :從buffer cache中讀取的block的數量
 consistent gets:從buffer cache中讀取的undo數據的block的數量
 physical reads: 從磁盤讀取的block的數量
 redo size: DML生成的redo的大小
 sorts (memory):在內存執行的排序量
 sorts (disk):在磁盤上執行的排序量
 

eg:

 

SYS@db>set autotrace           
Usage: SET AUTOT[RACE] {OFF | ON | TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]

 

SYS@db>set timing on

 

SYS@db>set autot trace exp stat


SYS@db>select * from tab;

3809 rows selected.

Elapsed: 00:00:00.06

Execution Plan
----------------------------------------------------------

---------------------------------------------------------------------
| Id  | Operation             | Name   | Rows  | Bytes | Cost (%CPU)|
---------------------------------------------------------------------
|   0 | SELECT STATEMENT      |        |  1059 | 46596 |   216   (2)|
|   1 |  NESTED LOOPS OUTER   |        |  1059 | 46596 |   216   (2)|
|   2 |   TABLE ACCESS FULL   | OBJ$   |  1059 | 39183 |   158   (2)|
|   3 |   TABLE ACCESS CLUSTER| TAB$   |     1 |     7 |     1   (0)|
|   4 |    INDEX UNIQUE SCAN  | I_OBJ# |     1 |       |     0   (0)|
---------------------------------------------------------------------

Note
-----
   - 'PLAN_TABLE' is old version


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
       9077  consistent gets
          0  physical reads
          0  redo size
     133502  bytes sent via SQL*Net to client
       3252  bytes received via SQL*Net from client
        255  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
       3809  rows processed

 

b。EXPLAIN的使用

 

    Oracle RDBMS執行每一條SQL語句,都必須通過Oracle優化器的評估。因此,瞭解優化器是如何選擇(搜索)路徑以
    及索引是如何被使用的,對優化SQL語句有很大的幫助。Explain能夠用來迅速方便地查出對於給定SQL語句中的查
    詢數據是如何獲得的即搜索路徑(咱們一般稱爲Access Path)。從而使咱們選擇最優的查詢方式達到最大的優化效果。

 

1.1 、安 裝                                                                                                                      

 要使用EXPLAIN首先要執行相應的腳本,建立出Explain_plan表。

 

具體腳本執行以下:

   $ORACLE_HOME/rdbms/admin/utlxplan.sql (UNIX)  該腳本後會生成一個表這個程序會建立一個名爲plan_table的表。

 

1.2 、使用


常規使用語法:
explain PLAN [ SET STATEMENT_ID [=] < string literal > ] [ INTO < table_name > ]
FOR < sql_statement >

 

其中:


STATEMENT_ID:是一個惟一的字符串,把當前執行計劃與存儲在同一PLAN中的其它執行計劃區別開來。


TABLE_NAME:是plan表名,它結構如前所示,你能夠任意設定這個名稱。


SQL_STATEMENT:是真正的SQL語句。  

                                                                 

好比:                                                                                                               

SQL>explain plan set statement_id='T_TEST' for select * from t_test;            

SQL>

Explained

 

執行下面語句能夠查詢到執行計劃

SQL>SELECT A.OPERATION,OPTIONS,OBJECT_NAME,OBJECT_TYPE,ID,PARENT_ID
  2  FROM PLAN_TABLE  a
  3  WHERE STATEMENT_ID='T_TEST'
  4  ORDER BY Id;


也能夠用這句話 select * from table(dbms_xplan.display); 能夠把全部PLAN_TABLE裏的數據羅列出來。

 


----end-----

 

轉載至:http://blog.csdn.net/wyzxg/article/details/5346974

相關文章
相關標籤/搜索