Oracle: ¿existe una herramienta para rastrear consultas, como Profiler para SQL Server? [cerrado]


85

Trabajo con el servidor SQL, pero debo migrar a una aplicación con Oracle DB. para rastrear las consultas de mi aplicación, en Sql Server utilizo la maravillosa herramienta Profiler. ¿Hay algo equivalente para Oracle?


38
¿Por qué aceptó una respuesta incorrecta? Explique que el plan NO hace lo que hace el perfilador. No tiene ninguna relación.
Jasmine

1
¿Encontraste la mejor herramienta como sql server profiler? ¿Qué estás usando ahora?
Shahid Ghafoor

He escrito un libro sobre el rastreo de aplicaciones Oracle. Está disponible en formato PDF en method-r.com .
Cary Millsap

Por favor, consulte el generador de perfiles de Oracle en dbForge Studio para Oracle de Devart.
Devart

Muchas respuestas a continuación, pero extrañamente nadie ha mencionado ninguno de los dos perfiladores de Oracle para PL / SQL: DBMS_PROFILER(básico y limitado, pero muy conveniente) o DBMS_HPROF(más preciso pero requiere más configuración). Sin embargo, no conozco SQL Server, por lo que es posible que tenga un concepto de creación de perfiles diferente al de cualquiera de los paquetes de Oracle y lo que desea es más como un seguimiento en Oracle.
William Robertson

Respuestas:


22

Puedes usar The Oracle Enterprise Manager para monitorear 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

Vaya a Instancia -> sesiones y observe la pestaña SQL de cada sesión.

Hay otras formas. Enterprise Manager simplemente pone con bonitos colores 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 Explain PLAN FOR, la herramienta TRACE y muchas otras formas de instrumentalización. Hay algunos informes en el administrador empresarial para las consultas SQL más caras. También puede buscar consultas recientes guardadas en la caché.


18

Encontré una solución fácil

Paso 1. conectarse a la base de datos con un usuario administrador mediante PLSQL o sqldeveloper o cualquier otra interfaz de consulta

Paso 2. ejecute el script a continuación; en la columna S.SQL_TEXT, 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 a funciones), pero al menos podemos ver lo que se ejecuta en 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 ordenar por 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
Igor Krupitsky

1
ORA-00942: la tabla o vista no existe 00942. 00000 - "la tabla o vista no existe" * Causa: * Acción: Error en la línea: 11 Columna: 6 ¿Eso significa que no tengo privilegio de administrador?
toha

Esto no incluye valores param. si también desea tener eso, eche un vistazo a: stackoverflow.com/a/14217618/6339469
HamedH

16
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' 

- Averigüe el sid y el número de serie de la sesión que le interesa:

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

- puede comenzar a rastrear con el evento 10046, el cuarto parámetro establece el nivel de rastreo (12 es el más grande):

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

- apagar el rastreo con el ajuste de nivel cero:

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

/ * niveles posibles: 0 - desactivado 1 - nivel mínimo. Al igual que set sql_trace = true 4 - los valores de las variables de enlace se agregan al archivo de seguimiento 8 - se agregan las esperas 12 - se agregan los valores de las variables de enlace y los eventos de espera * /

- lo mismo si desea rastrear su propia sesión con un nivel más grande:

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

--apagar:

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

- se ubicará el archivo con información de seguimiento sin procesar:

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

--nombre del archivo (*. trc) contendrá spid:

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

--también puede establecer el nombre usted mismo:

alter session set tracefile_identifier='UniqueString'; 

- finalmente, utilícelo TKPROFpara hacer que el archivo de seguimiento sea más legible:

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>

- para ver el estado del uso del archivo de seguimiento:

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;
/

Simplemente traducido http://www.sql.ru/faq/faq_topic.aspx?fid=389 El original es más completo, pero de todos modos esto es mejor que lo que otros publicaron en mi humilde opinión


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

Demasiado complicado. Nadie lo va a usar.
ADM-IT

7

GI Oracle Profiler v1.2

Es una herramienta para que Oracle capture consultas ejecutadas de manera similar al SQL Server Profiler. Herramienta indispensable para el mantenimiento de aplicaciones que utilizan este servidor de base de datos.

puedes descargarlo desde el sitio oficial iacosoft.com


Hola, ¿necesita una licencia especial de ORACLE para utilizar este software? Sé que Oracle le permite interogar ciertas tablas / vistas, y si lo hace y no tiene una licencia para ello, le cobran más.
sergiu

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

excelente gracias hombre !!! Me ahorras mucho trabajo
Hernaldo Gonzalez

Si mi consulta falla, el generador de perfiles no la muestra.
ADM-IT


5

Dado que acabo de votar una pregunta reciente como un duplicado y apunto en esta dirección. . .

Un par más, en SQL * Plus, SET AUTOTRACE ON, proporcionará un plan explicativo y estadísticas para cada declaración ejecutada.

TOAD también permite la elaboración de perfiles del lado del cliente.

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

Otro aspecto importante que hay que entender son las instantáneas de Statspack: son una buena forma de observar el rendimiento de la base de datos en su conjunto. Explicar plan, etc., son buenos 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.


3

La captura es Capturar toda la ejecución de SQL entre dos puntos en el tiempo. Como también lo hace SQL Server.

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

  1. La primera es que muchas aplicaciones basadas en web mantienen un grupo de conexiones de bases de datos persistentes que se comparten entre varios usuarios.
  2. La segunda es que algunas aplicaciones se conectan, ejecutan algo de SQL y se desconectan muy rápidamente, lo que dificulta la habilitación del rastreo de sesiones (por supuesto, podría usar un disparador de inicio de sesión para habilitar el rastreo de sesiones 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 de las cuales contiene una instantánea de la base de datos en un punto en particular. Luego, se consultarán las tablas para producir una lista de todas las ejecuciones de SQL durante ese período.

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

  1. Tomar la primera instantánea Ejecute el siguiente sql para crear la primera instantánea:

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

  3. Toma la segunda instantánea.

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

Esta primera consulta enumerará todos los 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;
/

Este mostrará el hash y el SQL en sí: establecer páginas 999 líneas 100 romper 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. Ponga en orden No olvide eliminar las tablas de instantáneas una vez que haya terminado:

drop table sql_exec_before
/

drop table sql_exec_after
/

Gracias por los guiones completos que demuestran la técnica.
Roman Pokrovskij

2

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 eficaz de recuperar los datos.

Oracle proporciona la explain plandeclaración ' ' que analiza la consulta pero no la ejecuta, sino que llena una tabla especial que puede consultar (la tabla del plan).

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

explain plan for <sql query>

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



1

Este es un documento de Oracle que explica cómo rastrear consultas SQL, incluidas un par de herramientas (SQL Trace y tkprof)

enlace


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.