« 分析性能数据之一 »
DBA » http://www.anysql.net/dba/analyze_perf_data_one.html 2009-05-08Oracle中有很多的性能数据可以分析, 有些数据反应的不仅仅是数据库的, 而且可以反应出应用的或架构上的信息, 作为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执行量了, 算一下比例就是十分有用的信息.


学习了