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;
相关文章
|
11月前
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
671 8
|
SQL Oracle 关系型数据库
解决大小写、保留字与特殊字符问题!Oracle双引号在SQL中的特殊应用
在Oracle数据库开发中,双引号的使用是一个重要但易被忽视的细节。本文全面解析了双引号在SQL中的特殊应用场景,包括解决标识符与保留字冲突、强制保留大小写、支持特殊字符和数字开头标识符等。同时提供了最佳实践建议,帮助开发者规避常见错误,提高代码可维护性和效率。
710 6
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
|
SQL Oracle 关系型数据库
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
本文来自YashanDB官网,介绍如何处理Oracle客户端sql*plus中使用@@调用同级目录SQL脚本的场景。崖山数据库23.2.x.100已支持@@用法,但旧版本可通过Python脚本批量重写SQL文件,将@@替换为绝对路径。文章通过Oracle示例展示了具体用法,并提供Python脚本实现自动化处理,最后调整批处理脚本以适配YashanDB运行环境。
|
SQL 监控 Oracle
Oracle SQL性能优化全面指南
在数据库管理领域,Oracle SQL性能优化是确保数据库高效运行和数据查询速度的关键
1915 6
|
SQL 关系型数据库 Oracle
ORACLE SQL优化之ORA-03150&ORA-02055&ORA-02063
                                                                                                             >   
5186 0
|
SQL Oracle 关系型数据库
Oracle SQL优化之多表连接
Oracle SQL优化之多表连接
926 0
Oracle SQL优化之多表连接
|
SQL 存储 Oracle
Oracle数据库 | SQL语句执行计划、语句跟踪与优化实例
Oracle数据库 | SQL语句执行计划、语句跟踪与优化实例
608 0

推荐镜像

更多