1. 程式人生 > >oracle 響應時間分析 (一)

oracle 響應時間分析 (一)

響應時間作為一種資料庫效能的度量單位,在以前的版本中很難從資料庫角度提取出來,但是從10g之後這樣的度量單位變得更為簡單。

在過去DBA做效能分析主要依據的指標是響應時間度量和使用者活動情況,分析人員所面臨的問題就是如果確定應用系統的哪一部分消耗了大部分時間,以及客觀的反應使用者對系統的使用體驗。

OWI的出現猶如橫空出世的利器,幫助DBA診斷瓶頸,發現瓶頸。但是OWI還是不能更直觀的告訴使用者關於活動會話或事物交易能力評估。很幸運的時候10g之後資料庫中有關於會話和系統層面的響應時間相關的度量出現了。比如ADDM中有很多FINDING就已經給出官員響應時間的指標。10g提供的歷史回溯功能可以更有效的幫助dba對系統過去時刻出現的效能問題做出基於響應時間的趨勢分析。

系統級別分析

從全域性角度考慮3個問題

  1. 一般情況我們的資料庫執行效率如何,是如何定義效率的呢?
  2. 我們的使用者遭遇了什麼樣的平均響應時間?
  3. 系統中那些活動最影響系統的相應時間?

以上的疑問可以在10g中很高的通過METREC來回答。

--檢視整體情況

select METRIC_NAME, VALUE
  from SYS.V_$SYSMETRIC
 where METRIC_NAME IN
       ('Database CPU Time Ratio', 'Database Wait Time Ratio')
   AND INTSIZE_CSEC = (select max(INTSIZE_CSEC) from SYS.V_$SYSMETRIC);


--檢視最近一小時的

select to_char(end_time,'hh24:mi:ss'), value
  from sys.v_$sysmetric_history
 where metric_name = 'Database CPU Time Ratio'
 order by 1;

--總體上 最大,最小,平均
select CASE METRIC_NAME
         WHEN 'SQL Service Response Time' then
          'SQL Service Response Time (secs)'
         WHEN 'Response Time Per Txn' then
          'Response Time Per Txn (secs)'
         ELSE
          METRIC_NAME
       END METRIC_NAME,
       CASE METRIC_NAME
         WHEN 'SQL Service Response Time' then
          ROUND((MINVAL / 100), 2)
         WHEN 'Response Time Per Txn' then
          ROUND((MINVAL / 100), 2)
         ELSE
          MINVAL
       END MININUM,
       CASE METRIC_NAME
         WHEN 'SQL Service Response Time' then
          ROUND((MAXVAL / 100), 2)
         WHEN 'Response Time Per Txn' then
          ROUND((MAXVAL / 100), 2)
         ELSE
          MAXVAL
       END MAXIMUM,
       CASE METRIC_NAME
         WHEN 'SQL Service Response Time' then
          ROUND((AVERAGE / 100), 2)
         WHEN 'Response Time Per Txn' then
          ROUND((AVERAGE / 100), 2)
         ELSE
          AVERAGE
       END AVERAGE
  from SYS.V_$SYSMETRIC_SUMMARY
 where METRIC_NAME in
       ('CPU Usage Per Sec', 'CPU Usage Per Txn', 'Database CPU Time Ratio',
        'Database Wait Time Ratio', 'Executions Per Sec',
        'Executions Per Txn', 'Response Time Per Txn',
        'SQL Service Response Time', 'User Transaction Per Sec');

--可以從時間模型角度分析
select case db_stat_name
         when 'parse time elapsed' then
          'soft parse time'
         else
          db_stat_name
       end db_stat_name,
       case db_stat_name
         when 'sql execute elapsed time' then
          time_secs - plsql_time
         when 'parse time elapsed' then
          time_secs - hard_parse_time
         else
          time_secs
       end time_secs,
       case db_stat_name
         when 'sql execute elapsed time' then
          round(100 * (time_secs - plsql_time) / db_time, 2)
         when 'parse time elapsed' then
          round(100 * (time_secs - hard_parse_time) / db_time, 2)
         else
          round(100 * time_secs / db_time, 2)
       end pct_time
  from (select stat_name db_stat_name, round((value / 1000000), 3) time_secs
          from sys.v_$sys_time_model
         where stat_name not in ('DB time', 'background elapsed time',
                'background cpu time', 'DB CPU')),
       (select round((value / 1000000), 3) db_time
          from sys.v_$sys_time_model
         where stat_name = 'DB time'),
       (select round((value / 1000000), 3) plsql_time
          from sys.v_$sys_time_model
         where stat_name = 'PL/SQL execution elapsed time'),
       (select round((value / 1000000), 3) hard_parse_time
          from sys.v_$sys_time_model
         where stat_name = 'hard parse elapsed time')
 order by 2 desc;

--從event class角度瞭解系統
select to_char(a.end_time, 'DD-MON-YYYY HH:MI:SS') end_time,
       b.wait_class,
       round((a.time_waited / 100), 2) time_waited
  from sys.v_$waitclassmetric_history a, sys.v_$system_wait_class b
 where a.wait_class# = b.wait_class#
   and b.wait_class != 'Idle'
 order by 1, 2