方法1:
可以出相关的awr报表 通过SQL ordered by Elapesed Time 计算sql语句在10分钟内平均执行的次数,当然,这需要你手动的每十分钟执行一次手动创建快照,也可以使用exec dbms_workload_repostiory.modify_snapshot_settings(interval=>10,retention=>20160),控制快照自动生成时间,以及保留时间。awr报表中 sql统计信息,大多是一下 dba_hist_sqlstat、dba_hist_nampshot 联合查询得出的结果,但是并不是所有的sql执行都会被awr产生的快照所获取到,因为awr报表出现的语句就执行计划而言是最差的语句,执行次数频繁,消耗dbtime较高的语句,所以通过快照计算在10分钟内平均执行次数有局限性的,但是可以大体估算。
ELAPSED_TIME_DELTA (字段值说明) NUMBER Delta value of elapsed time (in microseconds) used by this cursor for parsing/executing/fetching
EXECUTIONS_DELTA(字段值说明) NUMBER Delta number of executions that took place on this object since it was brought into the library cache
SQL> select sum(nvl(executions_delta,0)) execs,(sum(elapsed_time_delta)/1000000) sumelapsed,
2 ((decode(sum(nvl(executions_delta,0)),0,1,sum(executions_delta)))/((sum(elapsed_time_delta)/1000000))) avg_etime
3 from DBA_HIST_SQLSTAT S, DBA_HIST_SNAPSHOT SS
4 where S.snap_id = SS.snap_id
5 and S.instance_number = SS.instance_number
6 and SS.begin_interval_time > to_date('2019-06-05 15:30:00','yyyy-mm-dd hh24:mi:ss')
7 and SS.begin_interval_time < to_date('2019-06-05 18:30:00','yyyy-mm-dd hh24:mi:ss')
8 and executions_delta > 0;
EXECS SUMELAPSED AVG_ETIME
---------- ---------- ----------
32049087 219146.314 146.245157
select sum(nvl(executions_delta,0)) execs,(sum(elapsed_time_delta)/1000000) sumelapsed,lta)/1000000))) avg_etime
((decode(sum(nvl(executions_delta,0)),0,1,sum(executions_delta)))/((sum(elapsed_time_delta)/1000000))) avg_etime
2 3 from DBA_HIST_SQLSTAT S, DBA_HIST_SNAPSHOT SS
4 where S.snap_id = SS.snap_id
5 and S.instance_number = SS.instance_number
6 and SS.begin_interval_time > to_date('2019-06-05 18:20:00','yyyy-mm-dd hh24:mi:ss')
7 and SS.begin_interval_time < to_date('2019-06-05 18:30:00','yyyy-mm-dd hh24:mi:ss')
8 and executions_delta > 0
9 ;
EXECS SUMELAPSED AVG_ETIME
---------- ---------- ----------
SQL>
例外:通过查询v$sqlarea或者v$sql相关的字段,来查看sql的执行次数,但是需要结合first_load_time 来判断的。这两个视图当中不保存历史数据,要查很久前的sql执行次数是做不到了,但是如果清空了共享池,对应的executions就会清零的。
select sql_id,sql_text,first_load_time,exectuions from v$sqlarea where sql_text like "------";
方法二:
使用视图v$sysstat,desc v$sysstat,,v$sysstat存储实例运行那刻起就开始累计全实例(instance-wide)的资源使用情况。
The CLASS
column contains a number representing one or more statistics classes. The following class numbers are additive:
-
1, User
-
2, Redo
-
4, Enqueue
-
8, Cache
-
16, OS
-
32, Real Application Clusters
-
64, SQL
-
128, Debug
该视图中数据常被用于监控系统性能。如buffer cache命中率、软解析率等都可从该视图数据计算得出。该视图中的数据也被用于监控系统资源使用情况,以及系统资源利用率的变化。正因如此多的性能数据,检查某区间内系统资源使用情况可以这样做,在一个时间段开始时创建一个视图数据快照,结束时再创建一个,二者之间各统计项值的不同(end value - begin value)即是这一时间段内的资源消耗情况。
如果计算数据库在10秒内平均sql执行次数可以使用name中'execute count'、'stat_id',
execute count | 64 | Total number of calls (user and recursive) that executed SQL statements |
|
| Identifier of the statistic |
执行一下语句
select * from v$sysstat where name ='execute count'
十分钟之后再执行一次,然后把stat_id的值相减,再除以600.后就是十分钟内每秒sql的执行次数。