1. 首页
  2. IT资讯

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/,如需转载,请注明出处,否则将追究法律责任。

主题测试文章,只做测试使用。发布者:布吉卡,转转请注明出处:http://www.cxybcw.com/195515.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code