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;
参考资料:
http://www.itpub.net/thread-1320984-1-1.html
ORACLE查看SQL的执行次数/频率的更多相关文章
- PLSQL_查询SQL的执行次数和频率(案例)
2014-12-25 Created By BaoXinjian
- PLSQL_监控有些SQL的执行次数和频率
原文:PLSQL_监控有些SQL的执行次数和频率 2014-12-25 Created By 鲍新建
- Oracle查看SQL执行计划的方式
Oracle查看SQL执行计划的方式 获取Oracle sql执行计划并查看执行计划,是掌握和判断数据库性能的基本技巧.下面案例介绍了多种查看sql执行计划的方式: 基本有以下几种方式: ...
- 查询oracle 数据库 SQL语句执行情况
1.查看总消耗时间最多的前10条SQL语句 select * from (select v.sql_id, v.child_number, v.sql_text, v.elapsed_time ...
- SQL Server查看Sql语句执行的耗时和IO消耗
原文:SQL Server查看Sql语句执行的耗时和IO消耗 在做系统过程中,经常需要针对某些场景进行性能优化,那么如何判定性能优化的效果呢?肯定需要知道优化之前Sql语句的耗时和优化之后Sql语句的 ...
- 转:Oracle中SQL语句执行过程中
Oracle中SQL语句执行过程中,Oracle内部解析原理如下: 1.当一用户第一次提交一个SQL表达式时,Oracle会将这SQL进行Hard parse,这过程有点像程序编译,检查语法.表名.字 ...
- MySQL查看SQL语句执行效率
Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好 ...
- MySQL查看SQL语句执行效率(转)
Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好 ...
- 【Oracle】SQL/92 执行多个表的连接
内连接 外连接 自连接 交叉连接 1.内连接 表名 INNER JOIN 表名 ON 条件 等价于: FROM 表名, 表名 WHERE 条件 SELECT p.name, pt.name, pt.p ...
随机推荐
- 小菜学习Winform(一)贪吃蛇
前言 说到贪吃蛇,大家可能小时候都玩过,小菜最近在整理Winfrom的学习系列,那我觉得有兴趣才会有学习,就从这个小游戏讲起吧. 实现 其实我刚开始学习编程的时候,感觉写个贪吃蛇的程序会很难,因为涉及 ...
- [linux]如何为Virtualbox虚拟硬盘扩容(转载)
前言 这个教程介绍如何为Virtualbox虚拟硬盘扩容,虚拟硬盘分为动态分配大小和固定虚拟硬盘,扩容的方法不一样: 如何为动态分配的Virtualbox虚拟硬盘扩容 如何为固定大小的Virtualb ...
- GeoServer中利用SLD配图之矢量图层配图
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1 背景 我们在ArcMap中可以直接通过symbol功能对图层进行定 ...
- 【Android】直播必备之YUV使用总结 —— Android常用的几种格式:NV21/NV12/YV12/YUV420P的区别
说明 因工作方面接触到图像处理这一块,需要对手机摄像头采集的原始帧做Rotate或者Scale,但无奈对此的了解少之又少,于是网上搜了一顿,完事后将最近所学总结一下,以方便之后的人别踩太多坑. 首先想 ...
- c++之字符型中的特殊字符回车符
1.字符型的应用之强制类型转换: #include<iostream> using namespace std; int main() { ;i<;i++) { cout<&l ...
- ThinkPHP学习(一)
下载3.2框架后,解压缩到web目录下面,可以看到初始的目录结构如下: 3.2版本相比之前的版本自带了一个完整的应用目录结构和默认的应用入口文件,开发人员可以在这个基 础之上灵活调整.其中, Appl ...
- web前端学习随笔
为什么是随笔 好好算下来,学习web前端已有半个月了,这半个月来主要学习的是HTML和CSS部分,期间有困惑,也有解决困惑时的快感,所以想把这段时间感受到的一些东西记下来,因为内容比较杂,所以干脆叫随 ...
- Sql Server之使用T_SQL创建,修改,查看数据库信息
一.使用Transact_SQL创建数据库 Transact_SQL语法如下: create database database_name [ on [primary] [<fi ...
- 【Python实战】Django建站笔记
前一段时间,用Django搭建一个报表分析的网站:借此正好整理一下笔记. 1. 安装 python有包管理工具pip,直接cd Python27/Scripts,输入 pip install djan ...
- .NET Task揭秘(一)
Task为.NET提供了基于任务的异步模式,它不是线程,它运行在线程池的线程上.本着开源的精神, 本文以解读基于.NET4.5 Task源码的方式来揭秘Task的实现原理. Task的创建 Tas ...