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?
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?
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
ejecuto esta consulta y me dice que es una declaración inválida –
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" –
Además, tendrá que ejecutar esto con una cuenta privilegiada que tenga acceso a v $ session, v $ sqltext_with_newlines –
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 .
Buena pista. También se discute en detalles [aquí] (http://stackoverflow.com/questions/199508). –
É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
/
La tercera consulta funcionó para mí seleccionando 'serial #' también. –
¿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
@TommyT Puede usar 'Alter System kill session' como se describe aquí: https://docs.oracle.com/cd/B28359_01/server.111/b28310/manproc008.htm#ADMIN11192 –
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;
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.
Realmente no entiendo cómo esto "no es una pregunta real" –
Esta es la pregunta falsa más útil que he visto :) – FGreg
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