天天看點

學習動态性能表 第一篇--v$sysstat

  學習動态性能表

第一篇--v$sysstat 

  按照OracleDocument中的描述,v$sysstat存儲自資料庫執行個體運作那刻起就開始累計全執行個體(instance-wide)的資源使用情況。

類似于v$sesstat,該視圖存儲下列的統計資訊:

1>.事件發生次數的統計(如:user commits)

2>.資料産生,存取或者操作的total列(如:redo size)

3>.如果TIMED_STATISTICS值為true,則統計花費在執行操作上的總時間(如:CPU used by this session)

v$sysstat視圖常用列介紹:

l         STATISTIC#: 辨別

l         NAME: 統計項名稱

l         VALUE: 資源使用量

該視圖還有一列class-統計類别但極少會被使用,各類資訊如下:

1 代表事例活動

2 代表Redo buffer活動

4 代表鎖

8 代表資料緩沖活動

16 代表OS活動

32 代表并行活動

64 代表表通路

128 代表調試資訊

注意:Statistic#的值在不同版本中各不相同,使用時要用Name做為查詢條件而不要以statistic#的值做為條件。

使用v$sysstat中的資料

  該視圖中資料常被用于監控系統性能。如buffer cache命中率、軟解析率等都可從該視圖資料計算得出。

  該視圖中的資料也被用于監控系統資源使用情況,以及系統資源使用率的變化。正因如此多的性能資料,檢查某區間内系統資源使用情況可以這樣做,在一個時間段開始時建立一個視圖資料快照,結束時再建立一個,二者之間各統計項值的不同(end value - begin value)即是這一時間段内的資源消耗情況。這是oracle工具的常用方法,諸如Statspack以及BSTAT/ESTAT都是如此。

  為了對比某個區間段的資料,源資料可以被格式化(每次事務,每次執行,每秒鐘或每次登陸),格式化後資料更容易從兩者中鑒别出差異。這類的對比在更新前,更新後或僅僅想看看一段時間内使用者數量增長或資料增加如何影響資源使用方面更加實用。

  你也可以使用v$sysstat資料通過查詢v$system_event視圖來檢查資源消耗和資源回收。

V$SYSSTAT中的常用統計

  V$SYSSTAT中包含多個統計項,這部分介紹了一些關鍵的v$sysstat統計項,在調優方面相當有用。下列按字母先後排序:

資料庫使用狀态的一些關鍵名額:

l         CPU used by this session:所有session的cpu占用量,不包括背景程序。這項統計的機關是百分之x秒.完全調用一次不超過10ms

l         db block changes:那部分造成SGA中資料塊變化的insert,update或delete操作數這項統計可以大概看出整體資料庫狀态。在各項事務級别,這項統計指出髒緩存比率。

l         execute count:執行的sql語句數量(包括遞歸sql)

l         logons current:目前連接配接到執行個體的Sessions。如果目前有兩個快照則取平均值。

l         logons cumulative:自執行個體啟動後的總登陸次數。

l         parse count (hard):在shared pool中解析調用的未命中次數。當sql語句執行并且該語句不在shared pool或雖然在shared pool但因為兩者存在部分差異而不能被使用時産生硬解析。如果一條sql語句原文與目前存在的相同,但查詢表不同則認為它們是兩條不同語句,則硬解析即會發生。硬解析會帶來cpu和資源使用的高昂開銷,因為它需要oracle在shared pool中重新配置設定記憶體,然後再确定執行計劃,最終語句才會被執行。

l         parse count (total):解析調用總數,包括軟解析和硬解析。當session執行了一條sql語句,該語句已經存在于shared pool并且可以被使用則産生軟解析。當語句被使用(即共享) 所有資料相關的現有sql語句(如最優化的執行計劃)必須同樣适用于目前的聲明。這兩項統計可被用于計算軟解析命中率。

l         parse time cpu:總cpu解析時間(機關:10ms)。包括硬解析和軟解析。

l         parse time elapsed:完成解析調用的總時間花費。

l         physical reads:OS blocks read數。包括插入到SGA緩存區的實體讀以及PGA中的直讀這項統計并非i/o請求數。

l         physical writes:從SGA緩存區被DBWR寫到磁盤的資料塊以及PGA程序直寫的資料塊數量。

l         redo log space requests:在redo logs中服務程序的等待空間,表示需要更長時間的log switch。

l         redo size:redo發生的總次數(以及是以寫入log buffer),以byte為機關。這項統計顯示出update活躍性。

l         session logical reads:邏輯讀請求數。

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

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

l         table fetch by rowid:使用ROWID傳回的總列數(由于索引通路或sql語句中使用了'where rowid=&rowid'而産生)

l         table scans (rows gotten):全表掃描中讀取的總列數

l         table scans (blocks gotten):全表掃描中讀取的總塊數,不包括那些split的列。

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

注:SQL語句的解析有軟解析soft parse與硬解析hard parse之說,以下是5個步驟:

1:文法是否合法(sql寫法)

2:語義是否合法(權限,對象是否存在)

3:檢查該sql是否在公享池中存在

-- 如果存在,直接跳過4和5,運作sql. 此時算soft parse

4:選擇執行計劃

5:産生執行計劃

-- 如果5個步驟全做,這就叫hard parse.

注意實體I/O

  oracle報告實體讀也許并未導緻實際實體磁盤I/O操作。這完全有可能因為多數作業系統都有緩存檔案,可能是那些塊在被讀取。塊也可能存于磁盤或控制級緩存以再次避免實際I/O。Oracle報告有實體讀也許僅僅表示被請求的塊并不在緩存中。

由V$SYSSTAT得出執行個體效率比(Instance Efficiency Ratios)

下列是些典型的instance efficiency ratios 由v$sysstat資料計算得來,每項比率值應該盡可能接近1:

l         Buffer cache hit ratio:該項顯示buffer cache大小是否合适。

公式:1-((physical reads-physical reads direct-physical reads direct (lob)) / session logical reads)

執行:

select1-((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';

l         Buffer hit ratio:該項顯示buffer命中率。

公式:1-(physical reads/ (db block gets+consistent gets))

select1 - (sum(decode(name, 'physical reads', value, 0)) /

       (sum(decode(name, 'db block gets', value, 0)) +

       sum(decode(name, 'consistent gets', value, 0))))

       "Buffer Hit Ratio"

from v$sysstat;

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

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

select1-(a.value/b.value)

 from v$sysstat a,v$sysstat b

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

l         In-memory sort ratio:該項顯示記憶體中完成的排序所占比例。最理想狀态下,在OLTP系統中,大部分排序不僅小并且能夠完全在記憶體裡完成排序。

公式:sorts (memory) / ( sorts (memory) + sorts (disk) )

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

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

 wherea.name='sorts (memory)'and

         b.name='sorts (memory)'andc.name='sorts (disk)';

l         Parse to execute ratio:在生産環境,最理想狀态是一條sql語句一次解析多數運作。

公式:1 - (parse count/execute count)

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

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

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

 where a.name='parse time cpu'and

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

l         Parse time CPU to parse time elapsed:通常,該項顯示鎖競争比率。這項比率計算

是否時間花費在解析配置設定給CPU進行周期運算(即生産工作)。解析時間花費不在CPU周期運算通常表示由于鎖競争導緻了時間花費

公式:parse time cpu / parse time elapsed

select a.value/b.value

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

從V$SYSSTAT擷取負載間檔(Load Profile)資料

  負載間檔是監控系統吞吐量和負載變化的重要部分,該部分提供如下每秒和每個事務的統計資訊:logons cumulative, parse count (total), parse count (hard), executes, physical reads, physical writes, block changes, and redo size.

  被格式化的資料可檢查'rates'是否過高,或用于對比其它基線資料設定為識别system profile在期間如何變化。例如,計算每個事務中block changes可用如下公式:

db block changes / ( user commits + user rollbacks )

 where a.name='db block changes'and

         b.name='user commits'andc.name='user rollbacks';

其它計算統計以衡量負載方式,如下:

l         Blocks changed for each read:這項顯示出block changes在block reads中的比例。它将指出是否系統主要用于隻讀通路或是主要進行諸多資料操作(如:inserts/updates/deletes)

公式:db block changes / session logical reads

         b.name='session logical reads' ;

l         Rows for each sort:

公式:sorts (rows) / ( sorts (memory) + sorts (disk) )

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