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

可以到v$sql中查询,比如以buffer_gets,executions,disk_reads等条件判断.
--值得怀疑的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)
        wheredisk_reads>50*executions) s,
       sys.v_$sqltext p
wheres.ranking<=5
  andp.address=s.address
orderby1, s.address, p.piece;

--逻辑读多的SQL
select*
 from(select buffer_gets, sql_text
         from v$sqlarea
        where buffer_gets>500000
        order by buffer_gets desc)
where rownum<=30;

--执行次数多的SQL
select sql_text, executions
 from(select sql_text, executions from v$sqlarea order by executions desc)
where rownum<81;

--读硬盘多的SQL
select sql_text, disk_reads
 from(select sql_text, disk_reads from v$sqlarea order by disk_reads desc)
where rownum<21;

--排序多的SQL
select sql_text, sorts
 from(select sql_text, sorts from v$sqlarea order by sorts desc)
where rownum<21;

--分析的次数太多,执行的次数太少,要用绑变量的方法来写sql
setpagesize600;
setlinesize120;
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;

--游标的观察
setpages300;
select sum(a.value), b.name
 from v$sesstat a, v$statname b
where a.statistic#=b.statistic#
  andb.name='opened cursors current'
groupbyb.name;

select count(0) from v$open_cursor;

select user_name, sql_text,count(0)
 from v$open_cursor
group by user_name, sql_text
having count(0)>30;

--查看当前用户&username执行的SQL
select sql_text
 from v$sqltext_with_newlines
where(hash_value, address)in
       (select sql_hash_value, sql_address
         from v$session
        wher eusername='&username')
order by address, piece;

--
select b.username用户名,a.disk_reads磁盘读取量,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;
可以把disk_reads改成buffer_gets则求出消耗内存多的sql


 

你可能感兴趣的:(oracle,sql)