2013年12月5日 星期四

[Tips]深入了解V$ - V$sysstat

V$:Dynamic Performance View,又稱為動態視圖,它是儲存在SGA之中。可以透過SELECT * FROM dba_objects WHERE object_name like 'V_$%'來查詢。


根據Oracle Documentation的說明:
V$sysstat displays system statistics. To find the name of the statistic associated with each statistic number (STATISTIC#), query the V$STATNAME view.


--說明了V$sysstat儲存了資源使用的統計結果,從Instance啟動就開始累計。

1)V$sysstat常會用到的欄位
欄位
敘述
STATISTIC#
標識值(不會固定保留給同一個NAME,因此查詢要以NAME為主。
NAME
統計項的名稱
VALUE
資源使用統計

目前11g的版本總共有588統計項,常用的如下。

項目
敘述
CPU used by this session
所有sessionCPU使用量(單位為百分之一秒)
db block changes
資料在database buffer cache中進行insert, update, delete的次數
DB time
CPU time + I/O time + non-idle wait time
execute count
執行SQL語句的次數
logons cumulative
累積連線的session
logons current
目前連線的session
parse count (hard)
執行硬解析(hard parse)的次數
parse count (total)
hard parse + soft parse
parse time cpu
CPU花在解析上的時間(單位為10ms)
parse time elapsed
解析從開始到結束總共花費時間
physical reads
OS block讀取的次數
physical writes
DBWn寫到Disk block的次數
redo entries
redo entry的數量
sorts (disk)
disksort的次數
sorts (memory)
memorysort的次數
table scan blocks gotten
全表掃描的總block
table scan rows gotten
全表掃描的總row
user commits
執行commits的總次數
user rollbacks
執行rollback的總次數

透過V$syssta我們可以了解系統的狀況,甚至進行調整(tuning)的動作,以下列出該視圖計算得出的結果。

2)Buffer Cache Hit Ratio
select (1-(a.value/(b.value+c.value)))*100
from v$sysstat a, v$sysstat b, v$sysstat c
where a.name='physical reads'
and b.name='db block gets'
and c.name='consistent gets'

顯示資料命中buffer cache的機率,越高代表資料存取有比較高的機率可以在memory中找到,而不是disk,如此一來就可以加快存取的速度。其次,也可以用來判斷設定SGA的空間是否足夠。
Buffer Cache Hit Ratio
越高越好

3)Sorts in Memory
select round((a.value/(a.value+b.value))*100,2)
from v$sysstat a, v$sysstat b
where a.name='sorts (memory)'
and b.name='sorts (disk)'

顯示資料排序是在memory中進行所佔的比例,越高代表資料排序的速度較快(memory的速度大於disk)
Sorts in Memory
越高越好

4)Soft Parse Ratio
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)';

顯示soft parse所佔的比例,判斷是否有太多的hard parse

5)Execute/Parse Ratio
select b.value/a.value
from v$sysstat a,v$sysstat b
where a.name='parse count (total)'
and b.name='execute count';

顯示平均sql語句解析一次可以執行幾次,最理想狀態是解析一次執行多次。
Execute/Parse Ratio
越高越好

6)Parse CPU/Total CPU Ratio
select 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';

顯示總共的CPU花費在解析上的時間,越高代表系統花費執行了太多的解析。
Parse CPU/Total CPU Ratio
越低越好

7)Parse Time CPU/Parse Time Elapsed Ratio
select a.value/b.value
from v$sysstat a,v$sysstat b
where a.name='parse time cpu'
and b.name='parse time elapsed';

顯示解析總共的時間花費在CPU進行運算上,當比例太低的時候,表示解析時間沒花在CPU通常是因為lock競爭的關係導致了時間的浪費。
Parse Time CPU/Parse Time Elapsed Ratio
越高越好

8)Short/Long Table Scan
select(a.value/(a.value+b.value))*100
from v$sysstat a, v$sysstat b
where a.name='table scans (short tables)'
and b.name='table scans (long tables)'

顯示short table進行全表掃描(full table scan)的比例,short table在進行全表掃描的效率較索引好;long table進行全表掃描通常是不好的效率。當比例太低的時候,可能是缺乏正確的索引或是SQL寫得不好。
Short/Long Table Scan
越高越好