oracle查询次数在两次以上,ORACLE查看SQL的执行次数/频率

ORACLE查看SQL的执行次数/频率

在ORACLE数据库应用调优中,一个SQL的执行次数/频率也是常常需要关注的,因为某个SQL执行太频繁,要么是由于应用设计有缺陷,需要在业务逻辑上做出优化处理,要么是业务特殊性所导致。如果执行频繁的SQL,往往容易遭遇一些并发性的问题。

那么如何查看ORACLE数据库某个SQL的执行频率/次数呢? 有哪些途径方法呢?

方法1: 通过查询V$SQLAREA或V$SQL的EXECUTIONS来查看SQL的执行次数,但是这个值的有效性需要结合FIRST_LOAD_TIME来判断。因为V$SQLAREA或V$SQL中不保存历史数据,具有一定的时效性,所以如果要查询很久以前的某个SQL执行次数是办不到的。

关于V$SQLAREA

FIRST_LOAD_TIME        VARCHAR2(19)       Timestamp of the parent creation time

EXECUTIONS             NUMBER             Total number of executions, totalled over all the child cursors

如下所示,我们通过一个例子来演示如何查询一个语句的执行次数。

SQL> COL  START_TIME FOR A20;

SQL> SELECT TO_CHAR(sysdate,'YYYY-MM-DD HH24:MI:SS') AS START_TIME FROM DUAL;

START_TIME--------------------2014-11-20 13:51:21

SQL>

SQL> SELECT SQL_ID, SQL_TEXT,FIRST_LOAD_TIME, EXECUTIONS

2  FROM V$SQLAREA

3  WHERE SQL_TEXT LIKE '%SELECT * FROM TEST%';

SQL_ID                 SQL_TEXT                   RST_LOAD_TIME    EXECUTIONS----------- -------------------------------------- ---------------- ----------

SQL> SELECT * FROM TEST;

ID NAME----------- ----------

SQL>

SQL> SELECT SQL_ID, SQL_TEXT,FIRST_LOAD_TIME, EXECUTIONS

2  FROM V$SQLAREA

3  WHERE SQL_TEXT LIKE '%SELECT * FROM TEST%';

SQL_ID                SQL_TEXT                   FIRST_LOAD_TIME    EXECUTIONS----------- -------------------------------------- -4ntr8ag38ujwd   SELECT * FROM TEST             2014-11-20/13:51:40      1

SQL> SELECT * FROM TEST;          ID NAME----------- ----------

SQL>

SQL> SELECT SQL_ID, SQL_TEXT,FIRST_LOAD_TIME, EXECUTIONS

2  FROM V$SQLAREA

3  WHERE SQL_TEXT LIKE '%SELECT * FROM TEST%';

SQL_ID                SQL_TEXT                 FIRST_LOAD_TIME   EXECUTIONS------------- -------------------------------- --4ntr8ag38ujwd      SELECT * FROM TEST                2014-11-20/13:51:40      2

如果此时清空共享池,那么你会发现V$SQLAREA中对应的SQL的EXECUTIONS次数清零了。

SQL> ALTER SYSTEM FLUSH SHARED_POOL;

System altered

SQL> SELECT * FROM TEST;

ID NAME----------- ----------

SQL>

SQL> SELECT SQL_ID, SQL_TEXT,FIRST_LOAD_TIME, EXECUTIONS

2  FROM V$SQLAREA

3  WHERE SQL_TEXT LIKE '%SELECT * FROM TEST%';

SQL_ID                SQL_TEXT                    FIRST_LOAD_TIME      EXECUTIONS------------- ----------------------------------- ----4ntr8ag38ujwd  SELECT * FROM TEST                2014-11-20/13:52:38     1

如果要查看某个时间段该SQL语句执行了多少次,那么必须在这两个时间段执行上面SQL语句,两次EXECUTIONS的差值表示这段时间内SQL语句的执行次数。EXECUTIONS是全局的,往往不能查看某个会话或用户执行了多少次。这也是其局限性之一。

方法2:通过DBA_HIST_SQLSTAT关联DBA_HIST_SNAPSHOT找出某些SQL的执行次数,但是部分快照如果没有捕获到有些SQL。这样也就无法通过下面SQL语句查看执行次数。也是就说这种方法是有缺陷的。执行越频繁的语句,也越容易被SNAPSHOT抓取到.

SELECT M.SQL_ID ,

TO_CHAR(N.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD')   "DATETIME",

SUM(M.EXECUTIONS_DELTA)  EXECUTIONS

FROM    DBA_HIST_SQLSTAT M, DBA_HIST_SNAPSHOT N

WHERE     M.SNAP_ID  = N.SNAP_ID  AND M.DBID = N.DBID  AND M.INSTANCE_NUMBER = N.INSTANCE_NUMBER  AND M.INSTANCE_NUMBER=1  AND                 TO_CHAR(N.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD') ='2014-11-20'  AND M.SQL_ID=&SQL_ID

GROUP     BY M.SQL_ID , TO_CHAR(N.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD')

ORDER     BY M.SQL_ID

方法3:AWR报告查看某个SQL的执行次数,同上面一样,AWR报告也受SNAPSHOT影响。不一定捕获了你需要查询的SQL

查看当前数据库执行次数最多的SQL,例如,查询执行最频繁的TOP 15的SQL语句。

SELECT SQL_TEXT, EXECUTIONS

FROM     (SELECT SQL_TEXT,

EXECUTIONS,

RANK() OVER(ORDER BY EXECUTIONS DESC) EXEC_RANK

FROM V$SQLAREA)

WHERE EXEC_RANK <= 15;

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值