您的位置:首页 > 数据库 > Oracle

统计Oracle 查询事务数的方法

2014-11-10 16:29 330 查看

执行下面语句:
SQL> select * from v$transaction;
no rows selected
SQL>

发现居然为空,why? 这时恍然大悟,v$transaction记录的是当前事务,下面来验证下:
SQL> conn test/test
bn/qbU0Connected.
&cj.`.VJ| y~0SQL>ITPUB个人空间d2W Ys:|3N

SQL>
.u G2u-V D0SQL> insert into ttt values('1','2','3','4','5');
1 row created.
SQL>

我们先不提交,这时看看v$transaction表的情况:
SQL> select XIDUSN,XIDSLOT,XIDSQN,STATUS from v$transaction;
XIDUSN XIDSLOT XIDSQN STATUS
,M`v4K4RQy0 ---------- ---------- ---------- ----------------ITPUB个人空间9@&?;h.re&hV2`

10 17 22579 ACTIVE
SQL>

发现已经 有了一个事务记录,这时我们commit
SQL> commit;
Commit complete.
SQL>

再来看看v$transaction表:
SQL> select XIDUSN,XIDSLOT,XIDSQN,STATUS from v$transaction;
no rows selected
SQL>

好,已经为空,正面v$transaction视图确实是记录 的是当前未提交事务

这个方法行不通,那我们还有什么好办法嗯?
这时,如果属性awr或者STATSPACK的朋友会说,报告里不是有个每秒事务数吗?
不错,确实有每秒事务数,可是我要查询的是每天的事务数,怎么办?
好,既然没秒的知道了,那每天的我*60*60*24 不就是每天的吗?
确实如此,我们分析一份报告看看:

Transactions:916.9   
我们看这个每秒的事务数是916.9 ,那么916.9*60*60*24=79220160,每天的事务数是79220160,到此我们介绍了查询每秒事务数的方法和查询每天事务数的方法。

还有没有第二种方法呢?

答案是必须的。

还是awr/STATSPACK报告,既然我们要查询的是事务数,那么事务数和什么有关系呢?当然是commit啦,如果我们知道了commit数,那么也就是变向知道了事务数,所以第二种方法还是在awr/STATSPACK报告里,这时相信有朋友已经想到了,不错和你想的一样就是

user commits827,280916.901.00
这时大家该有疑问了?
上面说每天79220160次 ,怎么现在变成827,280次了,不错,问的好!我前面没说这份报告取的是一天的,实际这份报告取的是15分钟零4秒的,那我们来算下:
828877.6 那为什么会多呢?因为916.9是四舍五入的。

好第二种方法介绍完

我就不卖官司了,下面给大家介绍第三种方法
我们用sql实现:

首先我们看看查询每秒事务数的sql写法:
SQL> col METRIC_UNIT for a30ITPUB个人空间7Q\ L9jA

SQL> select instance_number,
[RZ}8I)V7tg!J#MD0 2 metric_unit,ITPUB个人空间"e Q3O^7B$~.X

3 trunc(begin_time) time,
ds t^u,`/X)Q0 4 round(avg(average), 2) averageITPUB个人空间S#aX |/{|$I

5 from DBA_HIST_SYSMETRIC_SUMMARY
:A5f'T&L&e4A1M RXV0 6 where metric_unit = 'Transactions Per Second'
6A+@!mp,^e;~~5p0 7 and begin_time >=
yJ D1DZS0 8 to_date('2013-01-21 00:00:00', 'yyyy-mm-dd hh24:mi:ss')ITPUB个人空间 ozS@pe jvk

9 and begin_time < to_date('2013-01-22 00:00:00', 'yyyy-mm-dd hh24:mi:ss')ITPUB个人空间ypa4wfXX.^7]

10 group by instance_number, metric_unit, trunc(begin_time)
)~%]So.M0 11 order by instance_number;
INSTANCE_NUMBER METRIC_UNIT TIME AVERAGE
@ dN;|9q#ie5l/eV0--------------- ------------------------------ ------------ ----------
9{x3O{'no0c(p H0 1 Transactions Per Second 21-JAN-13 .17

测试环境空库,我们发现每秒事务数很少

下面是查询每天事务数:
SQL> select instance_number,ITPUB个人空间 q0AI!e!IS.V'm_m

2 metric_unit,
-E/o4W:JW3oNw7y8K0 3 trunc(begin_time) time,ITPUB个人空间7awsJ,ogGR~

4 avg(average)*60*60*24 "Transactions Per Day"ITPUB个人空间\)lQ3L`2De p

5 from DBA_HIST_SYSMETRIC_SUMMARYITPUB个人空间`!B\ck;U

6 where metric_unit = 'Transactions Per Second'ITPUB个人空间 C|"e@KR#@

7 and begin_time >=
.h}8I$wO{e9rw0 8 to_date('2013-01-21 00:00:00', 'yyyy-mm-dd hh24:mi:ss')ITPUB个人空间XH1_~UCEb

9 and begin_time < to_date('2013-01-22 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
f:w5^%^ w0 10 group by instance_number, metric_unit, trunc(begin_time)
)fd{|'d4t_q'C0 11 order by instance_number;
INSTANCE_NUMBER METRIC_UNIT TIME Transactions Per Day
;R+XK3]_ `0--------------- ------------------------------ ------------ --------------------ITPUB个人空间+i U0RY.KK)q~3]

1 Transactions Per Second 21-JAN-13 14727.5308

是否还有第四种方法呢?

不错确实有,请看官方文档:
http://docs.oracle.com/cd/B19306_01/em.102/b25986/oracle_database.htm

4.52.37 Number of Transactions (per second)

下面我把官方文档贴出来,大家共同学习:
DeltaCommits + DeltaRollbacks where:

DeltaCommits: difference of 'select value from v$sysstat where name='user commits'' between sample end and start

DeltaRollbacks: difference of 'select value from v$sysstat where name='user rollbacks'' between sample end and start

在2个时间段分别执行上面语句,把2个结果相减即可得出这段时间内的事务数。

根据这个方法,我写出查询某个用户的时间段内事务数的方法:

select s.USERNAME,sum(se.VALUE) "session transaction number",sum(sy.VALUE) "
database
transaction number" from v$session s,v$sesstat se,v$sysstat syITPUB个人空间)^yt]tCa!v

where s.sid=se.SID and se.STATISTIC#=sy.STATISTIC#ITPUB个人空间9b ]J P)pb9RA.I

and sy.NAME='user commits'ITPUB个人空间T/nWH:?Q{;r2H

and s.USERNAME=upper('&username')ITPUB个人空间;~0q,g2fa }2M

group by s.USERNAME;

使用方法和上面的一样,需要在2个时间段分别运行改脚本,把执行结果相减,即可得出该时间段内的事务数

文章来自:http://blog.163.com/yanenshun@126/blog/static/128388169201302793943909/

联系邮箱:qrcg92@foxmail.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle 事务