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 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语句执行了多少次,那么必须在这两个时间段执行上面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语句。
EXECUTIONS,
RANK() OVER(ORDER BY EXECUTIONS DESC) EXEC_RANK
FROM V$SQLAREA)
WHERE EXEC_RANK = 15;
潇湘隐者 网名潇湘隐者/潇湘剑客、英文名Kerry,兴趣广泛,广泛涉猎,个性随意,不善言辞。执意做一名会写代码的DBA,混迹于IT行业
第十二届 BigData NoSQL Meetup — 基于hbase的New sql落地实践 立即下载
相关文章
- 将数据库从Oracle迁移到SQL Server
- PL/SQL Developer连接本地Oracle 11g 64位数据库
- .NET(C#) Dapper Oracle(ODP.NET)或SQL Server 执行多条查询(select)语句的方法代码
- DBA组下不同成员登录ORACLE的情况
- 《oracle每日一练》免安装Oracle客户端使用PL/SQL
- oracle sql语言模糊查询--通配符like的使用教程
- Oracle使用审计监控用户执行过的SQL语句
- Oracle常用系统查询SQL
- ^全^ 获取SQL SERVER2000/2005、MySql、Oracle元数据的SQL语句 [SQL语句来自CodeSmith]
- Oracle Linux (OEL)下修改tmpfs大小并使之生效
- [SQL] sql server中如何查看执行效率不高的语句
- Oracle-文件系统迁移到ASM
- Oracle创建简单视图案例
- Oracle的SQL*Plus工具中如何清屏
- Oracle与Sql Server差异点详解
- Oracle与SQL Server数据类型对应关系
- Oracle中添加虚拟列(emp是oracle自带表)
- 010-Hadoop Hive sql语法详解5-HiveQL与SQL区别
- Oracle 12c中SQLPlus操作使用(包含实验二ORACLE SQL*PLUS环境与查询的详细操作解释)
- oracle跨平台迁移表空间