1. 程式人生 > >Oracle v$SYSSTAT

Oracle v$SYSSTAT

下面都是擷取別人的部落格的:

 

摘要: V$SYSSTAT中包含多個統計項,這部分介紹了一些關鍵的v$sysstat統計項,在調優方面相當有用。下列按字母先後排序: 資料庫使用狀態的一些關鍵指標:         CPU used by this session:所有session的cpu佔用量,不包括後臺程序。

 

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

SQL> select STATISTIC#,NAME from v$sysstat where rownum<10;

 

STATISTIC# NAME

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

 0 OS CPU Qt wait time

 1 Requests to/from cli

   ent

 

 2 logons cumulative

 3 logons current

 4 opened cursors cumul

   ative

 

 5 opened cursors curre

   nt

 

STATISTIC# NAME

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

 

 6 user commits

 7 user rollbacks

 8 user calls

 

 

資料庫使用狀態的一些關鍵指標:

 

        CPU used by this session:所有session的cpu佔用量,不包括後臺程序。這項統計的單位是百分之x秒.完全呼叫一次不超過10ms

 

        db block changes:那部分造成SGA中資料塊變化的insert,update或delete運算元 這項統計可以大概看出整體資料庫狀態。在各項事務級別,這項統計指出髒快取比率。

 

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

 

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

 

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

 

        parse count (hard):在shared pool中解析呼叫的未命中次數。當sql語句執行並且該語句不在shared pool或雖然在shared pool但因為兩者存在部分差異而不能被使用時產生硬解析。如果一條sql語句原文與當前存在的相同,但查詢表不同則認為它們是兩條不同語句,則硬解析即會發生。硬解析會帶來cpu和資源使用的高昂開銷,因為它需要oracle在shared 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 size:redo發生的總次數(以及因此寫入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的列。

 

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

 

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

 

 

 

注: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:

 

 

 

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

 

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

 

執行:

 

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

 

 

 

       Soft parse ratio:這項將顯示系統是否有太多硬解析。該值將會與原始統計資料對比以確保精確。例如,軟解析率僅為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)';

 

 

 

      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

 

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

 

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

 

 

 

    Parse to execute ratio:在生產環境,最理想狀態是一條sql語句一次解析多次執行。

 

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

 

執行:

 

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

 

 from v$sysstat a,v$sysstat b

 

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

 

 

 

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

 

 

 

從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 )

 

執行:

 

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

 

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

 

 where a.name='db block changes' and

 

         b.name='user commits' and c.name='user rollbacks';

 

 

 

 

 

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

 

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

 

公式:db block changes / session logical reads

 

執行:

 

select a.value/b.value

 

 from v$sysstat a,v$sysstat b

 

 where a.name='db block changes' and

 

         b.name='session logical reads' ;

 

 

 

      Rows for each sort:

 

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

 

執行:

 

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

 

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

 

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

 

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

 

下面是別人的另外一篇部落格:

按照Oracle Online Book中的描述,v$sesstat儲存session從login到logout的詳細資源使用統計。

 

類似於v$sysstat,該檢視儲存下列類別的統計:

 

  1. 事件發生次數的統計,如使用者提交數。
  2. 資料產生,存取或者操作的total列(如:redo size)
  3. 執行操作所花費的時間累積,例如session CPU佔用(如果TIMED_STATISTICS值為true)

注意:

如果初始引數STATISTICS_LEVEL被設定為TYPICAL或ALL,時間統計被資料庫自動收集如果STATISTICS_LEVEL被設定為BASIC,你必須設定TIMED_STATISTICS值為TRUE以開啟收集功能。

 

如果你已設定了DB_CACHE_ADVICE,TIMED_STATISTICS或TIMED_OS_STATISTICS,或在初始引數檔案或使用ALTER_SYSTEM或ALTER SESSION,那麼你所設定的值的值將覆蓋STATISTICS_LEVEL的值。

 

v$sysstat和v$sesstat差別如下:

    1. v$sesstat只儲存session資料,而v$sysstat則儲存所有sessions的累積值。
    2. v$sesstat只是暫存資料,session退出後資料即清空。v$sysstat則是累積的,只有當例項被shutdown才會清空。
    3. v$sesstat不包括統計項名稱,如果要獲得統計項名稱則必須與v$sysstat或v$statname連線查詢獲得。

 

v$sesstat可被用於找出如下型別session:

    1. 高資源佔用
    2. 高平均資源佔用比(登陸後資源使用率)
    3. 預設資源佔用比(兩快照之間)

 

在V$SESSTAT中使用統計

多數v$sesstat中的統計參考是v$sysstat描述的子集,包括session logical reads, CPU used by this session, db block changes, redo size, physical writes, parse count (hard), parse count (total), sorts (memory), and sorts (disk).

 

V$SESSTAT常用列說明

    1. SID:session唯一ID
    2. STATISTIC#:資源唯一ID
    3. VALUE:資源使用

 

 

示例1:下列找出當前session中最高的logical和Physical I/O比率.

 

下列SQL語句顯示了所有連線到資料庫的session邏輯、物理讀比率(每秒)。logical和physical I/O比率是通過自登陸後的時間消耗計算得出。對於sessions連線到資料庫這種長週期操作而言也許不夠精確,不過做個示例卻足夠了。

 

先獲得session邏輯讀和物理讀統計項的STATISTIC#值:

SELECT name, statistic#

  FROM V$STATNAME

  WHERE name IN ('session logical reads','physical reads') ;

NAME                           STATISTIC#

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

session logical reads                   9

physical reads                         40

 

通過上面獲得的STATISTIC#值執行下列語句:

 

SELECT ses.sid

     , DECODE(ses.action,NULL,'online','batch')          "User"

     , MAX(DECODE(sta.statistic#,9,sta.value,0))

       /greatest(3600*24*(sysdate-ses.logon_time),1)     "Log IO/s"

     , MAX(DECODE(sta.statistic#,40,sta.value,0))

       /greatest(3600*24*(sysdate-ses.logon_time),1)     "Phy IO/s"

     , 60*24*(sysdate-ses.logon_time)                    "Minutes"

 FROM V$SESSION ses

    , V$SESSTAT sta

WHERE ses.status     = 'ACTIVE'

  AND sta.sid        = ses.sid

  AND sta.statistic# IN (9,40)

GROUP BY ses.sid, ses.action, ses.logon_time

ORDER BY

        SUM( DECODE(sta.statistic#,40,100*sta.value,sta.value) )

      / greatest(3600*24*(sysdate-ses.logon_time),1)  DESC;

 

  SID User   Log IO/s Phy IO/s Minutes

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

 1951 batch       291    257.3       1

  470 online    6,161     62.9       0

  730 batch     7,568     43.2     197

 2153 online    1,482     98.9      10

 2386 batch     7,620     35.6      35

 1815 batch     7,503     35.5      26

 1965 online    4,879     42.9      19

 1668 online    4,318     44.5       1

 1142 online      955     69.2      35

 1855 batch       573     70.5       8

 1971 online    1,138     56.6       1

 1323 online    3,263     32.4       5

 1479 batch     2,857     35.1       3

  421 online    1,322     46.8      15

 2405 online      258     50.4       8

 

 

示例2:又例如通過v$sesstat和v$statname連線查詢某個SID各項資訊。

select a.*,b.name 

  from v$sesstat a,v$statname b

  where a.sid=15 and a.statistic#=b.statistic#;