【效能調整】系統檢視(一)

yellowlee發表於2010-09-18

V$SESSION, V$SESSTAT, V$SESSION_EVENT, V$SESSION_LONGOPS,

V$SESSION_WAIT, V$SESS_IO, V$SESSION_CONNECT_INFO

select --會話資訊

       a.SADDR,   --session's address

       a.SID,     --session id

       a.SERIAL#, --when sesseion reuse,the serial + 1

       a.TYPE,    --the type of session

       a.PADDR,   --process address

       a.PROCESS, --process id of client

       a.SQL_ADDRESS,       --the address of the session's sql

       a.SQL_HASH_VALUE,    --the hash_value of the session's sql

       a.SQL_ID,            --the id of the session's sql

       a.EVENT#,            --the event number

       a.EVENT,             --the describe of the event number

       a.WAIT_CLASS#,       --wait class number

       a.WAIT_CLASS,        --wait class describe

       a.WAIT_TIME,          --wait time

       a.USER#,              --the use id

       a.USERNAME,           --use name

       a.OSUSER              --the operation system user name

  from v$session a where rownum = 1 ;

 

可以發現這些session相關的表中最核心的就是session表,這些表都有sid可以互相關聯,分別存放著session的相關屬性或者統計資訊。例如:

SELECT a.PADDR,

       a.SQL_ADDRESS,

       a.SQL_HASH_VALUE,

       a.SQL_ID,

       b.BLOCK_GETS,

       b.CONSISTENT_GETS,

       b.PHYSICAL_READS,

       c.AUTHENTICATION_TYPE,

       c.OSUSER,

       d.EVENT_ID,

       d.EVENT,

       d.TOTAL_WAITS,

       d.TIME_WAITED,

       d.WAIT_CLASS#,

       d.WAIT_CLASS

  from v$session              a,

       v$sess_io              b,

       v$session_connect_info c,

       v$session_event        d

 where a.SID = (select sid from v$mystat where rownum = 1)

   and a.SID = b.SID

   and a.SID = c.sid

   and d.SID = a.SID

;

 

 

 

系統狀態相關檢視:

v$statnamev$mystat, v$sysstat

select a.STATISTIC#,a.NAME,a.CLASS,a.STAT_ID from V$STATNAME a ;

其中的class代表意義:

1 代表事例活動

2 代表Redo buffer活動

4 代表鎖

8 代表資料緩衝活動

16 代表OS活動

32 代表並行活動

64 代表表訪問

128 代表除錯資訊

 

下面的語句可以查詢當前session的狀態

select * from

(select b.name,a.SID,a.VALUE from v$mystat a ,v$sysstat b

where a.STATISTIC# = b.STATISTIC# order by value desc )

where rownum < 30;

或者各session的各項值:

select * from

(select b.name,a.SID,a.VALUE from v$sesstat a ,v$sysstat b

where a.STATISTIC# = b.STATISTIC# order by value desc ) ;

 

列出常見的name值和解釋:

CPU used by this session

所有sessioncpu佔用量,不包括後臺程式。這項統計的單位是百分之x.完全呼叫一次不超過10ms

 

db block changes

那部分造成SGA中資料塊變化的insert,updatedelete運算元 這項統計可以大概看出整體資料庫狀態。

在各項事務級別,這項統計指出髒快取比率。

 

execute count

執行的sql語句數量(包括遞迴sql)

 

logons current

當前連線到例項的Sessions。如果當前有兩個快照則取平均值。

 

logons cumulative

自例項啟動後的總登陸次數。

 

parse count (hard)

shared pool中解析呼叫的未命中次數。

sql語句執行並且該語句不在shared pool或雖然在shared pool但因為兩者存在部分差異而不能被使用時產生硬解析。

如果一條sql語句原文與當前存在的相同,但查詢表不同則認為它們是兩條不同語句,則硬解析即會發生。

硬解析會帶來cpu和資源使用的高昂開銷,因為它需要oracleshared pool中重新分配記憶體,然後再確定執行計劃,最終語句才會被執行。

 

parse count (total)

解析呼叫總數,包括軟解析和硬解析。當session執行了一條sql語句,該語句已經存在於shared pool並且可以被使用則產生軟解析。

當語句被使用(即共享) 所有資料相關的現有sql語句(如最優化的執行計劃)必須同樣適用於當前的宣告。這兩項統計可被用於計算軟解析命中率。

 

parse time cpu

cpu解析時間(單位:10ms)。包括硬解析和軟解析。

 

parse time elapsed

完成解析呼叫的總時間花費。

 

physical reads

OS blocks read數。包括插入到SGA快取區的物理讀以及PGA中的直讀這項統計並非i/o請求數。

 

physical writes

SGA快取區被DBWR寫到磁碟的資料塊以及PGA程式直寫的資料塊數量。

 

redo log space requests

redo logs中服務程式的等待空間,表示需要更長時間的log switch

 

redo sizeredo

發生的總次數(以及因此寫入log buffer),以byte為單位。這項統計顯示出update活躍性。

 

session logical reads

邏輯讀請求數。

 

sorts (memory) and sorts (disk)sorts(memory)

是適於在SORT_AREA_SIZE(因此不需要在磁碟進行排序)的排序操作的數量。sorts(disk)則是由於排序所需空間太大,SORT_AREA_SIZE不能滿足而不得不在磁碟進行排序操作的數量。這兩項統計通常用於計算in-memory sort ratio

 

sorts (rows):

列排序總數。這項統計可被'sorts (total)'統計項除盡以確定每次排序的列。該項可指出資料卷和應用特徵。

 

table fetch by rowid

使用ROWID返回的總列數(由於索引訪問或sql語句中使用了'where rowid=&rowid'而產生)

 

table scans (rows gotten)

全表掃描中讀取的總列數

 

table scans (blocks gotten)

全表掃描中讀取的總塊數,不包括那些split的列。

 

 

 

可以檢視v$sysmetric中的awr資訊,獲得一些比率的計算方法:

SQL> select a.metric_name,a.METRIC_UNIT

  2  from v$sysmetric a where a.METRIC_UNIT like '%!%%' escape '!';

 

METRIC_NAME                                                      METRIC_UNIT

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

Buffer Cache Hit Ratio                                           % (LogRead - PhyRead)/LogRead

Memory Sorts Ratio                                              % MemSort/(MemSort + DiskSort)

Redo Allocation Hit Ratio                                        % (#Redo - RedoSpaceReq)/#Redo

User Commits Percentage                                          % (UserCommit/TotalUserTxn)

User Rollbacks Percentage                                       % (UserRollback/TotalUserTxn)

Cursor Cache Hit Ratio                                           % CursorCacheHit/SoftParse

Execute Without Parse Ratio                                      % (ExecWOParse/TotalExec)

Soft Parse Ratio                                                 % SoftParses/TotalParses

User Calls Ratio                                                 % UserCalls/AllCalls

Host CPU Utilization (%)                                         % Busy/(Idle+Busy)

User Limit %                                                     % Sessions/License_Limit

Database Wait Time Ratio                                         % Wait/DB_Time

Database CPU Time Ratio                                          % Cpu/DB_Time

Row Cache Hit Ratio                                              % Hits/Gets

Row Cache Miss Ratio                                             % Misses/Gets

Library Cache Hit Ratio                                          % Hits/Pins

Library Cache Miss Ratio                                         % Misses/Gets

Shared Pool Free %                                               % Free/Total

PGA Cache Hit %                                                  % Bytes/TotalBytes

Process Limit %                                                  % Processes/Limit

Session Limit %                                                  % Sessions/Limit

Streams Pool Usage Percentage                           % Memory allocated / Size of Streams pool

Buffer Cache Hit Ratio                                           % (LogRead - PhyRead)/LogRead

Memory Sorts Ratio                                              % MemSort/(MemSort + DiskSort)

Execute Without Parse Ratio                                      % (ExecWOParse/TotalExec)

Soft Parse Ratio                                                 % SoftParses/TotalParses

Host CPU Utilization (%)                                         % Busy/(Idle+Busy)

Database CPU Time Ratio                                          % Cpu/DB_Time

Library Cache Hit Ratio                                          % Hits/Pins

Shared Pool Free %                                               % Free/Total

 

30 rows selected.

 

SQL>

 

有了這些公式,就可以按照自己的定義來檢視一些比率來幫助診斷效能問題(下列計算方法均為推測或參考網路上的一些方法)

Buffer Cache Hit Ratio                                           % (LogRead - PhyRead)/LogRead

Buffer cache命中率=(所有的邏輯讀-所有物理讀)/所有的邏輯讀

select 1 - ((a.value - b.value - c.value) / d.value)

  from v$sysstat a, v$sysstat b, v$sysstat c, v$sysstat d

 where a.name = 'physical reads'

   and b.name = 'physical reads direct'

   and c.name = 'physical reads direct (lob)'

   and d.name = 'session logical reads';

 

Memory Sorts Ratio                                              % MemSort/(MemSort + DiskSort)

記憶體中完成的排序所佔比例。最理想狀態下,在OLTP系統中,大部分排序不僅小並且能夠完全在記憶體裡完成排序。

select a.value/(b.value+c.value)

  from v$sysstat a,v$sysstat b,v$sysstat c

  where a.name='sorts (memory)' and

         b.name='sorts (memory)' and c.name='sorts (disk)';

 

Redo Allocation Hit Ratio                                       % (#Redo - RedoSpaceReq)/#Redo

select (b.VALUE - a.VALUE) / b.VALUE

  from v$sysstat a, v$sysstat b

 where a.name = 'redo log space requests'

   and b.NAME = 'redo size';

 

User Commits Percentage                                          % (UserCommit/TotalUserTxn)

User Rollbacks Percentage                                       % (UserRollback/TotalUserTxn)

TotalUserTxn系統事務起用次數。當需要計算其它統計中每項事務比率時該項可以被做為除數。例如,計算事務中邏輯讀,可以使用下列公式:session logical reads / (user commits + user rollbacks)

select  e.VALUE/(b.VALUE + a.VALUE + c.value + d.value)

  from v$sysstat a, v$sysstat b,v$sysstat c,v$sysstat d,v$sysstat e

 where a.name = 'user commits'

   and b.NAME = 'user rollbacks'

   and c.name = 'user calls'

   and d.name = 'user I/O wait time'

   and e.name = 'session logical reads'

   ;

或者當前session的事務邏輯讀數:

select  e.VALUE/(b.VALUE + a.VALUE + c.value + d.value)

  from v$mystat a, v$mystat b,v$mystat c,v$mystat d,v$mystat e,

       v$statname aa,v$statname bb,v$statname cc,v$statname dd,v$statname ee

 where aa.name = 'user commits'

   and bb.NAME = 'user rollbacks'

   and cc.name = 'user calls'

   and dd.name = 'user I/O wait time'

   and ee.name = 'session logical reads'

   and a.STATISTIC# = aa.STATISTIC#

   and b.STATISTIC# = bb.STATISTIC#

   and c.STATISTIC# = cc.STATISTIC#

   and d.STATISTIC# = dd.STATISTIC#

   and e.STATISTIC# = ee.STATISTIC#

   ;

 

 

User commitsrollbacks的百分比可以由下面的sql顯示

select  a.VALUE/(b.VALUE + a.VALUE + c.value + d.value)

  from v$sysstat a, v$sysstat b,v$sysstat c,v$sysstat d

 where a.name = 'user commits'

   and b.NAME = 'user rollbacks'

   and c.name = 'user calls'

   and d.name = 'user I/O wait time';

 

select  b.VALUE/(b.VALUE + a.VALUE + c.value + d.value)

  from v$sysstat a, v$sysstat b,v$sysstat c,v$sysstat d

 where a.name = 'user commits'

   and b.NAME = 'user rollbacks'

   and c.name = 'user calls'

   and d.name = 'user I/O wait time';

 

Cursor Cache Hit Ratio                                           % CursorCacheHit/SoftParse

當前session下的cursor cache hit ratio計算

select cc.value / (aa.value - bb.value)

  from (select b.STATISTIC#, a.SID, b.NAME, a.VALUE

          from v$mystat a, v$statname b

         where a.STATISTIC# = b.STATISTIC#

           and b.NAME = 'parse count (total)') aa,

       (select b.STATISTIC#, a.SID, b.NAME, a.VALUE

          from v$mystat a, v$statname b

         where a.STATISTIC# = b.STATISTIC#

           and b.NAME = 'parse count (hard)') bb,

       (select b.STATISTIC#, a.SID, b.NAME, a.VALUE

          from v$mystat a, v$statname b

         where a.STATISTIC# = b.STATISTIC#

           and b.NAME like 'session cursor cache hits') cc;

 

當這個比率非常低的時候,可能意味著當前的session_cached_cursors設定的過低,需要稍稍調大這個值。

sql解析的時候,如果當前session已經有快取了的cursor,則可以直接使用對應的cursor,這個過程也叫做softer soft parse,顯然適當的softer soft parse,使得session下的遊標能夠複用是可以提高一定的效能的。

SQL> show parameter session_cached_cursors

 

NAME                                 TYPE        VALUE

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

session_cached_cursors               integer     20

SQL>

 

Execute Without Parse Ratio                                      % (ExecWOParse/TotalExec)

未解析的執行的比率

select 1-b.VALUE / a.VALUE

  from v$sysstat a, v$sysstat b

 where a.name = 'execute count'

   and b.name = 'parse count (total)';

 

Soft Parse Ratio                                                 % SoftParses/TotalParses

這項將顯示系統是否有太多硬解析。該值將會與原始統計資料對比以確保精確。例如,軟解析率僅為0.2則表示硬解析率太高。不過,如果總解析量(parse count total)偏低,這項值可以被忽略。

公式:1 - ( parse count (hard) / parse count (total) )

執行:

select 1-(a.value/b.value)

  from v$sysstat a,v$sysstat b

  Where a.name='parse count (hard)' and b.name='parse count (total)';

 

User Calls Ratio                                                 % UserCalls/AllCalls

select a.value / (a.value + b.value)

  from v$sysstat a, v$sysstat b

 where a.name = 'user calls'

   and b.name = 'recursive calls';

 

Host CPU Utilization (%)                                         % Busy/(Idle+Busy)

select b.VALUE / (a.value + b.value)

  from V$OSSTAT a, V$OSSTAT b

 where a.STAT_NAME = 'IDLE_TIME'

   and b.STAT_NAME = 'BUSY_TIME';

 

Row Cache Hit Ratio                                              % Hits/Gets

SELECT (SUM(GETS - GETMISSES - FIXED)) / SUM(GETS) "ROW CACHE HIT RATIO"

  FROM V$ROWCACHE;

 

User Limit %                                                     % Sessions/License_Limit

 

Database Wait Time Ratio                                         % Wait/DB_Time

DB time即為

Select * from from v$sysstat a where a.NAME = 'DB time';

(注:Wait待解析 oracle wait interface後再來看。)

 

Database CPU Time Ratio                                          % Cpu/DB_Time

 

Library Cache Hit Ratio                                          % Hits/Pins

Pins - The number of times a pin was requested for objects of this namespace.

Reloads - Any pin of an object that is not the first pin performed since the object handle was created, and which requires loading the object from disk.

A pin hits發生在當要執行SQL或者PL/SQL的時候,他已經在library cache中,並且可以被執行。

Library cache的命中率,往往意味著share pool的大小是否合適,或者sql解析是否存在問題(結合soft parse ratio來看,如果2者都較低,很可能就是sql解析有問題)。

select sum(PINS) Pins,

        sum(RELOADS) Reloads,

        round((sum(PINS) - sum(RELOADS)) / sum(PINS) * 100,2) Hit_Ratio

from    v$librarycache;

 

Shared Pool Free %                                               % Free/Total

select f.POOL,

       name,

       sgasize / 1024 / 1024  allocated,

       bytes / 1024       free,

       round(bytes / sgasize * 100, 2)    free_rate     

  from (select sum(bytes) sgasize from sys.v_$sgastat) s,

       sys.v_$sgastat f     

 where f.name = 'free memory'

                and f.name = 'shared pool'

;

 

 

 

 

 

Parse CPU to total CPU ratio

該項顯示總的CPU花費在執行及解析上的比率。如果這項比率較低,說明系統執行了太多的解析。

公式:1 - (parse time cpu / CPU used by this session)

執行:

select 1-(a.value/b.value)

  from v$sysstat a,v$sysstat b

  where a.name='parse time cpu' and

         b.name='CPU used by this session';

 

 

Parse time CPU to parse time elapsed

通常,該項顯示鎖競爭比率。這項比率計算是否時間花費在解析分配給CPU進行週期運算(即生產工作)。解析時間花費不在CPU週期運算通常表示由於鎖競爭導致了時間花費

公式:parse time cpu / parse time elapsed

執行:

select a.value/b.value

  from v$sysstat a,v$sysstat b

  where a.name='parse time cpu' and b.name='parse time elapsed';

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16179598/viewspace-674355/,如需轉載,請註明出處,否則將追究法律責任。

相關文章