在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语句执行了多少次,那么必须在这两个时间段执行上面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;

 

参考资料:

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

ORACLE查看SQL的执行次数/频率的更多相关文章

  1. PLSQL_查询SQL的执行次数和频率(案例)

    2014-12-25 Created By BaoXinjian

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

    原文:PLSQL_监控有些SQL的执行次数和频率 2014-12-25 Created By 鲍新建

  3. Oracle查看SQL执行计划的方式

    Oracle查看SQL执行计划的方式     获取Oracle sql执行计划并查看执行计划,是掌握和判断数据库性能的基本技巧.下面案例介绍了多种查看sql执行计划的方式:   基本有以下几种方式: ...

  4. 查询oracle 数据库 SQL语句执行情况

    1.查看总消耗时间最多的前10条SQL语句 select *  from (select v.sql_id,  v.child_number,  v.sql_text,  v.elapsed_time ...

  5. SQL Server查看Sql语句执行的耗时和IO消耗

    原文:SQL Server查看Sql语句执行的耗时和IO消耗 在做系统过程中,经常需要针对某些场景进行性能优化,那么如何判定性能优化的效果呢?肯定需要知道优化之前Sql语句的耗时和优化之后Sql语句的 ...

  6. 转:Oracle中SQL语句执行过程中

    Oracle中SQL语句执行过程中,Oracle内部解析原理如下: 1.当一用户第一次提交一个SQL表达式时,Oracle会将这SQL进行Hard parse,这过程有点像程序编译,检查语法.表名.字 ...

  7. MySQL查看SQL语句执行效率

    Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好 ...

  8. MySQL查看SQL语句执行效率(转)

    Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好 ...

  9. 【Oracle】SQL/92 执行多个表的连接

    内连接 外连接 自连接 交叉连接 1.内连接 表名 INNER JOIN 表名 ON 条件 等价于: FROM 表名, 表名 WHERE 条件 SELECT p.name, pt.name, pt.p ...

随机推荐

  1. C语言 第八章 函数、指针与宏

    一.函数 函数是一个包含完成一定功能的执行代码段.我们可以把函数看成一个"黑盒子", 你只要将数据送进去就能得到结果, 而函数内部究竟是如何工作的的, 外部程序是不知道的.外部程序 ...

  2. 附录B 安装MySql数据库

    B.1  卸载旧的MaySql程序 第一步   查找以前是否安装有mysql 使用命令查看是否已经安装过mysql: #rpm -qa | grep -i mysql 如果没有结果,则可以进行mysq ...

  3. 走进vue.js(一)

    走进vue.js(一) vue.js作为目前最具前景的前端框架之一,既然如此,博主贯彻以往的作风,肯定要捣鼓一番,经过为期半个多月的研究,算是对vue有了深刻的理解与认识,下面分三个章节解开vue.j ...

  4. python mock基本使用

    什么是mock? mock在翻译过来有模拟的意思.这里要介绍的mock是辅助单元测试的一个模块.它允许您用模拟对象替换您的系统的部分,并对它们已使用的方式进行断言. 在Python2.x 中 mock ...

  5. mysql转换类型

    今天遇到一个问题,那就是当时一个项目设计表的时候,把时间以20160101123596这样的形式,以varchar存到了数据库里. 今天要写一条sql,查询一个报表,条件就是要过滤这个时间,但是var ...

  6. TCP三次握手和四次挥手状态变迁解析

    TCP是TCP/IP的传输层控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 首先需要了解几个名词:tcp标志位,有6种分别为:SYN(synchronous建立联机) .ACK(ackn ...

  7. 在SQL Serve里停用行和页层级锁

    今天我想谈下SQL Server里另一个非常有趣的话题:在SQL Server里停用行和页层级锁.在SQL Server里,每次你重建一个索引,你可以使用ALLOW_ROW_LOCKS 和ALLOW_ ...

  8. 【原创】Java编译器对String的优化

    首先看以下的代码: public static void main(String[] arge) { String str1 = new String("1234"); Strin ...

  9. 利用SHELL脚本实现文件完整性检测程序(1.2版更新)

    一..开发背景 因时势所逼,需要对服务器的文件系统实行监控.虽然linux下有不少入侵检测和防窜改系统,但都比较麻烦,用起来也不是很称手.自己琢磨着也不需要什么多复杂的功能,写个脚本应该就可以满足基本 ...

  10. js正则表达式中test,exec,match方法的区别

    test test 返回 Boolean,查找对应的字符串中是否存在模式.var str = "1a1b1c";var reg = new RegExp("1." ...