111 votes

Comment vérifier les requêtes de longue durée dans une base de données Oracle ?

Mon application, qui utilise une base de données Oracle, est lente ou semble s'être complètement arrêtée.

Comment puis-je savoir quelles sont les requêtes les plus coûteuses, afin d'approfondir mes recherches ?

153voto

WW. Points 11335

Celui-ci montre le SQL qui est actuellement "ACTIF" :-.

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
/

Cela montre les serrures. Parfois, les choses vont lentement, mais c'est parce qu'il est bloqué en attendant un verrou :

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
/

C'est un bon outil pour trouver les opérations longues (par exemple, les balayages de tables complètes). Si c'est à cause de beaucoup d'opérations courtes, rien n'apparaîtra.

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
/

41voto

Carlos A. Ibarra Points 2699

Essayez ceci, cela vous donnera les requêtes en cours depuis plus de 60 secondes. Notez qu'il imprime plusieurs lignes par requête en cours si le SQL a plusieurs lignes. Regardez le sid,serial# pour voir ce qui va ensemble.

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

8voto

Gary Myers Points 24819

V$session_longops

Si vous cherchez sofar != totalwork, vous verrez ceux qui ne sont pas terminés, mais les entrées ne sont pas supprimées lorsque l'opération est terminée, donc vous pouvez voir beaucoup d'histoire là aussi.

5voto

mani22487 Points 41
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;

2voto

santosh tiwary Points 71

Vous pouvez vérifier les détails des requêtes de longue durée comme le pourcentage d'achèvement et le temps restant en utilisant la requête ci-dessous :

 SELECT SID, SERIAL#, OPNAME, CONTEXT, SOFAR, 
 TOTALWORK,ROUND(SOFAR/TOTALWORK*100,2) "%_COMPLETE" 
 FROM V$SESSION_LONGOPS 
 WHERE OPNAME NOT LIKE '%aggregate%' 
       AND TOTALWORK != 0 
       AND SOFAR <> TOTALWORK;

Pour la liste complète des étapes de dépannage, vous pouvez consulter ici : Résolution des problèmes liés aux sessions de longue durée

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X