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

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

2014-12-25 Created By 鲍新建

一、摘要



在ORACLE数据库应用调优中,一个SQL的执行次数/频率也是常常需要关注的,因为某个SQL执行太频繁,要么是由于应用设计有缺陷,需要在业务逻辑上做出优化处理,要么是业务特殊性所导致。

如果执行频繁的SQL,往往容易遭遇一些并发性的问题。

那么如何查看ORACLE数据库某个SQL的执行频率/次数,潇湘隐者同学整理如下,借花献佛了 :)

 

方法1: 通过查询V$SQLAREA或V$SQL的EXECUTIONS来查看SQL的执行次数;

方法2:通过DBA_HIST_SQLSTAT关联DBA_HIST_SNAPSHOT找出某些SQL的执行次数;

方法3:AWR报告查看某个SQL的执行次数;

 

二、三种方法解析



1. 通过查询V$SQLAREA或V$SQL的EXECUTIONS来查看SQL的执行次数

(1). 缺点

但是这个值的有效性需要结合FIRST_LOAD_TIME来判断,因为V$SQLAREA或V$SQL中不保存历史数据,

具有一定的时效性,所以如果要查询很久以前的某个SQL执行次数是办不到的。

(2). 关于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

(3). 如何查询

SELECT SQL_ID, SQL_TEXT,FIRST_LOAD_TIME, EXECUTIONS
FROM V$SQLAREA
WHERE SQL_ID = '497wh6n7hu14f'

(4). 总结

如果此时清空共享池,那么你会发现V$SQLAREA中对应的SQL的EXECUTIONS次数清零了。

如果要查看某个时间段该SQL语句执行了多少次,那么必须在这两个时间段执行上面SQL语句,两次EXECUTIONS的差值表示这段时间内SQL语句的执行次数。

EXECUTIONS是全局的,往往不能查看某个会话或用户执行了多少次。这也是其局限性之一。

 

2. 通过DBA_HIST_SQLSTAT关联DBA_HIST_SNAPSHOT找出某些SQL的执行次数。

(1). 缺点

但是部分快照如果没有捕获到有些SQL。这样也就无法通过下面SQL语句查看执行次数。

也是就说这种方法是有缺陷的。执行越频繁的语句,也越容易被SNAPSHOT抓取到.

(2). 执行语法

  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-12-25'
           AND M.SQL_ID = '497wh6n7hu14f'
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

 

4. 查看当前数据库执行次数最多的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;

 

 

一、摘要



在做咨询时,经查遇到以前SQL的运行情况,和查询使用的条件

查询绑定变量时,有硬解析和软解析之分,如果是软解析,变量的值就很难找到了

查询绑定变量的几个视图如下:

  • 查询v$sql视图
  • 查询v$sql_bind_capture
  • 查询dba_hist_sqlbind
  • 查询wrh$sqlstat

 

二、查询v$sql视图



1. 查询bind_data

select sql_id, sql_text, bind_data, hash_value from v$sql where sql_text like '%select * from test where id1%';

它的记录频率受_cursor_bind_capture_interval 隐含参数控制,默认值900,表示每900秒记录一次绑定值,可以通过alter system set "_cursor_bind_capture_interval"=10;

2. bind_data

select dbms_sqltune.extract_binds(bind_data) bind from v$sql where sql_text like '%FROM TEST11%';

此时查询到的data值得形式是这样的:BEDA0B2002004F8482D10065FFFF0F000000003132303431313,需要通过dbms_sqltune.extract_binds进行转换

 

三、查询v$sql_bind_capture



通过v$sql_bind_capture视图,可以查看绑定变量,但是这个视图不太给力,只能捕获最后一次记录的绑定变量值。

而且两次捕获的间隔有一个隐含参数控制。默认是900秒,才会重新开始捕获。在900内,绑定变量值的改变不会反应在这个视图中。

10G以后可以通过如下方法查看AWR报告里记录的SQL的绑定变量值。

select value_string from v$sql_bind_capture where sql_id='abhf6n1xqgrr0';

 

四、查询dba_hist_sqlbind



10G以后可以通过如下方法查看AWR报告里记录的SQL的绑定变量值。

select snap_id, name, position, value_string,last_captured,WAS_CAPTURED  from dba_hist_sqlbind  where sql_id = '576c1s91gua19' and snap_id='20433';
----------snap_id, AWR报告的快照ID。
----------name, 绑定变量的名称
----------position,绑定值在SQL语句中的位置,以1,2,3进行标注
----------value_string,就是绑定变量值
----------last_captured,最后捕获到的时间
----------was_captured,是否绑定被捕获,where子句前面的绑定不进行捕获。

dba_hist_sqlbind视图强大的地方在于,它记录了每个AWR报告里的SQL的绑定变量值,当然这个绑定变量值也是AWR生成的时候从v$sql_bind_capture采样获得的。

通过这个视图,我们能够获得比较多的绑定变量值,对于我们排查问题,这些值一般足够了。

还有一个需要注意的地方是,这两个视图中记录的绑定变量只对where条件后面的绑定进行捕获,这点需要使用的时候注意。

查询 dba_hist_sqlbind value_string列

dba_hist_sqlbind是视图v$sql_bind_capture历史快照

 

五、查询wrh$sqlstat



两外一个查询绑定变量的视图

select dbms_sqltune.extract_bind(bind_data, 1).value_string
from wrh$_sqlstat
where sql_id = '88dz0k2qvg876'----------根据绑定变量的多少增加dbms_sqltune.extract_bind(bind_data, 2).value_string等

 

参考:aaaaaaaa2000 - http://blog.csdn.net/aaaaaaaa2000/article/details/7401110

参考:潇湘隐者 - http://www.cnblogs.com/kerrycode/p/4111746.html (略加排版)

 

时间: 2024-08-29 12:01:28

PLSQL_监控有些SQL的执行次数和频率的相关文章

ORACLE查看SQL的执行次数/频率

     在ORACLE数据库应用调优中,一个SQL的执行次数/频率也是常常需要关注的,因为某个SQL执行太频繁,要么是由于应用设计有缺陷,需要在业务逻辑上做出优化处理,要么是业务特殊性所导致.如果执行频繁的SQL,往往容易遭遇一些并发性的问题. 那么如何查看ORACLE数据库某个SQL的执行频率/次数呢? 有哪些途径方法呢?   方法1: 通过查询V$SQLAREA或V$SQL的EXECUTIONS来查看SQL的执行次数,但是这个值的有效性需要结合FIRST_LOAD_TIME来判 断.因为V

_awr_sql_child_limit是否能控制awr记录sql执行次数的问题

在ACOUG中国行长沙站的活动上分亨了一个关于high version count的主题,在活动中老盖提到在AWR报告的SQL ordered by Version Count部分,当SQL的version count大于等于200时就不会记录SQL的Executions,但是今天在优化SQL时仔细观察了一下情况并不是这样.以下是10.2.0.4的一个AWR报告的SQL ordered by Version Count 下面是11.2.0.1.0的一个AWR报告的SQL ordered by V

根据mysql慢日志监控SQL语句执行效率_Mysql

根据mysql慢日志监控SQL语句执行效率 启用MySQL的log-slow-queries(慢查询记录). 在Linux环境下先要找到my.cnf文件(一般在/etc/mysql/),然后可能会发现该文件修改后无法保存,原因是你没有相应的权限,可以从属性中看到该文件的所有者是root,这时要先以root的身份打开它: sudo nautilus /etc/mysql 接着再打开my.cnf文件然后找到[mysqld]标签在下面加上: log-slow-queries=/path/slow.lo

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

SQL Server 执行计划缓存

原文:SQL Server 执行计划缓存 标签:SQL SERVER/MSSQL SERVER/数据库/DBA/内存池/缓冲区 概述   了解执行计划对数据库性能分析很重要,其中涉及到了语句性能分析与存储,这也是写这篇文章的目的,在了解执行计划之前先要了解一些基础知识,所以文章前面会讲一些概念,学起来会比较枯燥,但是这些基础知识非常重要.   目录  概述  基础概念  怎样缓存执行计划  SQL Server自动删除执行计划  重新编译执行计划  测试  执行计划相关系统视图  手动清空缓存执

跟踪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的执行频率的方法

MySQL 客户端连接成功后,通过 show [session|global]status 命令 可以提供服务器状态信息,也可以在操作系统上使用 mysqladmin extended-status 命令获得这些消息. show [sessionglobal] status 可以根据需要加上参数" session "或者" global "来显示 session 级(当前连接)的统计结果和 global 级(自数据库上次启动至今)的统计结果.如果不写,默认使用参数是

如何了解SQL的执行频率

MySQL 客户端连接成功后,通过 show [session|global]status 命令 可以提供服务器状态信息,也可以在操作系统上使用 mysqladmin extended-status 命令获得这些消息. show [sessionglobal] status 可以根据需要加上参数" session "或者" global "来显示 session 级(当前连接)的统计结果和 global 级(自数据库上次启动至今)的统计结果.如果不写,默认使用参数是

LINQ to SQL的执行可能无法复用查询计划

查询计划 Sql Server在执行一条查询语句之前都对对它进行"编译 "并生成"查询计划",查询计划告诉Sql Server的查询引擎 应该用什么方式进行工作.Sql Server会根据当前它可以收集到的各种信息(例 如内存大小,索引的统计等等)把一条查询语句编译成它认为"最优 "的查询计划.很显然,得到这样一个查询计划需要消耗CPU资源,而大部 分的查询语句每次经过编译所得到的查询计划往往是相同的,因此除非指定了 RECOMPILE选项,Sq