2010-08-24 616 views
21

Me gustaría obtener el tiempo de ejecución de la consulta en Oracle. No quiero el momento en que Oracle necesite imprimir los resultados, solo el tiempo de ejecución.Oracle query tiempo de ejecución

En MySQL es fácil obtener el tiempo de ejecución desde el shell.

¿Cómo puedo hacer esto en SQL * Plus?

Respuesta

19

Se puede emitir el comando SQL * Plus SET TIMING ON para obtener los tiempos del reloj de pared, pero uno no puede tomar, por ejemplo, recuperar el tiempo trivialmente.

El ajuste AUTOTRACE, cuando se utiliza como SET AUTOTRACE TRACEONLY suprime la producción, pero siguen asumiendo todo el trabajo para satisfacer la consulta y enviar los resultados de vuelta a SQL * Plus, que suprimirlo.

Por último, se puede rastrear la sesión SQL Plus, y calcular manualmente el tiempo de espera en eventos que son esperas de clientes, como "SQL Mensaje de red al cliente", "SQL * Mensaje de red del cliente".

13

Uso:

set serveroutput on 
variable n number 
exec :n := dbms_utility.get_time; 
select ...... 
exec dbms_output.put_line((dbms_utility.get_time-:n)/100) || ' seconds....'); 

O posiblemente:

SET TIMING ON; 

-- do stuff 

SET TIMING OFF; 

... para obtener el centésimas de segundos que han transcurrido.

En cualquier caso, el tiempo transcurrido puede verse afectado por la carga del servidor/etc.

Referencia:

2

yo recomiendo mirar consistente obtiene/lecturas lógicas como un mejor indicador de 'trabajo' de tiempo de ejecución. El tiempo de ejecución puede estar distorsionado por qué más está sucediendo en el servidor de base de datos, cuántas cosas hay en el caché, etc.

Pero si REALMENTE desea tiempo de ejecución de SQL, la vista V $ SQL tiene CPU_TIME y ELAPSED_TIME.

+0

también porque SQL puede ser compartida que hay que buscar también en el número de ejecuciones y dividir esto funcione en promedio, de lo contrario, encontrará ELAPSED_TIME para todas las ejecuciones y puede dejarlo preguntándose por qué un simple SQL de 1 segundo consumió horas de tiempo transcurrido. – Stellios

5
select LAST_LOAD_TIME, ELAPSED_TIME, MODULE, SQL_TEXT elapsed from v$sql 
    order by LAST_LOAD_TIME desc 

ejemplo más complicado (no se olvide de eliminar o sustituir PATTERN):

select * from (
    select LAST_LOAD_TIME, to_char(ELAPSED_TIME/1000, '999,999,999.000') || ' ms' as TIME, 
     MODULE, SQL_TEXT from SYS."V_\$SQL" 
    where SQL_TEXT like '%PATTERN%' 
    order by LAST_LOAD_TIME desc 
) where ROWNUM <= 5; 
Cuestiones relacionadas