理解EXECUTE_TO_PARSE(一)

redhouser發表於2011-06-02

問題:
    在分析AWR報告時,在Instance Efficiency Percentages (Target 100%)中有“Execute to Parse %”統計項,
而且該值一般並不是期望的接近100,一般達到60-70%都認為正常。
    本文透過如下方法,幫助進一步理解該引數:
   (一)分析STATSPACK中該引數計算方法
   (二)執行SQL,跟蹤會話統計資訊中相關統計項變化

1,計算公式,含義
在相關文件中查到該引數定義如下:
Execute to Parse % = 100% * (1 - Parses/Executions)

該引數是語句執行和分析了多少次的度量。可以這麼理解:
* 在一個分析,然後執行語句,且再也不在同一個會話中執行它的系統中,這個比值為0。
* 如果系統Parses > Executions,就可能出現該比率小於0的情況,該值<0通常說明shared pool設定或效率存在問題,造成反覆解析。
* 如果該值為負值或者極低,通常說明資料庫效能存在問題。

2,分析STATSPACK中該比值計算方法
2.1報表輸出項
$ORACLE_HOME/rdbms/admin/sprepins.sql:
select 'Instance Efficiency Indicators'                ch30n
      ,'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'                ch30n
      ,'            Buffer Nowait %:'                  ch28n
      , round(100*(1-:bfwt/:gets),2)                   pctval
      ,'      Redo NoWait %:'                          ch20
      , decode(:rent,0,to_number(null), round(100*(1-:rlsr/:rent),2))  pctval
      ,'            Buffer  Hit   %:'                  ch28n
      , round(100*(1 - :phyrc/:gets),2)                pctval
      ,' Optimal W/A Exec %:'                          ch20
      , decode((:srtm+:srtd),0,to_number(null),
                               round(100*:srtm/(:srtd+:srtm),2))       pctval
      ,'            Library Hit   %:'                  ch28n
      , round(100*:lhtr,2)                             pctval
      ,'       Soft Parse %:'                          ch20
      , round(100*(1-:hprs/:prse),2)                   pctval
      ,'         Execute to Parse %:'                  ch28n
      , round(100*(1-:prse/:exe),2)                    pctval
      ,'        Latch Hit %:'                          ch20
      , round(100*(1-:lhr),2)                          pctval
      ,'Parse CPU to Parse Elapsd %:'                  ch28n
      , decode(:prsela, 0, to_number(null)
                      , round(100*:prscpu/:prsela,2))  pctval
      ,'    % Non-Parse CPU:'                          ch20
      , decode(:tcpu, 0, to_number(null)
                    , round(100*(1-(:prscpu/:tcpu)),2))  pctval
  from sys.dual;

==>注意其中'Execute to Parse %:' 項:round(100*(1-:prse/:exe),2)

2.2獲取prse,exe數值:
$ORACLE_HOME/rdbms/admin/sprepins.sql:
begin
STATSPACK.STAT_CHANGES
(
 ...
 prse,
 ...
 exe,
 ...
);
...
end;
/

2.3檢視STATSPACK.STAT_CHANGES程式碼:
$ORACLE_HOME/rdbms/admin/spcpkg.sql:
procedure STAT_CHANGES:
begin
    ...
    prse   := SYSDIF('parse count (total)');
    ...
    exe    := SYSDIF('execute count');

    ...
end;
==>函式SYSDIF用於獲取統計資料之差,即v$sysstat中相關統計項兩次snap之間的差值
    
2.4相關統計項:
select * from v$statname where name in('parse count (total)','execute count');
STATISTIC# NAME CLASS STAT_ID
338 parse count (total) 64 63887964
342 execute count 64 2453370665

SELECT * FROM v$sysstat WHERE statistic# IN (342, 338);
STATISTIC# NAME CLASS VALUE STAT_ID
338 parse count (total) 64 109842769 63887964
342 execute count 64 181337684 2453370665

這裡:
parse count (total):解析次數,包括軟解析和硬解析
execute:執行次數,包括遞迴執行

 


 

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

相關文章