-->寻找低效的SQL语句 ,下面的语句主要适用于从视图v$sqlarea中获得当前运行下且耗用buffer_gets较多的SQL语句                   
SELECT executions                                                                     
     , disk_reads                                                                    
     , buffer_gets                                                                  
     , ROUND( ( buffer_gets         
               - disk_reads )       
             / buffer_gets, 2 )      
          hit_ratio                                      
     , ROUND( disk_reads / executions, 2 ) reads_per_run                   
     , sql_text                                       
FROM   v$sqlarea                                                               
WHERE      executions > 0                                                   
       AND buffer_gets > 0                                               
       AND ( buffer_gets                                                    
            - disk_reads )                                                  
           / buffer_gets < 0.80                                                        
ORDER BY 4 DESC;

--查询低效的sql

SELECT EXECUTIONS, DISK_READS, BUFFER_GETS,
ROUND ((BUFFER_GETS-DISK_READS)/BUFFER_GETS, 2) Hit_radio,
ROUND (DISK_READS/EXECUTIONS, 2) Reads_per_run,
   SQL_TEXT
FROM   V$SQLAREA
WHERE  EXECUTIONS>0
AND  BUFFER_GETS > 0
AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8
ORDER BY 4 DESC;

1.查看总消耗时间最多的前10条SQL语句
 select *
from (select v.sql_id,
v.child_number,
v.sql_text,
last_load_time,
v.PARSING_USER_ID,
ROUND(v.ELAPSED_TIME / 1000000 / (CASE
               WHEN (EXECUTIONS = 0 OR NVL(EXECUTIONS, 1 ) = 1) THEN
                1
               ELSE
                EXECUTIONS
             END),
             2) "执行时间'S'",
 v.SQL_FULLTEXT,
v.cpu_time,
v.disk_reads,
rank() over(order by v.elapsed_time desc) elapsed_rank
from v$sql v  ) a
where elapsed_rank <= 100  and   last_load_time > to_char(sysdate - 1/1440, 'YYYY-MM-DD/HH:MI:SS')    order by "执行时间'S'" desc

查询最近一分钟内最慢的SQL:

select executions, cpu_time/1e6 as cpu_sec, elapsed_time/1e6 as elapsed_sec, round(elapsed_time/sqrt(executions)) as important, v.*
from v$sql v
where executions > 10 and last_load_time > to_char(sysdate - 1/1440, 'YYYY-MM-DD/HH:MI:SS')  
order by important desc

2.查看CPU消耗时间最多的前10条SQL语句
select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.cpu_time desc) elapsed_rank
from v$sql v) a
where elapsed_rank <= 10;

3.查看消耗磁盘读取最多的前10条SQL语句
select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.disk_reads desc) elapsed_rank
from v$sql v) a
where elapsed_rank <= 10;

一、查询执行最慢的sql
    
select *
 from (select sa.SQL_TEXT,
        sa.SQL_FULLTEXT,
        sa.EXECUTIONS "执行次数",
        round(sa.ELAPSED_TIME / 1000000, 2) "总执行时间",
        round(sa.ELAPSED_TIME / 1000000 / sa.EXECUTIONS, 2) "平均执行时间",
        sa.COMMAND_TYPE,
        sa.PARSING_USER_ID "用户ID",
        u.username "用户名",
        sa.HASH_VALUE
     from v$sqlarea sa
     left join all_users u
      on sa.PARSING_USER_ID = u.user_id
     where sa.EXECUTIONS > 0
     order by (sa.ELAPSED_TIME / sa.EXECUTIONS) desc)
 where rownum <= 50;

二、查询次数最多的 sql
    
select *
 from(selects.SQL_TEXT,
        s.EXECUTIONS"执行次数",
        s.PARSING_USER_ID"用户名",
        rank() over(orderbyEXECUTIONS desc) EXEC_RANK
     fromv$sql s
     leftjoinall_users u
      onu.USER_ID = s.PARSING_USER_ID) t
 whereexec_rank <= 100;

select * from v$sql_monitor where sql_text is not null;

select * from v$sql t
where t.LAST_ACTIVE_TIME>(sysdate - interval '1' MINUTE)  --执行1分钟内的SQL语句
--      and t.PARSING_SCHEMA_NAME = 'LSBIKE' --数据库
--      and (t.MODULE is null or t.MODULE not like '%PL/SQL%') --不是在某些终端里的执行
--      and lower(t.SQL_TEXT) like '%select%' --查询某类SQL语句
order by t.LAST_ACTIVE_TIME desc;

--TOP SQL
select *  
  from (select round(nvl((sqt.elap / 1000000), to_number(null)),2) "Elapsed Time (s)",  
              round( nvl((sqt.cput / 1000000), to_number(null)),2) "CPU Time (s)",  
               sqt.exec,  
               round(decode(sqt.exec,  
                      0,  
                      to_number(null),  
                      (sqt.elap / sqt.exec / 1000000)),2) "Elap per Exec (s)",  
               round((100 *  
               (sqt.elap / (select sum(e.value) - sum(b.value)  
                               from dba_hist_sys_time_model b,  
                                    dba_hist_sys_time_model e  
                              where b.snap_id = &beg_snap and  
                                    e.snap_id = &end_snap and  
                                    b.dbid = &dbid and  
                                    e.dbid = &dbid and  
                                    b.instance_number = &inst_num and  
                                    e.instance_number = &inst_num and  
                                    e.stat_name = 'DB time' and  
                                    b.stat_name = 'DB time'))) ,2)norm_val,  
               sqt.sql_id,  
               decode(sqt.module, null, null, 'Module: ' || sqt.module) SqlModule,  
               nvl(to_nchar(SUBSTR(st.sql_text,1,2000)) , (' ** SQL Text Not Available ** ')) SqlText  
          from (select sql_id,  
                       max(module) module,  
                       sum(elapsed_time_delta) elap,  
                       sum(cpu_time_delta) cput,  
                       sum(executions_delta) exec  
                  from dba_hist_sqlstat  
                 where dbid = &dbid and  
                       instance_number = &inst_num and  
                        snap_id > &beg_snap and  
                       snap_id <= &end_snap  
                 group by sql_id) sqt,  
               dba_hist_sqltext st  
         where st.sql_id(+) = sqt.sql_id and  
               st.dbid(+) = &dbid  
         order by nvl(sqt.elap, -1) desc,  
                  sqt.sql_id)  
 where rownum < 65 and  
       (rownum <= 10 or norm_val > 1);

--

select a.EVENT, a.SQL_ID, a.MACHINE, b.SQL_TEXT, b.SQL_FULLTEXT,b.FIRST_LOAD_TIME,b.LAST_LOAD_TIME,b.LAST_ACTIVE_TIME
  from v$session a, v$sql b
where a.SQL_ID = b.SQL_ID
   and a.USERNAME is not null
   and a.STATUS = 'ACTIVE';

--查看正在执行的sql执行计划

--display_cursor     为第一步查出来的SQL_ID

select * from table(dbms_xplan.display_cursor('7k0dhtw1zudrw'))

--等待事件以及语句情况
select  event,sql_id, mi, count(mi)
  from (select substrb(event,1,30) event, sql_id, to_char(sample_time, 'yyyymmdd hh24mi') mi --,
        --session_id
          from dba_hist_active_sess_history
         where sql_id = '5s1x1tmt570pn'
           and sample_time > to_date('20190513 0940', 'yyyymmdd hh24mi')
           and sample_time < to_date('20190513 1910', 'yyyymmdd hh24mi'))
 group by  event,sql_id, mi
  order by mi ;

enq: SQ - contention
5s1x1tmt570pn    SELECT ( TO_CHAR(SYSDATE, 'YYYYMMDDHH24miss') || 410299 ||  LPAD(SEQ_BKE010.NEXTVAL, 10, '0')  ) FROM DUAL
7pycct8f0sur2    SELECT ( TO_CHAR(SYSDATE, 'YYYYMMDDHH24miss') || 410299 ||  LPAD(SEQ_AAZ217.NEXTVAL, 10, '0')  ) FROM DUAL
2bxcdvtcvykcv    SELECT ( TO_CHAR(SYSDATE, 'YYYYMMDDHH24miss') || 410200 || LPAD(SEQ_BKZ522.NEXTVAL, 10, '0') ) FROM DUAL

--看等待事件的
SELECT t2.sid,
  t2.SERIAL#,
  t1.SPID OS_PID,
  t3.SQL_ID,
  t2.EVENT,
  t2.P1TEXT,
  t2.P1,
  t2.p2TEXT,
  t2.P2,
  t2.p3TEXT,
  t2.P3,
  t3.SQL_FULLTEXT
FROM v$process t1,
  v$session t2,
  v$sql t3
WHERE t1.ADDR = t2.PADDR
AND t2.STATUS = 'ACTIVE' -- 'INACTIVE'
and t2.SQL_ID = t3.SQL_ID
and t2.event not like 'SQL%';

select t2.sid, t2.SERIAL#, -- 库级唯一定位一个session t1.SPID OS_PID, -- 操作系统的PID t3.SQL_ID, t2.EVENT,-- SQLID和等待事件 t2.P1TEXT, t2.P1, -- 等待事件的P1信息 t2.p2TEXT, t2.P2, -- 等待事件的P2信息 t2.p3TEXT, t2.P3, -- 等待事件的P3信息 t3.SQL_FULLTEXT -- 被执行的SQL完整内容 from v$process t1, v$session t2, v$sql t3 where t1.ADDR = t2.PADDR and t2.STATUS = 'ACTIVE' -- 表示当前正在执行SQL的会话
-- and t2.STATUS = 'INACTIVE'
-- 表示当前等待执行SQL的会话
-- and t2.STATUS = 'KILLED'
-- 表示当前会话正在被杀掉,未提交事务强制回滚
and t2.SQL_ID = t3.SQL_ID; -- t2.sid, t2.SERIAL#      可以用作库级杀死会话:alter system kill session 't2.sid, t2.SERIAL#';
-- t1.SPID OS_PID          可以用作系统级杀死会话:kill -9 t1.SPID
-- t2.EVENT 和 P1、P2、P3  不同的等待事件的P1、P2和P3的信息是不尽相同的,具体要查官档
-- t3.SQL_FULLTEXT         是一个CLOB类型的字段

--1.从V$SQLAREA视图中选出最糟糕的查询
select b.username username,a.disk_reads reads,
       a.executions exec,a.disk_reads / decode (a.executions, 0, 1,a.executions) rds_exec_ratio,
       a.sql_text STATEMENT
from   v$sqlarea a, dba_users b
where  a.parsing_user_id = b.user_id
and    a.disk_reads > 10000
order by a.disk_reads desc;

--2.从V$SQL视图中选出最糟糕的查询
select *
from  (select address,  --address替换sql_text
       rank() over (order by buffer_gets desc ) as rank_bufgets,
       to_char(100 * ratio_to_report(buffer_gets) over (), '999.99') pct_buf
       from v$sql )
where rank_bufgets < 11;

declare
  tune_task varchar2(30);
  tune_sql clob;
begin
  tune_task := dbms_sqltune.create_tuning_task(
    sql_id    => '6v864r3vc9qbc',
    task_name   => 'tune_test2',
    description => 'Provide SQL ID'
  );
end;
/

--执行DBMS_SQLTUNE并查看建议
exec dbms_sqltune.execute_tuning_task(task_name => 'tune_test2');

set long 10000 longchunksize 10000 linesize 150 pagesize 200
select dbms_sqltune.report_tuning_task('tune_test2') from dual;

--查看和删除调优任务
select owner,task_name,advisor_name,created from dba_advisor_tasks order by created;

exec dbms_sqltune.drop_tuning_task(task_name => '&&task_name');

优化SQL集一的更多相关文章

  1. sql语句优化SQL Server

    MS   SQL   Server查询优化方法查询速度慢的原因很多,常见如下几种 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)          2.I/O吞吐量小,形成了 ...

  2. 转载 50种方法优化SQL Server数据库查询

    原文地址 http://www.cnblogs.com/zhycyq/articles/2636748.html 50种方法优化SQL Server数据库查询 查询速度慢的原因很多,常见如下几种: 1 ...

  3. 拆分字段优化SQL

    拆分字段优化SQL 今天看到一条用函数处理连接的SQL,是群里某位网友的,SQL语句如下: SELECT SO_Order.fdate , SO_Order.fsn FROM so_order INN ...

  4. MySQL查询不使用索引汇总 + 如何优化sql语句

    不使用索引原文 : http://itlab.idcquan.com/linux/MYSQL/918330.html MySQL查询不使用索引汇总 众所周知,增加索引是提高查询速度的有效途径,但是很多 ...

  5. MySQL 5.7 优化SQL提升100倍执行效率的深度思考(GO)

    系统环境:微软云Linux DS12系列.Centos6.5 .MySQL 5.7.10.生产环境,step1,step2是案例,精彩的剖析部分在step3,step4. 1.慢sql语句大概需要13 ...

  6. 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载

    浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...

  7. 应用索引技术优化SQL 语句(转)

    原文出处 一.前言 很多数据库系统性能不理想是因为系统没有经过整体优化,存在大量性能低下的SQL 语句.这类SQL语句性能不好的首要原因是缺乏高效的索引.没有索引除了导致语句本身运行速度慢外,更是导致 ...

  8. mysql优化sql语句

    mysql优化sql语句   常见误区   www.2cto.com   误区1:   count(1)和count(primary_key) 优于 count(*)   很多人为了统计记录条数,就使 ...

  9. SQL精华总结索引类型优化SQL优化事务大表优化思维导图❤️

    索引类型 从数据结构角度: B+树索引, hash索引,基于哈希表实现,只有全值匹配才有效.以链表的形式解决冲突.查找速度非常快 O(1) 全文索引,查找的是文本中的关键词,而不是直接比较索引中的值, ...

随机推荐

  1. linux下安装与配置nfs服务器

    NFS 什么是NFS?(NAS) NFS(网络文件系统):它的主要功能是通过网络让不同的机器系统之间可以彼此共享文件和目录.NFS服务器可以允许NFS客户端将远端NFS服务器端的共享目录挂载到本地的N ...

  2. SVN清理失败(clean up)或者(lock)问题进入死循环最终解决方案

    解决方法: step1: 到 sqlite官网 (http://www.sqlite.org/download.html) 下载 sqlite3.exe step2: 将下载到的 sqlite3.ex ...

  3. 每天3分钟操作系统修炼秘籍(12):OOM和swap分区

    点我查看秘籍连载 OOM和swap分区 进程的虚拟内存空间是映射到整个物理内存空间的,所以在进程自身看来它拥有了整个物理内存,它也能使用整个物理内存,只需在使用的时候请求操作系统帮忙分配更多空间即可. ...

  4. zuul实现的限流

    限流一般可以根据客户端IP,请求的URL,用户登陆信息进行限制,每秒钟限制多次数,这从别一方面也提升了系统的性能,无用的并发没那么多了. 依赖包 <dependency> <grou ...

  5. JavaScript 标准内置对象Promise使用学习总结

    Javascript标准内置对象Promise使用学习总结   by:授客 QQ:1033553122 1.   基础用法 var condition = true; let p = new Prom ...

  6. npm 使用过程中报错问题-及npm使用

    原文地址:https://blog.csdn.net/u013022210/article/details/77740519 1.以下为报错具体详情:node 8.1.2 版本问题:其他空间安装成功但 ...

  7. mybatis报错: java.lang.IllegalArgumentException invalid comparison: java.util.Date and java.lang.String

    原因是在使用<if> 进行条件判断时, 将datetime类型的字段与 ' ' 进行了判断,导致的错误 解决, 只使用  <if test="createTime != n ...

  8. windows 下 安装vue环境 以及创建新项目 极简

    一.安装node.js(https://nodejs.org/en/) 官网下载安装 验证命令: node -v 二.安装npm npm install -g cnpm --registry=http ...

  9. alluxio 信息索引

    最近要使用到 alluxio,发现网上还是有一些文档很是不错,现在通过这篇文章进行索引一下,进行备忘: https://edgedef.com/2017/08/17/alluxio-%E5%B0%8F ...

  10. CentOS7 如何升级Git

    CentOS7自带的git版本1.8.3.1,这个版本有点低了.于是决定折腾升级,我首先想到的是用update更新: yum update git 结果,事与原违,还是1.8.3.1.在网上提供的升级 ...