[分享]ORACLE查看SQL的执行次数/频率_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2883 | 回复: 0   主题: [分享]ORACLE查看SQL的执行次数/频率        下一篇 
潇湘隐者
注册用户
等级:少校
经验:871
发帖:52
精华:2
注册:2014-3-29
状态:离线
发送短消息息给潇湘隐者 加好友    发送短消息息给潇湘隐者 发消息
发表于: IP:您无权察看 2014-11-20 23:20:03 | [全部帖] [楼主帖] 楼主

在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
EXECUTIONSNUMBERTotal number of executions, totalled over all the child cursors


如下所示,我们来看看如何查询一个语句的执行次数。

SQL> COLSTART_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
2FROM V$SQLAREA
3WHERE SQL_TEXT LIKE '%SELECT * FROM TEST%';
SQL_IDSQL_TEXTRST_LOAD_TIMEEXECUTIONS
----------- --------------------------------------------- ---------------------- ----------
SQL> SELECT * FROM TEST;
ID NAME
----------- ----------
SQL>
SQL> SELECT SQL_ID, SQL_TEXT,FIRST_LOAD_TIME, EXECUTIONS
2FROM V$SQLAREA
3WHERE SQL_TEXT LIKE '%SELECT * FROM TEST%';
SQL_IDSQL_TEXTFIRST_LOAD_TIMEEXECUTIONS
------------- -------------------------------------- --------------------------- ----------
4ntr8ag38ujwdSELECT * FROM TEST2014-11-20/13:51:401
SQL> SELECT * FROM TEST;
ID NAME
----------- ----------
SQL>
SQL> SELECT SQL_ID, SQL_TEXT,FIRST_LOAD_TIME, EXECUTIONS
2FROM V$SQLAREA
3WHERE SQL_TEXT LIKE '%SELECT * FROM TEST%';
SQL_IDSQL_TEXTFIRST_LOAD_TIMEEXECUTIONS
------------- -------------------------------------- ---------------------------- ----------
4ntr8ag38ujwdSELECT * FROM TEST2014-11-20/13:51:402


如果此时清空共享池,那么你会发现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
2FROM V$SQLAREA
3WHERE SQL_TEXT LIKE '%SELECT * FROM TEST%';
SQL_IDSQL_TEXTFIRST_LOAD_TIMEEXECUTIONS
------------- -------------------------------------- ------------------------------- ----------
4ntr8ag38ujwdSELECT * FROM TEST2014-11-20/13:52:381
SQL>


如果要查看某个时间段该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
GROUPBY M.SQL_ID , TO_CHAR(N.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD')
ORDERBY M.SQL_ID


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

查看当前数据库执行次数TOP 15的SQL语句。

SELECT SQL_TEXT, EXECUTIONS
FROM (SELECT SQL_TEXT,
EXECUTIONS,
RANK() OVER(ORDERBY EXECUTIONS DESC) EXEC_RANK
FROM V$SQLAREA)
WHERE EXEC_RANK <= 15;


参考资料:

http://www.itpub.net/thread-1320984-1-1.html




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论