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

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

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

原文:PLSQL_监控有些SQL的执行次数和频率 2014-12-25 Created By 鲍新建 一.摘要 在ORACLE数据库应用调优中,一个SQL的执行次数/频率也是常常需要关注的,因为某个SQL执行太频繁,要么是由于应用设计有缺陷,需要在业务逻辑上做出优化处理,要么是业务特殊性所导致. 如果执行频繁的SQL,往往容易遭遇一些并发性的问题. 那么如何查看ORACLE数据库某个SQL的执行频率/次数,潇湘隐者同学整理如下,借花献佛了 :)   方法1: 通过查询V$SQLAREA或V$SQ

Oracle 历史SQL语句执行计划的对比与分析

    基于CBO优化器的环境中,SQL执行计划的生成依赖于统计信息的真实与完整.如列的离散度,列上的直方图,索引的可用性,索引上的聚簇因子.当这些信息是真实完整的情况下,CBO优化器通常都可以制定最优的执行计划.也正因此CBO优化器也灵活,难以控制,任一信息的不真实或缺失都可能导致执行计划发生变化而产生多个版本.经常碰到的情形是之前的某个SQL语句前阵子还不是TOP SQL,而最近变成了TOP SQL.或者说之前尽管是TOP SQL但,但最近尽然成了TOP 1.对于此情形,我们可以比对SQL语

mysql查看sql语句执行历史记录的例子

mysql查看sql语句执行历史记录  cat ~/.mysql_history 对于mysql版本5.1以后的版本,可以通过以下方式启动日志记录.能够记录下包括应用程序执行的sql语句. MariaDB [(none)]> SET GLOBAL log_output = 'TABLE'; Query OK, 0 rows affected (0.02 sec) MariaDB [(none)]> SET GLOBAL general_log = 'ON'; Query OK, 0 rows

Oracle的SQL语句执行效率问题查找与解决方法

一.识别占用资源较多的语句的方法(4种方法) 1.测试组和最终用户反馈的与反应缓慢有关的问题. 2.利用V_$SQLAREA视图提供了执行的细节.(执行.读取磁盘和读取缓冲区的次数) •数据列 EXECUTIONS:执行次数 DISK_READS:读盘次数 COMMAND_TYPE:命令类型(3:select,2:insert;6:update;7delete;47:pl/sql程序单元) OPTIMIZER_MODE:优化方式 SQL_TEXT:Sql语句 SHARABLE_MEM:占用sha

跟踪oracle中sql语句执行过程及相关知识拓展

select * from v$sqlarea; select * from v$sqlarea where first_load_time>'2010-11-27/09:30:00';         这个方法查询结果每条记录显示一条查询语句,且只能查询sql_text小于1000字符的,多余的会被截断.         改进一下: select * from v$sqlarea where first_load_time>'2010-11-27/09:30:00' and sql_text

SQL Server 中查看SQL句子执行所用的时间

复制代码 代码如下: set statistics profile on set statistics io on set statistics time on go 你执行的SQL语句 复制代码 代码如下: go set statistics profile off set statistics io off set statistics time off 执行完后点消息即可.

SQL Server 中查看SQL句子执行所用的时间_MsSql

复制代码 代码如下: set statistics profile on set statistics io on set statistics time on go 你执行的SQL语句 复制代码 代码如下: go set statistics profile off set statistics io off set statistics time off 执行完后点消息即可.

《Oracle PL/SQL程序设计(第5版)》一一1.4 关于PL/SQL的版本

1.4 关于PL/SQL的版本 Oracle PL/SQL程序设计(第5版) 每个版本的Oracle数据库都有其对应的PL/SQL版本.只要我们使用的是最新版的PL/SQL,就会有更多的功能供我们使用.作为PL/SQL程序员的最大挑战就是"紧跟".我们不需要不断地自学每个版本中的新特性─学会使用它们,尤其在我们自己的应用程序中该如何使用,确定有些新技术尤其有用,我们应该利用这些新技术修改已有的应用程序. 表1-1总结了数据库中每一版(过去的和当前的)PL/SQL的主要成员(注意在早期的

SQLServer 查看SQL语句的执行时间

  在MSSQL Server中通过查看SQL语句执行所用的时间,来衡量SQL语句的性能.  通过设置STATISTICS我们可以查看执行SQL时的系统情况.选项有PROFILE,IO ,TIME.介绍如下: SET STATISTICS PROFILE ON:显示分析.编译和执行查询所需的时间(以毫秒为单位). SET STATISTICS IO ON:报告与语句内引用的每个表的扫描数.逻辑读取数(在高速缓存中访问的页数)和物理读取数(访问磁盘的次数)有关的信息. SET STATISTICS