oracle数据库,如何找到正在被执行中的最耗时的sql语句。

1、oracle数据库,如何找到正在被执行中的最耗时的sql语句?
2、在oracle中,是怎么优化sql语句的,也就是说,假如我找到了一个最耗时的sql语句,然后我想优化它,应该是一个什么样的流程,先干什么,再干什么,能不能说一下
参与7

2同行回答

royalwzyroyalwzy  技术经理 , 海通证券股份有限公司
查找最近5分钟里面最消耗IO的SQL语句:select s.sql_text from (select sql_id,count(*) as cnfrom v$active_session_historywhere sample_time > sysdate - 5/24/60 and session_type 'BACKGROUND'and WAIT_CLASS='User I/O'group by sql_idorder by cn desc) ash, v$sq...显示全部
查找最近5分钟里面最消耗IO的SQL语句:
select s.sql_text from
(select sql_id,count(*) as cn
from v$active_session_history
where sample_time > sysdate - 5/24/60
and session_type <> 'BACKGROUND'
and WAIT_CLASS='User I/O'
group by sql_id
order by cn desc) ash, v$sql s
where ash.sql_id = s.sql_id;

查找最近5分钟里面最消耗CPU的SQL语句:
select s.sql_text from
(select sql_id,count(*) as cn
from v$active_session_history
where sample_time > sysdate - 5/24/60
and session_type <> 'BACKGROUND'
and SESSION_STATE='ON CPU'
group by sql_id
order by cn desc) ash, v$sql s
where ash.sql_id = s.sql_id;

查找最近5分钟里面索引读最严重的SQL语句:
select s.sql_text from
(select sql_id,count(*) as cn
from v$active_session_history
where sample_time > sysdate - 5/24/60
and session_type <> 'BACKGROUND'
and event='db file sequential read'
group by sql_id
order by cn desc) ash, v$sql s
where ash.sql_id = s.sql_id;

这些都依赖于shared pool
shared pool的目的:缓存曾经执行过的SQL以及其对应的执行计划,再次执行同样的SQL的时候
能够在内存里命中该sql以及对应的执行计划,从而减少硬解析的次数,节省CPU的资源开销。收起
证券 · 2015-07-08
浏览924
静以致远静以致远  数据库运维工程师 , 汇通天下
SELECT s.Schemaname Schema_Name,Decode(Sign(48 - Command),1, To_Char(Command), 'Action Code #' || To_Char(Command)) Action,Status Session_Status, s.Osuser Os_User_Name, s.Sid, p.Spid,s.Serial# Serial_Num, Nvl(s.Username, '[Oracle process]') User_Name...显示全部
SELECT s.Schemaname Schema_Name,Decode(Sign(48 - Command),
1, To_Char(Command), 'Action Code #' || To_Char(Command)) Action,Status Session_Status, s.Osuser Os_User_Name, s.Sid, p.Spid,s.Serial# Serial_Num, Nvl(s.Username, '[Oracle process]') User_Name,
s.Terminal Terminal, s.Program Program, St.VALUE Criteria_Value
FROM V$sesstat St, V$session s, V$process p
WHERE St.Sid = s.Sid
AND St.Statistic# = To_Number('38')
AND ('ALL' = 'ALL' OR s.Status = 'ALL')
AND p.Addr = s.Paddr
ORDER BY St.VALUE DESC, p.Spid ASC, s.Username ASC, s.Osuser ASC
这个SQL是查看消耗资源的情况


SELECT Ws.CLASS, Ws.COUNT COUNT, SUM(Ss.VALUE) Sum_Value
FROM V$waitstat Ws, V$sysstat Ss
WHERE Ss.NAME IN ('db block gets', 'consistent gets')
GROUP BY Ws.CLASS, Ws.COUNT;

这个是查看锁等待信息

优化的方法不是简单的能说的清楚的,给你一个id,个人总结,仅供参考
http://blog.itpub.net/29320885/viewspace-1217814/收起
互联网服务 · 2015-07-08
浏览906

提问者

li1111xin
项目经理cctv

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2015-07-08
  • 关注会员:1 人
  • 问题浏览:2375
  • 最近回答:2015-07-08
  • X社区推广