统计Oracle 查询事务数的方法

     大家好!AningDBA又和大家见面了,今天朋友问我一个问题,把我给问住了,问题听起来很简单,就是查询“每天的事务数”。
 
     听到这个问题,大家的第一反映,我相信大部分人会和我一样,首先想到的是v$transaction,好,让我来和大家一起确认这个思路是否正确:
执行下面语句:
SQL> select * from v$transaction;
no rows selected
SQL>
 
发现居然为空,why? 这时恍然大悟,v$transaction记录的是当前事务,下面来验证下:
SQL> conn test/test
Connected.
SQL>
SQL>
SQL> 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
     ----------     ----------         ---------- ----------------
        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 a30
SQL> select instance_number,
  2         metric_unit,
  3         trunc(begin_time) time,
  4         round(avg(average), 2) average
  5    from DBA_HIST_SYSMETRIC_SUMMARY
  6   where metric_unit = 'Transactions Per Second'
  7     and begin_time >=
  8         to_date('2013-01-21 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
  9     and begin_time < to_date('2013-01-22 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
 10   group by instance_number, metric_unit, trunc(begin_time)
 11   order by instance_number;
INSTANCE_NUMBER METRIC_UNIT                    TIME            AVERAGE
--------------- ------------------------------ ------------ ----------
              1 Transactions Per Second        21-JAN-13           .17
 
测试环境空库,我们发现每秒事务数很少
 
下面是查询每天事务数:
SQL> select instance_number,
  2         metric_unit,
  3         trunc(begin_time) time,
  4         avg(average)*60*60*24 "Transactions Per Day"
  5    from DBA_HIST_SYSMETRIC_SUMMARY
  6   where metric_unit = 'Transactions Per Second'
  7     and begin_time >=
  8         to_date('2013-01-21 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
  9     and begin_time < to_date('2013-01-22 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
 10   group by instance_number, metric_unit, trunc(begin_time)
 11   order by instance_number;
INSTANCE_NUMBER METRIC_UNIT                    TIME         Transactions Per Day
--------------- ------------------------------ ------------ --------------------
              1 Transactions Per Second        21-JAN-13              14727.5308
 
是否还有第四种方法呢?
 
不错确实有,请看官方文档:
 
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 sy
where s.sid=se.SID and se.STATISTIC#=sy.STATISTIC#
and sy.NAME='user commits'
and s.USERNAME=upper('&username')
group by s.USERNAME;

 

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

 

 

 

 
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12457158/viewspace-752987/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12457158/viewspace-752987/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值