Database realtime monitoring

来源:互联网 发布:宏程序车螺纹编程实例 编辑:程序博客网 时间:2024/04/29 16:55

create or replace type MySysstat as object (
  REDO_BLOCKS NUMBER,
  LOGICAL_READS NUMBER,
  BLOCK_CHANGES NUMBER,
  PHYSICAL_READS NUMBER,
  PHYSICAL_WRITES NUMBER,
  USER_CALLS NUMBER,
  PARSES NUMBER,
  HARD_PARSES NUMBER,  
  SORTS_MEM NUMBER,
  SORTS_DD NUMBER,
  LOGONS NUMBER,
  EXECUTES NUMBER,
  TRANSACTIONS NUMBER,
  CHANGES_PER_READ NUMBER,
  RECURSIVE NUMBER,
  ROLLBACKS NUMBER,
  ROWS_PER_SORT NUMBER,
  CPU_PER_ELAPSED NUMBER,
  BUFFER_HIT NUMBER);

create or replace type MyTabSysstat as table of MySysstat;

create or replace function getstats_fnc(cnt number default -1, s_wait number default 30) return MyTabSysstat pipelined as
    cursor cur is
    select name, value
    from v$sysstat
    where name in (
      'redo size','redo blocks written','session logical reads',
      'db block changes','physical reads','physical writes',
      'user calls','parse count (total)','parse count (hard)',
      'sorts (memory)','sorts (disk)','logons cumulative',
      'execute count','user rollbacks','user commits',
      'recursive calls','sorts (rows)','CPU used by this session',
      'consistent gets','db block gets', 'physical reads direct'
      );
  type enr_type is table of cur%rowtype index by varchar2(64) ;
  enr enr_type;
  enr_temp cur%rowtype;
  enr_old enr_type;
  i number:=0;
  v_date_old date := sysdate;
  v_date date := sysdate;
  v_rows_per_sort number;
  v_rollbacks number;
  v_sqlcode number;
begin
  loop
    exit when i=cnt+1;
    open cur;
    loop
      exit when cur%notfound;
      fetch cur into enr_temp;
      enr(enr_temp.name).name := enr_temp.name;
      enr(enr_temp.name).value:= enr_temp.value;
    end loop;
    close cur;
    if i!=0 then
      if enr('sorts (memory)').value-enr_old('sorts (memory)').value+
               enr('sorts (disk)').value-enr_old('sorts (disk)').value=0 then
        v_rows_per_sort:=null;
      else
        v_rows_per_sort:= (enr('sorts (rows)').value-enr_old('sorts (rows)').value)/
                   (enr('sorts (memory)').value-enr_old('sorts (memory)').value+
                    enr('sorts (disk)').value-enr_old('sorts (disk)').value);
      end if;
      if enr('user rollbacks').value-enr_old('user rollbacks').value+
                enr('user commits').value-enr_old('user commits').value=0 then
        v_rollbacks:= null;
      else
        v_rollbacks:= (enr('user rollbacks').value-enr_old('user rollbacks').value)/
            (enr('user rollbacks').value-enr_old('user rollbacks').value+
                enr('user commits').value-enr_old('user commits').value);
      end if;
      pipe row (MySysstat(
--      REDO_BLOCKS
        (enr('redo blocks written').value-enr_old('redo blocks written').value)/
                 ((v_date-v_date_old)*86400),
--      LOGICAL_READS
        (enr('session logical reads').value-enr_old('session logical reads').value)/
                 ((v_date-v_date_old)*86400),
--      BLOCK_CHANGES
        (enr('db block changes').value-enr_old('db block changes').value)/
                 ((v_date-v_date_old)*86400),
--      PHYSICAL_READS
        (enr('physical reads').value-enr_old('physical reads').value)/
                 ((v_date-v_date_old)*86400),
--      PHYSICAL_WRITES
        (enr('physical writes').value-enr_old('physical writes').value)/
                 ((v_date-v_date_old)*86400),
--      USER_CALLS
        (enr('user calls').value-enr_old('user calls').value)/
                 ((v_date-v_date_old)*86400),
--      PARSES
        (enr('parse count (total)').value-enr_old('parse count (total)').value)/
                 ((v_date-v_date_old)*86400),
--      HARD_PARSES
        (enr('parse count (hard)').value-enr_old('parse count (hard)').value)/
                 ((v_date-v_date_old)*86400),
--      SORTS_MEM
        (enr('sorts (memory)').value-enr_old('sorts (memory)').value)/
                 ((v_date-v_date_old)*86400),
--      SORTS_DD
        (enr('sorts (disk)').value-enr_old('sorts (disk)').value)/
                 ((v_date-v_date_old)*86400),
--      LOGONS
        (enr('logons cumulative').value-enr_old('logons cumulative').value)/
                 ((v_date-v_date_old)*86400),
--      EXECUTES
        (enr('execute count').value-enr_old('execute count').value)/
                 ((v_date-v_date_old)*86400),
--      TRANSACTIONS
        (enr('user rollbacks').value-enr_old('user rollbacks').value+
                 enr('user commits').value-enr_old('user commits').value)/
                 ((v_date-v_date_old)*86400),
--      CHANGES_PER_READ
        (enr('db block changes').value-enr_old('db block changes').value)/
                  (enr('session logical reads').value-enr_old('session logical reads').value),
--      RECURSIVE
        (enr('recursive calls').value-enr_old('recursive calls').value)/
                  (enr('recursive calls').value-enr_old('recursive calls').value+
                   enr('user calls').value-enr_old('user calls').value),
--      ROLLBACKS
        v_rollbacks,
--      ROWS_PER_SORT
        v_rows_per_sort,
--      CPU_PER_ELAPSED
        (enr('CPU used by this session').value-enr_old('CPU used by this session').value)/
                 ((v_date-v_date_old)*86400),
--      BUFFER_HIT
        (1 - ((enr('physical reads').value-enr_old('physical reads').value-
              (enr('physical reads direct').value-enr_old('physical reads direct').value) )/
                 ((enr('db block gets').value-enr_old('db block gets').value)+
                  (enr('consistent gets').value-enr_old('consistent gets').value)-
                  (enr('physical reads direct').value-enr_old('physical reads direct').value))))*100
          ));
    end if;
    dbms_lock.sleep(s_wait);
    v_date_old:= v_date;
    enr_old:= enr;
    v_date:= sysdate;
    i:=i+1;
  end loop;
  return;
exception
when others then
  v_sqlcode:= sqlcode;
  if v_sqlcode = -1013 then null;
  else raise;
  end if;
  return;
end;
 

 

 

output::

SQL> connect perfstat/perfstatConnected.SQL> set linesize 200SQL> set array 1SQL> COL REDO_BLOCKS FOR 999.99 heading 'Redo/s'SQL> COL LOGICAL_READS FOR 99,999 heading 'L-Rd/s'SQL> COL BLOCK_CHANGES FOR 9,999 heading 'B-Chg/s'SQL> COL PHYSICAL_READS FOR 9,999 heading 'P-Rd/s'SQL> COL PHYSICAL_WRITES FOR 9,999 heading 'P-Wrt/s'SQL> COL USER_CALLS FOR 9,999 heading 'U-Cal/s'SQL> COL PARSES FOR 9,999 heading 'Parse/s'SQL> COL HARD_PARSES FOR 99.9 heading 'H-Par/s'SQL> COL SORTS_MEM FOR 999 heading 'M-Srt/s'SQL> COL SORTS_DD FOR 99.9 heading 'D-Srt/s'SQL> COL LOGONS FOR 99 heading 'Log/s'SQL> COL EXECUTES FOR 999 heading 'Ex/s'SQL> COL TRANSACTIONS FOR 999 heading 'TX/s'SQL> COL CHANGES_PER_READ FOR 9.99 heading 'Chge/Rd'SQL> COL RECURSIVE FOR 9.99 heading 'Rcr/Ex'SQL> COL ROLLBACKS FOR .99 heading 'RB/TX'SQL> COL ROWS_PER_SORT FOR 9,999 heading 'Rows/Sort'SQL> COL CPU_PER_ELAPSED FOR 99.99 heading 'CPU/s'SQL> COL BUFFER_HIT FOR 999 heading 'Buf-H%'SQL>SQL> select * from table(cast(getstats_fnc(100, 2) as MyTabSysstat)); Redo/s  L-Rd/s B-Chg/s P-Rd/s P-Wrt/s U-Cal/s Parse/s H-Par/s M-Srt/s D-Srt/s Log/s Ex/s TX/s Chge/Rd Rcr/Ex RB/TX Rows/Sort  CPU/s Buf-H%------- ------- ------- ------ ------- ------- ------- ------- ------- ------- ----- ---- ---- ------- ------ ----- --------- ------ ------    .00   3,733       0  3,728       6       1       0      .0       0      .0     0    1    0     .00    .96                    .00      0   1.00   2,853       0  2,839       0      16       7      .0       3      .0     0   11    0     .00    .81               9    .50      1    .00   2,736       0  2,744       0       0       0      .0       0      .0     0    1    0     .00   1.00                    .00     -0....           
原创粉丝点击