2009-03-07 29 views
76

Mi aplicación, que usa una base de datos Oracle, va lento o parece haberse detenido por completo.¿Cómo verificar la base de datos Oracle para consultas de larga ejecución?

¿Cómo puedo saber qué consultas son más caras, así que puedo investigar más?

+10

Realmente no entiendo cómo esto "no es una pregunta real" –

+5

Esta es la pregunta falsa más útil que he visto :) – FGreg

+4

Esta publicación aparece como # 1 al buscar en Google "consultas de ejecución lenta de Oracle". ¿Qué hay de la reapertura de la pregunta para permitir más respuestas para mantenerse al día? – andersand

Respuesta

26

Pruebe esto, le dará consultas que se ejecutan actualmente por más de 60 segundos. Tenga en cuenta que imprime varias líneas por consulta en ejecución si el SQL tiene varias líneas. Mire el sid, el número de serie para ver qué pertenece juntos.

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 
+0

ejecuto esta consulta y me dice que es una declaración inválida –

+0

Es válida; Lo probé ¿Qué herramienta estás usando para consultar? Puede confundirse con el signo #. Intente cambiar el principio y el final de esta manera: "select * from ... order by sid, q.piece" –

+2

Además, tendrá que ejecutar esto con una cuenta privilegiada que tenga acceso a v $ session, v $ sqltext_with_newlines –

5

v $ session_longops Si nos fijamos para sofar! = Totalwork verá los que no han terminado, pero las entradas no se eliminan al finalizar la operación para que pueda ver mucha historia allí también .

+0

Buena pista. También se discute en detalles [aquí] (http://stackoverflow.com/questions/199508). –

105

Ésta muestra SQL que es actualmente "ACTIVO": -

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 
/

Esta muestra cerraduras. A veces las cosas van lentas, pero es porque está bloqueado a la espera de una cerradura:

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 
/

Este es un buen momento para encontrar las operaciones largas (por ejemplo, los recorridos de tablas completas). Si se debe a muchas operaciones cortas, no aparecerá nada.

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 
/
+0

La tercera consulta funcionó para mí seleccionando 'serial #' también. –

+0

¿Hay alguna forma de eliminar estas consultas de forma segura si se ejecutan durante más de x minutos? Gracias por la respuesta, @UmberFerrule – TommyT

+0

@TommyT Puede usar 'Alter System kill session' como se describe aquí: https://docs.oracle.com/cd/B28359_01/server.111/b28310/manproc008.htm#ADMIN11192 –

4
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; 
0

Puede generar AWR informe (Repositorio de Carga de Trabajo Automática) de DB. Ejecutar desde SQL * Plus línea de comandos:

SQL> @ $ ORACLE_HOME/RDBMS/admin/awrrpt.sql

documento Leer noticias relacionadas a cómo generar & entender el informe de AWR. dará una vista completa del rendimiento DB & problema de recursos. una vez que estemos familiarizados con el informe de AWR, será útil encontrar el mejor recurso de SQL.

En 12C EM express UI también podemos generar AWR.

Cuestiones relacionadas