scripts - ¿Cómo verificar la base de datos Oracle para consultas de larga ejecución?
oracle transponer registros columnas (5)
Este muestra SQL que actualmente está "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
/
Esto muestra bloqueos. A veces las cosas van despacio, pero es porque está bloqueado esperando un bloqueo:
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
/
Esta es una buena opción para encontrar operaciones largas (p. Ej. Escaneos completos de tablas). 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
/
Mi aplicación, que usa una base de datos Oracle, va lento o parece haberse detenido por completo.
¿Cómo puedo averiguar qué consultas son más caras, para poder 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
Puede generar un informe AWR (Repositorio automático de cargas de trabajo) desde DB. Ejecutar desde la línea de comandos de SQL * Plus:
SQL> @ $ ORACLE_HOME / rdbms / admin / awrrpt.sql
Lea el documento relacionado con la forma de generar y comprender el informe de AWR. le dará una visión completa del rendimiento de DB y el problema de los 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.
v $ session_longops Si busca sofar! = totalwork verá los que no se han completado pero las entradas no se eliminan cuando finaliza la operación, por lo que también puede ver un montón de historia allí.
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;