Oracle中有很多的性能数据可以分析, 有些数据反应的不仅仅是数据库的, 而且可以反应出应用的或架构上的信息, 作为DBA应当主动分析, 并提供给相关的人员, 以协助技术决策. 比如, 系统中会有很多种不同类型的应用服务器, 但数据库往往是少数几个, 在进行多机房应用及数据布局时, 就需要知道各个应用服务器和数据库的交互量, 同一个库上各个不同的应用发起的SQL的百分比.

    粗略一看, 好象DBA没有办法得到这些信息, 应当从应用日志中去统计分析. 在真实应用中, 大部份的数据库连接都是保持的, 也就是用了连接缓冲池, 会话不会经常断开重连, 因此可以通过会话级的统计值(execute count)得到上面的数据. 具体过程如下, 在一个可以查数据字典的用户下, 创建一个表来保留统计值信息.

create table TMP_SESSION_EXECUTES
(
    ID NUMBER(38),
    SID NUMBER(12),
    serial# number(12),
    machine varchar2(64),
    username varchar2(30),
    execute number(38)
);

    然后创建一个序列, 来表示一次收集的ID, 如下所示:

create sequence seq_temp_sesstat;

    执行以下代码几个小时, 就可以收集到不少数据, 足以进行上述分析了.

declare
  ver number:=0;
begin
loop
  select seq_temp_sesstat.nextval into ver from dual;
  insert into TMP_SESSION_EXECUTES
  select ver, a.sid,
    a.serial#, a.machine, a.username, b.value
  from v$session a, v$sesstat b
  where a.sid=b.sid
    and b.STATISTIC#=238;
  commit;
  dbms_lock.sleep(300);
end loop;
end;
/

    上面收集到的是累计值, 要前后两个ID相减计算差量值, 可用如下SQL语句.

SELECT MACHINE, USERNAME,  SUM(EXECUTE) EXECUTE
FROM (
SELECT A.MACHINE, A.USERNAME,
  A.EXECUTE - NVL(B.EXECUTE,0) EXECUTE
FROM TMP_SESSION_EXECUTES A, TMP_SESSION_EXECUTES B
WHERE A.ID=B.ID+1
  AND A.SID=B.SID
  AND A.SERIAL#=B.SERIAL#
  AND A.MACHINE=B.MACHINE
  AND A.USERNAME=B.USERNAME
  AND A.EXECUTE > NVL(B.EXECUTE,0) )
GROUP BY MACHINE, USERNAME

    这样就得到了在某个时间段内每台机器在某个用户下的SQL执行量了, 算一下比例就是十分有用的信息.