如何检查长时间运行的查询oracle数据库?

我的应用程序,使用Oracle数据库,正在缓慢或似乎已经完全停止。

怎样才能找出哪些查询是最昂贵的,所以我可以进一步调查?

这个显示当前是“ACTIVE”的SQL:

select S.USERNAME, s.sid, s.osuser, t.sql_id, sql_text from v$sqltext_with_newlines t,V$SESSION s where t.address =s.sql_address and t.hash_value = s.sql_hash_value and s.status = 'ACTIVE' and s.username <> 'SYSTEM' order by s.sid,t.piece / 

这显示locking。 有时候事情进展缓慢,但这是因为它被阻塞等待locking:

 select object_name, object_type, session_id, type, -- Type or system/user lock lmode, -- lock mode in which session holds lock request, block, ctime -- Time since current mode was granted from v$locked_object, all_objects, v$lock where v$locked_object.object_id = all_objects.object_id AND v$lock.id1 = all_objects.object_id AND v$lock.sid = v$locked_object.session_id order by session_id, ctime desc, object_name / 

这对于查找长时间操作(例如全表扫描)是一个很好的select。 如果是因为很多短操作,什么都不会显示出来。

 COLUMN percent FORMAT 999.99 SELECT sid, to_char(start_time,'hh24:mi:ss') stime, message,( sofar/totalwork)* 100 percent FROM v$session_longops WHERE sofar/totalwork < 1 / 

试试这个,它会让你查询当前运行超过60秒。 请注意,如果SQL有多行,它将为每个正在运行的查询打印多行。 看看sid,序列号看看是什么东西在一起。

 select s.username,s.sid,s.serial#,s.last_call_et/60 mins_running,q.sql_text from v$session s join v$sqltext_with_newlines q on s.sql_address = q.address where status='ACTIVE' and type <>'BACKGROUND' and last_call_et> 60 order by sid,serial#,q.piece 

v $ session_longops如果你寻找sofar!= totalwork,你会看到那些还没有完成但是当操作完成时不会删除的条目,所以你也可以在那里看到很多历史。

 Step 1:Execute the query column username format 'a10' column osuser format 'a10' column module format 'a16' column program_name format 'a20' column program format 'a20' column machine format 'a20' column action format 'a20' column sid format '9999' column serial# format '99999' column spid format '99999' set linesize 200 set pagesize 30 select a.sid,a.serial#,a.username,a.osuser,c.start_time, b.spid,a.status,a.machine, a.action,a.module,a.program from v$session a, v$process b, v$transaction c, v$sqlarea s Where a.paddr = b.addr and a.saddr = c.ses_addr and a.sql_address = s.address (+) and to_date(c.start_time,'mm/dd/yy hh24:mi:ss') <= sysdate - (15/1440) -- running for 15 minutes order by c.start_time / Step 2: desc v$session Step 3:select sid, serial#,SQL_ADDRESS, status,PREV_SQL_ADDR from v$session where sid='xxxx' //(enter the sid value) Step 4: select sql_text from v$sqltext where address='XXXXXXXX'; Step 5: select piece, sql_text from v$sqltext where address='XXXXXX' order by piece; 

您可以从数据库生成AWR(自动工作量库)报告。 从SQL * Plus命令行运行:

SQL> @ $ ORACLE_HOME / RDBMS /pipe理/的awrrpt.sql

阅读有关如何生成和理解AWR报告的文档。 它会给出DB性能和资源问题的完整视图。 一旦我们熟悉AWR报告,find消耗资源的顶级SQL将会很有帮助。

在12C EM express UI中我们也可以生成AWR。