码迷,mamicode.com
首页 > 数据库 > 详细

PLSQL_监控有些SQL的执行次数和频率

时间:2014-12-25 20:12:29      阅读:319      评论:0      收藏:0      [点我收藏+]

标签:

2014-12-25 Created By 鲍新建

技术分享一、摘要


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

如果执行频繁的SQL,往往容易遭遇一些并发性的问题。

那么如何查看ORACLE数据库某个SQL的执行频率/次数,潇湘隐者同学整理如下,借花献佛了 :)

 

方法1: 通过查询V$SQLAREA或V$SQL的EXECUTIONS来查看SQL的执行次数;

方法2:通过DBA_HIST_SQLSTAT关联DBA_HIST_SNAPSHOT找出某些SQL的执行次数;

方法3:AWR报告查看某个SQL的执行次数;

 

技术分享二、三种方法解析


1. 通过查询V$SQLAREA或V$SQL的EXECUTIONS来查看SQL的执行次数

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

(2). 关于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

(3). 如何查询

SELECT SQL_ID, SQL_TEXT,FIRST_LOAD_TIME, EXECUTIONS
FROM V$SQLAREA
WHERE SQL_ID = 497wh6n7hu14f

技术分享

(4). 总结

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

如果要查看某个时间段该SQL语句执行了多少次,那么必须在这两个时间段执行上面SQL语句,两次EXECUTIONS的差值表示这段时间内SQL语句的执行次数。

EXECUTIONS是全局的,往往不能查看某个会话或用户执行了多少次。这也是其局限性之一。

 

2. 通过DBA_HIST_SQLSTAT关联DBA_HIST_SNAPSHOT找出某些SQL的执行次数。

(1). 缺点:但是部分快照如果没有捕获到有些SQL。这样也就无法通过下面SQL语句查看执行次数。

              也是就说这种方法是有缺陷的。执行越频繁的语句,也越容易被SNAPSHOT抓取到.

(2). 执行语法:

  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-12-25
           AND M.SQL_ID = 497wh6n7hu14f
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

 

4. 查看当前数据库执行次数最多的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;

 

转载:潇湘隐者 - http://www.cnblogs.com/kerrycode/p/4111746.html (略加排版)

技术分享

PLSQL_监控有些SQL的执行次数和频率

标签:

原文地址:http://www.cnblogs.com/eastsea/p/4185237.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!