链接:http://www.xifenfei.com/699.html

标题:oracle 中如何定位重要(消耗资源多)的SQL

作者:惜分飞©版权所有[文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.]

1、查看值得怀疑的SQL

select substr(to_char(s.pct,'99.00'),2)||'%'load,
       s.executions executes,
       p.sql_text
from(select address,
               disk_reads,
               executions,
               pct,
               rank()over(order by disk_reads desc) ranking
         from(select address,
                       disk_reads,
                       executions,
                      100*ratio_to_report(disk_reads)over() pct
                 from sys.v_$sql
                where command_type!=47)
        where disk_reads>50*executions) s,
       sys.v_$sqltext p
where s.ranking<=5
  and p.address=s.address
order by 1, s.address, p.piece;

2、查看消耗内存多的sql

select b.username,
       a. buffer_gets,
       a.executions,
       a.disk_reads / decode(a.executions, 0, 1, a.executions),
       a.sql_text SQL
  from v$sqlarea a, dba_users b
 where a.parsing_user_id = b.user_id
   and a.disk_reads > 10000
 order by disk_reads desc;

3、查看逻辑读多的SQL

select*
from(select buffer_gets, sql_text
         from v$sqlarea
        where buffer_gets>500000
        order by buffer_gets desc)
where rownum<=30;

4、查看执行次数多的SQL

select sql_text, executions
  from (select sql_text, executions from v$sqlarea order by executions desc)
 where rownum < 81;

5、查看读硬盘多的SQL

select sql_text, disk_reads
from(select sql_text, disk_reads from v$sqlarea order by disk_reads desc)
where rownum<21;

6、查看排序多的SQL

select sql_text, sorts
from(select sql_text, sorts from v$sqlarea order by sorts desc)
where rownum<21;

7、分析的次数太多,执行的次数太少,要用绑变量的方法来写sql

select substr(sql_text, 1, 80) "sql", count(*), sum(executions) "totexecs"
  from v$sqlarea
 where executions < 5
 group by substr(sql_text, 1, 80)
having count(*) > 30
 order by 2;
定位重要(消耗资源多)的SQL语句  
1、statspack-- 在你库上业务最忙得时候抓15分钟的report,看里面的top sql 1 top找到消耗资源多的pid
 
2 确定是oracle的应用进程还是后台进程
 
3 根据v$session,v$process,v$sqlarea定位
 
用oem带的top session  www.2cto.com  
 
SELECT hash_value, executions, buffer_gets, disk_reads, parse_calls
 
FROM V$SQLAREA
 
WHERE buffer_gets > 10000000 OR disk_reads > 1000000
ORDER BY buffer_gets + 100 * disk_reads DESC

v$sql,v$sqlarea,v$sqltext有什么区别

 
共同点:
1)都存储了sql内容
2) 记录的都是位于内存中的sql内容
3) 因为是内存,所以都不保留历史记录
不同点:
1)存储的为止不都是相同。其中v$sql和v$sqlarea存储的sql都是位于shared sql area中的sql,而v$sqltext是位于sga中的sql。但文档没有明确说明这里的sga是否还包含了psa(私有sql区域--共享服务器模式下)。
2)存储sql的方式也不同,v$sql和v$sqlarea都是用一行来存储sql全文,而v$sqltext用一行存储sql的一行。
3)v$sql不存储包含group by 的sql语句。通常这个视图,在每个查询执行完成后更新,但对于执行很久的sql,它是每5秒更新一次,这点对于查看sql执行状态是有意义的。
4)存储的明细不同--这是最基本的。
V$SQL 在子游标级别上列出了在共享sql区域的统计信息,他将原始sql文本展现为一行。V$SQL中的视图信息一般在sql执行的最后进行更新。然而,对于长 时间执行的sql,每5秒会更新一次v$sql视图。这使得很容易查看长时间执行的sql在运行过程中带来的影响。
v$sql列说明,如没有特别说明,均指子游标,存储的是具体的SQL 和执行计划相关信息,实际上,v$sqlarea 可以看做 v$sql 根据 sqltext 等 做了 group by 之后的信息
SQL> desc v$sql 
Name Null? Type 
----------------------------------------- -------- ----------------------------
SQL_TEXT           //当前正在执行的游标的sql文本的前1000个字符
SQL_FULLTEXT       //CLOB类型 整个sql文本,不用借助于V$SQL_TEXT视图来查看整个文本
SQL_ID           //库缓存中的SQL父游标的标志
SHARABLE_MEM           //子游标使用的共享内存的大小,bytes
PERSISTENT_MEM           //子游标生存时间中使用的固定内存的总量,bytes
RUNTIME_MEM           //在子游标执行过程中需要的固定内存大小,bytes
SORTS           //子游标发生的排序数量
LOADED_VERSIONS          // 显示上下文堆是否载入,1是,0否
USERS_OPENING          // 执行这个sql的用户数
FETCHES          // sql取数据的次数
EXECUTIONS           //自从被载入共享池后,sql执行的次数 
FIRST_LOAD_TIME          // 父游标产生的时间戳
PARSE_CALLS           //解析调用的次数 
DISK_CALLS             //读磁盘的次数
DIRECT_WRITES           //直接写的次数
BUFFER_GETS           //直接从buffer中得到数据的次数
APPLICATION_WAIT_TIME          // 应用等待时间,毫秒
CONCURRENCY_WAIT_TIME           //并发等待时间,毫秒
USER_IO_WAIT_TIME           //用户IO等待时间
ROWS_PROCESSED SQL           //解析sql返回的总行数
OPTIMIZER_MODE           //优化器模式
OPTIMIZER_COST           //优化器对于sql给出的成本
PARSING_USER_ID           //第一个创建这个子游标的用户id
HASH_VALUES           //解析产生的哈希值
CHILD_NUMBER           //该子游标的数量
SERVICE           //服务名
CPU_TIME           //该子游标解析,执行和获取数据使用的CPU时间,毫秒
ELAPSED_TIME           //sql的执行时间,毫秒
INVALIDATIONS           //该子游标的无效次数
MODULE       //第一次解析该语句时,通过DBMS_APPLICAITON_INFO.SET_ACTION设置的模块名
ACTION      //第一次解析该语句时,通过DBMS_APPLICAITON_INFO.SET_ACTION设置的动作名 
IS_OBSOLETE           //标记该子游标过期与否,当子游标过大时会发生这种情况
is_bind_sensitive           //不仅指出是否使用绑定变量窥测来生成执行计划,而且指出这个执行计划是否依赖于窥测到的值。如果是,这个字段会被设置为Y,否则会被设置为N。
is_bind_aware           //表明游标是否使用了扩展的游标共享。如果是,这个字段会被设置为Y,如果不是,这个字段会被设置为N。如果是设置为N,这个游标将被废弃,不再可用。
is_shareable           //表明游标能否被共享。如果可以,这个字段会被设置为Y,否则,会被设置为N。如果被设置为N,这个游标将被废弃,不再可用。

v$sqlarea的字段定义和v$sql基本一致,不同的是V$SQLAREA是在父游标级别上统计的sql信息,v$sql的汇总表,进行了group by hash_value,sql_id的汇总。

SQL> desc v$sqlarea 
Name Null? Type
SQL_TEXT VARCHAR2(1000) 
SHARABLE_MEM NUMBER 
PERSISTENT_MEM NUMBER 
RUNTIME_MEM NUMBER 
SORTS NUMBER 
VERSION_COUNT NUMBER 
LOADED_VERSIONS NUMBER 
OPEN_VERSIONS NUMBER 
USERS_OPENING NUMBER 
FETCHES NUMBER 
EXECUTIONS NUMBER 
USERS_EXECUTING NUMBER 
LOADS NUMBER 
FIRST_LOAD_TIME VARCHAR2(38) 
INVALIDATIONS NUMBER 
PARSE_CALLS NUMBER 
DISK_READS NUMBER 
BUFFER_GETS NUMBER 
ROWS_PROCESSED NUMBER 
COMMAND_TYPE NUMBER 
OPTIMIZER_MODE VARCHAR2(25) 
PARSING_USER_ID NUMBER 
PARSING_SCHEMA_ID NUMBER 
KEPT_VERSIONS NUMBER 
ADDRESS RAW(4) 
HASH_VALUE NUMBER 
MODULE VARCHAR2(64) 
MODULE_HASH NUMBER 
ACTION VARCHAR2(64) 
ACTION_HASH NUMBER 
SERIALIZABLE_ABORTS NUMBER 
CPU_TIME NUMBER 
ELAPSED_TIME NUMBER 
IS_OBSOLETE VARCHAR2(1) 
CHILD_LATCH NUMBER
v$sqltext
本视图包括Shared pool中SQL语句的完整文本,一条SQL语句可能分成多个块被保存于多个记录内。
注:V$SQLAREA和v$sql中的SQL_TEXT字段只包括头1000个字符, SQL_FULLTEXT以CLOB方式包含了所有的字符
V$SQLTEXT列说明
HASH_VALUE           SQL语句的Hash值
ADDRESS           sql语句在SGA中的地址
SQL_TEXT           SQL文本。
PIECE           SQL语句块的序号
SQL_ID           SQL id
COMMAND_TYPE             命令类型,如selectinsert

oracle 中如何定位重要(消耗资源多)的SQL的更多相关文章

  1. oracle 中如何定位重要(消耗资源多)的SQL【转】

    1.查看值得怀疑的SQL )||'%'load, s.executions executes, p.sql_text from(select address, disk_reads, executio ...

  2. log4j向oracle中插入一条系统当前时间的sql语句

    配置log4j,要向oracle插入一条系统当前时间的sql语句,按网上查找的总是出现各种各样的报错,最后总结出的写法是: ### shezhi### log4j.rootLogger = debug ...

  3. postgresql定位分析消耗CPU高的SQL语句

    第一步:使用TOP命令查看占用CPU高的postgresql进程,并获取该进程的ID号,如图该id号为3640 第二步:切换到postgres用户,并且psql连接到数据库,执行如下查询语句 SELE ...

  4. oracle中scott用户下四个基本表SQL语句练习

    --选择部门中30的雇员SELECT * from emp where DEPTNO=30;--列出所有办事员的姓名.部门.编号--采用内连接方式,也就是等值链接,也是最常用的链接SELECT ena ...

  5. 十分钟释疑Oracle中“小表超慢”之谜(SQL调优/SQL优化)

    前几天,一个用户找到我,说查一个小表的时候非常慢,我问有多慢,他说最快也得半个小时才能出结果,有时干脆不出结果,我说小表多大,他说就几十兆,有点疑惑,让他帮忙获取了相关信息,一看就明白了,原来所谓的小 ...

  6. 在oracle中操作数据——使用特点的格式插入日期 sql函数的使用——日期函数

    日期函数用于处理date类型的数据,默认情况下的日期格式是dd-mm-yy即12-7月-78 (1)sysdate:该函数返回系统时间 (2)add_months(d,n) (3)last_day(d ...

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

    select * from v$sqlarea; select * from v$sqlarea where first_load_time>'2010-11-27/09:30:00'; 这种方 ...

  8. Oracle中的内置函数在sql中的转换整理

    程序里面经常会即支持Oracle数据库,又支持sql数据库.而有些Oracle内置函数用的比较多,但在sql中语法有些不同,我做了些整理,希望可以帮助大家.... 1.oracle中的内置函数:ora ...

  9. ORACLE 如何定位消耗资源的SQL

    在分析SQL性能的时候,经常需要确定资源消耗多的SQL,总结如下: 1 查看值得怀疑的SQLselect substr(to_char(s.pct, '99.00'), 2) || '%' load, ...

随机推荐

  1. angularjs的路由ui.router

      <!-- 引入路由插件 --> <script src="vendor/angular-ui-router/release/angular-ui-router.min. ...

  2. 使用原子类或synchronized(没用Lock)解决阐述多线程所遇到线程安全问题和解决方案

    例子题目: 创建10个线程,每个线程执行10000次加1,输出总和 正常结果100000  但是如果出现线程不安全会低于100000 import java.util.concurrent.Count ...

  3. 得到某个method所在类

    System.out.println(this.getClass().getMethod("testPrivate"));//public void mypss.MyTest.te ...

  4. uiautomator 代码记录 : 随机发送短信

    package sms_test; import java.lang.*; import java.util.Random; import javax.microedition.khronos.egl ...

  5. File Input Features

    文件输入功能 1.该插件将将一个简单的 HTML 文件输入转换为高级文件选取器控件.将有助于对不支持 JQuery 或 Javascript 的浏览器的正常 HTML 文件输入进行回退. 2.文件输入 ...

  6. ck

    ck

  7. WebService简单教程

    一.简介 1.什么是WebService? WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Htt ...

  8. django之signal机制分析

    django的signal在djangobb中的使用: from django.db.models.signals import post_save from django.dispatch impo ...

  9. git 简单的操作命令

    1, 克隆已存在项目 => git clone url 2, 拉取代码 => git pull 3,  配置账号密码 git config --global user.email &quo ...

  10. 如何禁用Firefox,chrome浏览器“不安全密码警告”

    在任何HTTP页面中,一个全新的“不安全密码警告”将会在用户点击表单时直接出现在登陆框的下方,强行保证所有用户都能看到“此链接不安全,你的个人利益将受到损害”等字眼,同时整个页面也会收到损坏的挂锁图标 ...