2008-09-29 52 views
65

trabajo con el servidor sql, pero debo migrar a una aplicación con Oracle DB. para rastrear mis consultas de aplicaciones, en el servidor Sql uso la maravillosa herramienta Profiler. ¿Hay algo equivalente para Oracle?Oracle: ¿hay alguna herramienta para rastrear consultas, como Profiler para el servidor sql?

+33

¿Por qué aceptaste una respuesta incorrecta? Explicar el plan NO hace lo que hace el generador de perfiles. No tiene ninguna relación. – Jasmine

+1

¿Encontró la mejor herramienta como 'sql server profiler'? ¿Qué estás usando ahora? –

+0

He escrito un libro sobre el rastreo de aplicaciones Oracle. Está disponible en formato PDF en http://method-r.com. –

Respuesta

1

Oracle, junto con otras bases de datos, analiza una consulta determinada para crear un plan de ejecución. Este plan es la forma más eficiente de recuperar los datos.

Oracle proporciona la instrucción 'explain plan' que analiza la consulta pero no la ejecuta, en su lugar rellena una tabla especial que puede consultar (la tabla de plan).

La sintaxis (versión simple, hay otras opciones, tales como para marcar las filas de la tabla plan con un ID especial, o utilizar una tabla de plan diferente) es:

explain plan for <sql query> 

El análisis de los datos queda para otra pregunta, o su investigación adicional.

0

Este es un documento de Oracle explica cómo rastrear las consultas SQL, incluyendo un par de herramientas (Traza de SQL y TKPROF)

link

19

Puede utilizar el Oracle Enterprise Manager para supervisar las sesiones activas, con la consulta que se está ejecutando, su plan de ejecución, bloqueos, algunas estadísticas e incluso una barra de progreso para las tareas más largas.

Ver: http://download.oracle.com/docs/cd/B10501_01/em.920/a96674/db_admin.htm#1013955

Ir a -> Instancia sesiones y ver la ficha SQL de cada sesión.

Hay otras formas. encargado de la empresa sólo pone con colores bonitos lo que ya está disponible en vistas especiales, como las documentadas aquí: http://www.oracle.com/pls/db92/db92.catalog_views?remark=homepage

Y, por supuesto, también puede utilizar Explicar PLAN, herramienta de rastreo y un montón de otras formas de instrumentalización. Hay algunos informes en el administrador de la empresa para las consultas SQL más costosas. También puede buscar consultas recientes guardadas en el caché.

5

probar esto (que también es gratis): http://www.aboves.com/Statement_Tracer_for_Oracle.exe

+5

Traté de usar este software pero no vi forma de configurar la cadena de conexión. ¿Alguien puede ayudar? –

+0

¡Impresionante! Funciona de maravilla ... pero hasta donde puedo decir solo en el localhost de la base de datos. – vmassuchetto

+6

Este es un enlace a un ejecutable, ¡mucho, no, no! –

4

En vista de que he acaba de votar una pregunta reciente como duplicado y apunta en esta dirección. . .

Un par más - en SQL * Plus - SET AUTOTRACE ON - proporcionará un plan de explicación y estadísticas para cada instrucción ejecutada.

TOAD también permite el perfil del lado del cliente.

La desventaja de ambos es que solo le informan el plan de ejecución de la declaración, pero no cómo llegó el optimizador a ese plan, para eso necesitará un rastreo del servidor de nivel inferior.

Otra información importante para comprender son las instantáneas de Statspack: son una buena forma de ver el rendimiento de la base de datos en general. El plan de explicación, etc., es bueno para encontrar sentencias SQL individuales que son cuellos de botella. Statspack es bueno para identificar el hecho de que su problema es que una declaración simple con un buen plan de ejecución se llama 1 millón de veces en un minuto.

1

hay una herramienta comercial FlexTracer que se puede utilizar para rastrear Oracle consultas SQL

2

la captura es capturar todas ejecutar SQL entre dos puntos en el tiempo. Al igual que la forma en que SQL Server también lo hace.

Existen situaciones en las que es útil capturar el SQL que un usuario en particular está ejecutando en la base de datos. Por lo general, usted simplemente habilitaría el rastreo de sesión para ese usuario, pero hay dos problemas potenciales con ese enfoque.

  1. La primera es que muchas aplicaciones basadas en web mantienen un conjunto de conexiones de bases de datos persistentes que se comparten entre varios usuarios.
  2. La segunda es que algunas aplicaciones se conectan, ejecutan SQL y se desconectan muy rápido, dificultando el rastreo de sesión (por supuesto, podría utilizar un desencadenador de inicio de sesión para habilitar el rastreo de sesión en este caso).

Una solución rápida y sucia al problema es capturar todas las sentencias SQL que se ejecutan entre dos puntos en el tiempo.

El siguiente procedimiento creará dos tablas, cada una con una instantánea de la base de datos en un punto particular. Las tablas se consultarán para generar una lista de todos los SQL ejecutados durante ese período.

Si es posible, debe hacerlo en un sistema de desarrollo silencioso; de lo contrario, corre el riesgo de recuperar demasiados datos.

  1. Tome la primera instantánea Ejecutar el siguiente código SQL para crear la primera instantánea:

    create table sql_exec_before as 
    select executions,hash_value 
    from v$sqlarea 
    /
    
  2. conseguir que el usuario realice su tarea dentro de la aplicación.

  3. Tome la segunda instantánea.

    create table sql_exec_after as 
    select executions, hash_value 
    from v$sqlarea 
    /
    
  4. Comprobar los resultados Ahora que ha capturado el SQL es el momento para consultar los resultados.

Esta primera consulta mostrará una lista de todos los valores hash de consulta que se han ejecutado:

select aft.hash_value 
from sql_exec_after aft 
left outer join sql_exec_before bef 
    on aft.hash_value = bef.hash_value 
where aft.executions > bef.executions 
    or bef.executions is null; 
/

Ésta se mostrará el hash y el propio SQL: páginas conjunto 999 líneas 100 de quiebre en hash_value

select hash_value, sql_text 
from v$sqltext 
where hash_value in (
    select aft.hash_value 
    from sql_exec_after aft 
    left outer join sql_exec_before bef 
     on aft.hash_value = bef.hash_value 
    where aft.executions > bef.executions 
     or bef.executions is null; 
) 
order by 
    hash_value, piece 
/

5.Poner en orden No se olvide de eliminar las tablas de instantánea una vez que haya terminado:

drop table sql_exec_before 
/

drop table sql_exec_after 
/
+0

Gracias por los scripts completos que demuestran la técnica. –

13
alter system set timed_statistics=true 

--o

alter session set timed_statistics=true --if want to trace your own session 

- debe ser lo suficientemente grande:

select value from v$parameter p 
where name='max_dump_file_size' 

- Descubra el número de serie y el número de serie de la sesión que le interesan:

select sid, serial# from v$session 
where ...your_search_params... 

--usted puede iniciar el seguimiento con 10.046 evento, el cuarto parámetro establece el nivel de rastreo (12 es el mayor):

begin 
    sys.dbms_system.set_ev(sid, serial#, 10046, 12, ''); 
end; 

--turn de rastreo con la configuración de nivel cero:

begin 
    sys.dbms_system.set_ev(sid, serial#, 10046, 0, ''); 
end; 

/* niveles posibles: 0 - apagado 1 - nivel mínimo. Al igual conjunto SQL_TRACE = true 4 - se añaden los valores de las variables se unen al archivo 8 rastrear - esperas se añaden 12 - se unen ambos valores de las variables y esperar acontecimientos se añaden */

--same si desea realizar un seguimiento su propia sesión con el nivel más grande:

alter session set events '10046 trace name context forever, level 12'; 

--turn apagado:

alter session set events '10046 trace name context off'; 

--file con información de rastreo en bruto se ubicarán: 01

(*. TRC)
select value from v$parameter p 
where name='user_dump_dest' 

--name del archivo contendrá SPID:

select p.spid from v$session s, v$process p 
where s.paddr=p.addr 
and ...your_search_params... 

--también se puede establecer el nombre por sí mismo:

alter session set tracefile_identifier='UniqueString'; 

--finally, TKPROF utilizar para hacer más legible archivo de seguimiento:

C:\ORACLE\admin\databaseSID\udump> 
C:\ORACLE\admin\databaseSID\udump>tkprof my_trace_file.trc output=my_file.prf 
TKPROF: Release 9.2.0.1.0 - Production on Wed Sep 22 18:05:00 2004 
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. 
C:\ORACLE\admin\databaseSID\udump> 

--a estado de vista de tra ce archivo de uso:

set serveroutput on size 30000; 
declare 
    ALevel binary_integer; 
begin 
    SYS.DBMS_SYSTEM.Read_Ev(10046, ALevel); 
    if ALevel = 0 then 
    DBMS_OUTPUT.Put_Line('sql_trace is off'); 
    else 
    DBMS_OUTPUT.Put_Line('sql_trace is on'); 
    end if; 
end; 
/

sólo tipo de traducirse http://www.sql.ru/faq/faq_topic.aspx?fid=389 original es más completa, pero de todos modos esto es mejor que lo que otros publican en mi humilde opinión

+0

¡Mucho más útil que las otras respuestas! – Andomar

13

He encontrado una solución fácil

Paso 1. conectarse a DB con un usuario administrador usando PLSQL o sqldeveloper o cualquier otra interfaz de consulta

Paso2. ejecutar el script a continuación; en la S.sql_text columna, verá las consultas ejecutadas

SELECT    
S.LAST_ACTIVE_TIME,  
S.MODULE, 
S.SQL_FULLTEXT, 
S.SQL_PROFILE, 
S.EXECUTIONS, 
S.LAST_LOAD_TIME, 
S.PARSING_USER_ID, 
S.SERVICE                  
FROM 
SYS.V_$SQL S, 
SYS.ALL_USERS U 
WHERE 
S.PARSING_USER_ID=U.USER_ID 
AND UPPER(U.USERNAME) IN ('oracle user name here') 
ORDER BY TO_DATE(S.LAST_LOAD_TIME, 'YYYY-MM-DD/HH24:MI:SS') desc; 

El único problema con esto es que no puedo encontrar una manera de mostrar los valores de los parámetros de entrada (para llamadas de función), pero al menos podemos ver lo que es ejecutó Oracle y el orden sin usar una herramienta específica.

+2

Puede agregar S.SQL_FULLTEXT si el texto de la consulta tiene más de 1000 caracteres, ya que SQL_TEXT se corta en ese punto. – Tridus

+2

No debe realizar su pedido antes del LAST_ACTIVE_TIME porque es VARCHAR2 (19). Use esto en su lugar: ORDER BY TO_DATE (S.LAST_LOAD_TIME, 'YYYY-MM-DD/HH24: MI: SS') desc –

4

GI Oracle Profiler v1.2

Es un Herramientas para Oracle para capturar las consultas ejecutadas similares al Analizador de SQL Server. Herramienta indispensable para el mantenimiento de aplicaciones que utilizan este servidor de base de datos.

se puede descargar desde el sitio oficial iacosoft.com

+0

Hola, ¿necesita una licencia especial de ORACLE para usar este software? Sé que Oracle le permite interconectar ciertas tablas/vistas, y si lo hace y no tiene una licencia, le cobran extra. – sergiu

+2

Hola, tienes que pagar para consultar v $ sqlarea? Puedo ingresar al enlace que dice ¿qué? – pio

+0

excelente gracias hombre !!! Me ahorras mucho trabajo –

0

Al parecer no hay pequeña utilidad simple barato que ayudaría a realizar esta tarea. Sin embargo, hay 101 maneras de hacerlo de una manera complicada e inconveniente.

El artículo siguiente describe varios. Probablemente haya docenas más ... http://www.petefinnigan.com/ramblings/how_to_set_trace.htm

Cuestiones relacionadas