Guía de ajuste de SQL Nota 23: Realización del seguimiento de aplicaciones

Este artículo son las notas del Capítulo 23 "Realización del seguimiento de aplicaciones" de la Guía de ajuste de SQL .

Este capítulo explica qué es el rastreo de aplicaciones de un extremo a otro y cómo generar y leer archivos de rastreo.

conceptos básicos importantes

23.1 Descripción general del seguimiento de aplicaciones de extremo a extremo

El rastreo de aplicaciones de un extremo a otro puede identificar las fuentes de una carga de trabajo excesiva de la base de datos, como declaraciones SQL de alta carga, por identificador de cliente, servicio, módulo, operación, sesión, instancia o base de datos completa .

En un entorno de varios niveles, el nivel intermedio enruta las solicitudes de los clientes finales a diferentes sesiones de la base de datos, lo que dificulta el seguimiento de los clientes en las sesiones de la base de datos. El seguimiento de aplicaciones de un extremo a otro es una infraestructura que utiliza un ID de cliente para realizar un seguimiento exclusivo de un cliente final específico a través de todos los niveles hasta la base de datos y proporciona información sobre lo que el cliente final está haciendo en la base de datos.

23.1.1 Propósito del rastreo de aplicaciones de extremo a extremo

El seguimiento de aplicaciones de un extremo a otro simplifica el diagnóstico de problemas de rendimiento en entornos de varios niveles.

Por ejemplo, puede identificar las fuentes de una carga de trabajo excesiva de la base de datos, como declaraciones SQL de alta carga, y ponerse en contacto con el usuario responsable. Además, los usuarios que tengan problemas pueden contactarlo. Luego puede determinar qué está haciendo esta sesión de usuario en el nivel de PDB

El seguimiento de aplicaciones de un extremo a otro también simplifica la gestión de las cargas de trabajo de las aplicaciones mediante el seguimiento de módulos y operaciones específicos dentro de los servicios. Los nombres de los módulos y las acciones los establece el desarrollador de la aplicación . Por ejemplo, puede establecer estos valores en un programa PL/SQL usando los procedimientos SET_MODULE y SET_ACTION en el paquete DBMS_APPLICATION_INFO .

El seguimiento de aplicaciones de extremo a extremo puede identificar problemas de carga de trabajo en la base de datos:

  • Identificador de cliente
    Especifica el usuario final por ID de inicio de sesión, por ejemplo, HR.HR

  • Servicio
    Especifica un grupo de aplicaciones con atributos comunes, umbrales de nivel de servicio y prioridades, o una sola aplicación, como ACCTG para una aplicación de contabilidad.

  • Módulo
    Especifica el módulo funcional de la aplicación, como Cuentas por cobrar o Libro mayor

  • acción
    especifica la operación en el módulo, como una operación INSERTAR o ACTUALIZAR

  • sesión
    Especifica una sesión en la instancia local basada en el identificador de sesión (SID) de la base de datos dado.

  • Instancia
    Especifica la instancia de base de datos dada por nombre de instancia

  • contenedor
    designado

23.1.2 Seguimiento de aplicaciones de extremo a extremo para PDB

La vista V$ permite leer archivos de seguimiento específicos del contenedor.

Los principales casos de uso son los siguientes:

  • Un administrador de CDB debe ver los archivos de seguimiento de un PDB específico.
    La vista V$DIAG_TRACE_FILE enumera todos los archivos de seguimiento en el directorio de seguimiento de ADR que contienen datos de seguimiento de un PDB específico. V$DIAG_TRACE_FILE_CONTENTS Muestra el contenido de los archivos de rastreo.

  • Los administradores de PDB deben ver los archivos de seguimiento de un PDB específico.
    Puede usar SQL Trace para recopilar datos de diagnóstico para sentencias SQL ejecutadas en una aplicación PDB. Los datos de seguimiento incluyen el seguimiento de SQL (evento 10046) y el seguimiento del optimizador (evento 10053). Con la vista V$, los desarrolladores pueden acceder solo a los registros de seguimiento de SQL o del optimizador sin acceder a todo el archivo de seguimiento .

Para permitir que los usuarios y las herramientas determinen qué PDB está asociado con un archivo o parte de un archivo, existen comentarios de PDB en archivos de seguimiento, volcados de eventos y archivos de registro. La información de PDB es parte de los metadatos estructurados almacenados en el archivo .trm de cada archivo de rastreo. Cada registro contiene los siguientes atributos:

  • CON_ID, que es el ID del contenedor asociado a los datos
  • CON_UID, que es el ID único del contenedor
  • NOMBRE, que es el nombre del contenedor

23.1.3 Herramientas para el seguimiento de aplicaciones de extremo a extremo

SQL Trace y TKPROF son dos herramientas básicas de diagnóstico de rendimiento que pueden ayudarlo a evaluar con precisión la eficiencia de las declaraciones SQL que ejecuta su aplicación.

Para obtener los mejores resultados, utilice estas herramientas con EXPLAIN PLAN en lugar de EXPLAIN PLAN solo. Después de escribir la información de rastreo en un archivo, puede usar la utilidad TRCSESS para consolidar estos datos y luego usar TKPROF o SQL Trace para diagnosticarlos .

La interfaz recomendada para el seguimiento de aplicaciones de un extremo a otro es Oracle Enterprise Manager Cloud Control (Cloud Control). Con Cloud Control, puede ver los principales consumidores de cada tipo de consumidor y habilitar o deshabilitar la recopilación de estadísticas y el seguimiento de SQL para consumidores específicos. Si Cloud Control no está disponible, puede administrar esta funcionalidad mediante la API DBMS_MONITOR .

23.1.3.1 Descripción general de la función de seguimiento de SQL

La herramienta SQL Trace proporciona información de rendimiento sobre sentencias SQL individuales.

SQL Trace genera las siguientes estadísticas para cada declaración:

  • Analizar, ejecutar y contar
  • CPU y tiempo de ejecución
  • lectura física y lectura lógica
  • número de filas procesadas
  • error de caché de biblioteca
  • Nombre de usuario para cada ocurrencia de resolución
  • Cada confirmación y reversión
  • Esperar datos de eventos para cada instrucción SQL y un resumen para cada archivo de seguimiento

Si el cursor de la instrucción SQL está cerrado, SQL Trace también proporciona información sobre el origen de la fila, que incluye:

  • Muestra las operaciones de fila del plan de ejecución real para cada instrucción SQL
  • Número de filas, lecturas coherentes, lecturas físicas, escrituras físicas y tiempo dedicado a cada operación en la fila

Aunque puede habilitar la función SQL Trace para una sesión o instancia, Oracle recomienda que utilice los paquetes DBMS_SESSION o DBMS_MONITOR en su lugar . Cuando la función Seguimiento de SQL está habilitada para una sesión o instancia, las estadísticas de rendimiento de todas las sentencias SQL ejecutadas en la sesión o instancia del usuario se colocan en un archivo de seguimiento. El uso de la herramienta SQL Trace puede afectar el rendimiento y puede generar una mayor sobrecarga del sistema, un uso elevado de la CPU y poco espacio en disco .

La utilidad de línea de comandos TRCSESS consolida la información de seguimiento de varios archivos de seguimiento en función de criterios específicos, como la sesión o el ID del cliente.

23.1.3.2 Resumen de TKPROF

Para formatear el contenido de un archivo de rastreo y colocar la salida en un archivo de salida legible, ejecute el programa TKPROF.

TKPROF también puede hacer lo siguiente:

  • Cree scripts SQL que almacenen estadísticas en la base de datos
  • Determinar el plan de ejecución de la sentencia SQL

TKPROF informa los recursos consumidos por cada declaración ejecutada, la cantidad de veces que se llamó y la cantidad de filas que procesó. Esta información le permite encontrar aquellas declaraciones que utilizan la mayoría de los recursos. Con una línea de base disponible, puede evaluar si los recursos utilizados son razonables para la situación laboral dada.

23.2 Habilitación de la recopilación de estadísticas para el seguimiento de extremo a extremo

Para recopilar estadísticas adecuadas mediante PL/SQL, debe habilitar la recopilación de estadísticas para un identificador de cliente, servicio, módulo u operación mediante procedimientos en DBMS_MONITOR.

El nivel predeterminado es la recopilación de estadísticas a nivel de sesión . La recopilación de estadísticas es global para la base de datos y continúa a lo largo de los reinicios de la instancia de la base de datos.

23.2.1 Habilitación de la recopilación de estadísticas para un ID de cliente

El procedimiento CLIENT_ID_STAT_ENABLE habilita la recopilación de estadísticas para un ID de cliente determinado y el procedimiento CLIENT_ID_STAT_DISABLE la deshabilita.

Puede ver el identificador del cliente en la columna CLIENT_IDENTIFIER de V$SESSION.

Suponga que desea habilitar y luego deshabilitar la recopilación de estadísticas para el cliente con ID oe.oe.

-- 为 oe.oe 启用统计信息收集。
EXECUTE DBMS_MONITOR.CLIENT_ID_STAT_ENABLE(client_id => 'OE.OE');
-- 为 oe.oe 禁用统计信息收集。
EXECUTE DBMS_MONITOR.CLIENT_ID_STAT_DISABLE(client_id => 'OE.OE');

23.2.2 Habilitación de la recopilación de estadísticas para servicios, módulos y acciones

El procedimiento SERV_MOD_ACT_STAT_ENABLE habilita la recopilación de estadísticas para una combinación de servicio, módulo y operación, y el procedimiento SERV_MOD_ACT_STAT_DISABLE deshabilita la recopilación de estadísticas para una combinación de servicio, módulo y operación.

Cuando cambia un módulo u operación utilizando el procedimiento DBMS_MONITOR anterior, el cambio entra en vigor en la siguiente llamada de usuario en la sesión. Por ejemplo, si un módulo se establece en module1 en una sesión y si un módulo se restablece en module2 en una llamada de usuario en una sesión, el módulo seguirá siendo module1 mientras dure esa llamada de usuario. En la próxima llamada de usuario en la sesión, el módulo cambia a module2.

-- 启用
BEGIN 
  DBMS_MONITOR.SERV_MOD_ACT_STAT_ENABLE(
    service_name => 'ACCTG'   
,   module_name  => 'PAYROLL' );
END;

BEGIN 
  DBMS_MONITOR.SERV_MOD_ACT_STAT_ENABLE(
    service_name => 'ACCTG'      
,   module_name  => 'GLEDGER'     
,   action_name  => 'INSERT ITEM' );
END;

-- 禁用
BEGIN 
  DBMS_MONITOR.SERV_MOD_ACT_STAT_DISABLE(
    service_name => 'ACCTG'       
,   module_name  => 'GLEDGER'     
,   action_name  => 'INSERT ITEM' );
END;

23.3 Habilitación del rastreo de aplicaciones de extremo a extremo

Para habilitar el rastreo de identificadores de clientes, servicios, módulos, operaciones, sesiones, instancias o bases de datos, ejecute el procedimiento apropiado en el paquete DBMS_MONITOR.

Según los criterios que proporcione, la información de seguimiento específica se captura en un conjunto de archivos de seguimiento y se fusiona en un único archivo de seguimiento de salida. Puede habilitar el seguimiento para diagnósticos específicos y administración de carga de trabajo con las siguientes condiciones.

23.3.1 Habilitación del seguimiento para un identificador de cliente

-- 要启用和禁用对客户端标识符的跟踪
BEGIN 
  DBMS_MONITOR.CLIENT_ID_TRACE_ENABLE(
    client_id => 'OE.OE' ,      
    waits     => true    ,      
    binds     => false   );
END;

-- 禁用
EXECUTE DBMS_MONITOR.CLIENT_ID_TRACE_DISABLE(client_id => 'OE.OE');

23.3.2 Habilitación del seguimiento para un servicio, módulo y acción

El procedimiento DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE habilita el rastreo de SQL para la combinación especificada de nombre de servicio, módulo y operación globalmente para la base de datos a menos que el procedimiento especifique un nombre de instancia de base de datos.

El procedimiento SERV_MOD_ACT_TRACE_DISABLE deshabilita globalmente el rastreo para una combinación determinada de nombre de servicio, módulo y nombre de acción para todas las instancias habilitadas.

-- 启用
BEGIN 
  DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE(
    service_name  => 'ACCTG'   ,
    module_name   => 'PAYROLL' ,
    waits         =>  true     ,
    binds         =>  false    ,
    instance_name => 'inst1'   );
END;

-- 禁用
BEGIN 
  DBMS_MONITOR.SERV_MOD_ACT_TRACE_DISABLE(
    service_name  => 'ACCTG'   ,
    module_name   => 'PAYROLL' ,
    instance_name => 'inst1'   );
END;

23.3.3 Habilitación del seguimiento para una sesión

El procedimiento SESSION_TRACE_ENABLE habilita el seguimiento de un identificador de sesión (SID) de base de datos determinado en la instancia local.

Aunque el paquete DBMS_MONITOR solo puede ser invocado por usuarios con el rol de DBA, los usuarios también pueden habilitar el seguimiento de SQL para sus propias sesiones llamando al procedimiento DBMS_SESSION.SESSION_TRACE_ENABLE.

-- 为当前会话启用跟踪
BEGIN 
  DBMS_SESSION.SESSION_TRACE_ENABLE(
    waits => true
  , binds => false);
END;

-- 为指定会话启用跟踪
SELECT SID, SERIAL#, USERNAME 
FROM   V$SESSION
WHERE  USERNAME = 'OE';

       SID    SERIAL# USERNAME
---------- ---------- ------------------------------
        27         60 OE

BEGIN 
  DBMS_MONITOR.SESSION_TRACE_ENABLE(
    session_id => 27 
  , serial_num => 60
  , waits      => true
  , binds      => false);
END;

-- 为指定会话禁用跟踪
BEGIN
  DBMS_MONITOR.SESSION_TRACE_DISABLE(
    session_id => 27
  , serial_num => 60);
END;

23.3.4 Habilitación del seguimiento para una instancia o base de datos

El procedimiento DBMS_MONITOR.DATABASE_TRACE_ENABLE anula todos los demás seguimientos a nivel de sesión, pero se suma al seguimiento de identificadores de clientes, servicios, módulos y operaciones . Habilite el seguimiento para todas las sesiones actuales y futuras.

Todas las sesiones nuevas heredan la información de espera y vinculación especificada por este procedimiento hasta que llame al procedimiento DATABASE_TRACE_DISABLE. Cuando llama a este procedimiento con el parámetro nombre_instancia, el procedimiento restablece el seguimiento de SQL a nivel de sesión para la instancia nombrada. Si llama a este procedimiento sin un parámetro nombre_instancia, el procedimiento restablece el seguimiento de SQL a nivel de sesión para toda la base de datos.

Requisito previo: debe tener privilegios administrativos para ejecutar el procedimiento DATABASE_TRACE_ENABLE.

-- 启用
BEGIN 
  DBMS_MONITOR.DATABASE_TRACE_ENABLE(
    waits         => true
  , binds         => false
  , instance_name => 'inst1' );
END;

-- 禁用
EXECUTE DBMS_MONITOR.DATABASE_TRACE_DISABLE(instance_name => 'inst1');

-- 整库禁用
EXECUTE DBMS_MONITOR.DATABASE_TRACE_DISABLE();

23.4 Generación de archivos de salida usando SQL Trace y TKPROF

Esta sección describe los procedimientos básicos para usar SQL Trace y TKPROF.
El proceso de generación del archivo de salida es el siguiente:

  1. Establecer parámetros de inicialización para la gestión de archivos de seguimiento.
  2. Habilite SQL Trace Facility para la sesión deseada, luego ejecute la aplicación. Este paso genera un archivo de seguimiento que contiene estadísticas de las sentencias SQL emitidas por la aplicación.
  3. Ejecute TKPROF para convertir el archivo de seguimiento creado en el paso 2 en un archivo de salida legible. Este paso puede crear opcionalmente un script SQL que puede usar para almacenar las estadísticas en la base de datos.
  4. Como alternativa, ejecute el script SQL generado en el paso 3 para almacenar las estadísticas en la base de datos.

23.4.1 Paso 1: Configuración de parámetros de inicialización para la gestión de archivos de rastreo

Para habilitar los archivos de rastreo, debe asegurarse de que se establezcan ciertos parámetros de inicialización.

Cuando la función Rastreo de SQL está habilitada para una sesión, Oracle Database genera un archivo que contiene estadísticas para las sentencias SQL de rastreo de la sesión. Cuando la función SQL Trace está habilitada para una instancia, Oracle Database crea un archivo de seguimiento separado para cada proceso .

Establezca los parámetros de inicialización para la gestión de archivos de rastreo:

  1. Verifique la configuración de los parámetros de inicialización TIMED_STATISTICS, MAX_DUMP_FILE_SIZE y DIAGNOSTIC_DEST, como se muestra en la "Tabla 23-1".
parámetro describir
DIAGNOSTIC_DEST Especifica la ubicación de la página de inicio del Repositorio de diagnósticos automatizados (ADR). Los archivos de diagnóstico para cada instancia de la base de datos se encuentran en este directorio dedicado.
MAX_DUMP_FILE_SIZE Cuando la función Seguimiento de SQL está habilitada en el nivel de instancia de la base de datos, cada llamada a la base de datos escribe una línea de texto en un archivo en el formato de archivo del sistema operativo. El tamaño máximo de estos archivos en el bloque del sistema operativo está limitado por este parámetro de inicialización. El valor predeterminado es ilimitado.
TIMED_STATISTICS Habilite y deshabilite la recopilación de estadísticas programadas, como CPU y tiempo transcurrido, a través de la función SQL Trace, así como la recopilación de varias estadísticas en la vista V$.
El valor predeterminado de TIMED_STATISTICS es verdadero si STATISTICS_LEVEL se establece en TYPICAL o ALL. Si STATISTICS_LEVEL se establece en BASIC, el valor predeterminado de TIMED_STATISTICS es falso.
Habilitar la temporización provoca llamadas de temporización adicionales a operaciones de bajo nivel. Este es un parámetro dinámico. También es un parámetro de sesión.
  1. Idear una forma de identificar los archivos de rastreo generados.
    Asegúrese de saber distinguir los archivos de rastreo por su nombre. Puede marcar un archivo de rastreo incluyendo una declaración como SELECT program_name FROM DUAL en su programa. A continuación, puede rastrear cada archivo hasta el proceso que lo creó.
    También puede configurar el parámetro de inicialización TRACEFILE_IDENTIFIER para especificar un identificador personalizado para que forme parte del nombre del archivo de rastreo.
ALTER SESSION SET TRACEFILE_IDENTIFIER = 'my_trace_id';
  1. Si el sistema operativo mantiene varias versiones de archivos, asegúrese de que el límite de versiones sea lo suficientemente alto para acomodar la cantidad de archivos de seguimiento que desea que SQL Trace genere.

  2. Si los archivos de seguimiento generados pueden pertenecer a un usuario del sistema operativo que no sea el suyo, asegúrese de tener los permisos necesarios para formatearlos con TKPROF.

23.4.2 Paso 2: Habilitación de la función de seguimiento de SQL

Puede habilitar SQL Trace a nivel de instancia o sesión.

El paquete a utilizar depende del nivel:

  • Una instancia de base de datos
    habilita el seguimiento mediante el procedimiento DBMS_MONITOR.DATABASE_TRACE_ENABLE y deshabilita el seguimiento mediante el procedimiento DBMS_MONITOR.DATABASE_TRACE_DISABLE.

  • Sesiones de base de datos El rastreo
    está habilitado (verdadero) o deshabilitado (falso) mediante el procedimiento DBMS_SESSION.SET_SQL_TRACE.

Nota: Debido a la sobrecarga de ejecutar la herramienta SQL Trace, habilítela solo cuando ajuste las declaraciones SQL y deshabilítela cuando haya terminado.

-- 数据库层面
EXEC DBMS_MONITOR.DATABASE_TRACE_ENABLE(INSTANCE_NAME => 'orcl');
EXEC DBMS_MONITOR.DATABASE_TRACE_DISABLE(INSTANCE_NAME => 'orcl');

-- 会话级层面
EXEC DBMS_SESSION.SET_SQL_TRACE(sql_trace => true);
EXEC DBMS_SESSION.SET_SQL_TRACE(sql_trace => false);

23.4.3 Paso 3: Generación de archivos de salida con TKPROF

TKPROF acepta como entrada un archivo de rastreo generado por la herramienta de rastreo SQL y produce un archivo de salida formateado. TKPROF también puede generar planes de ejecución.

Después de que la herramienta Seguimiento de SQL genere un archivo de seguimiento, puede:

  • Ejecute TKPROF en cada archivo de rastreo individual, produciendo múltiples archivos de salida formateados, uno para cada sesión.
  • Adjunte el archivo de rastreo, luego ejecute TKPROF en los resultados para generar un archivo de salida formateado para toda la instancia.
  • Ejecute la utilidad de línea de comandos TRCSESS para combinar la información de seguimiento de varios archivos de seguimiento, luego ejecute TKPROF en los resultados.

TKPROF no informa de las declaraciones COMMIT y ROLLBACK registradas en los archivos de seguimiento.

Nota: Las siguientes declaraciones de SQL se truncan a 25 caracteres en el archivo de seguimiento de SQL:

SET ROLE
GRANT
ALTER USER
ALTER ROLE
CREATE USER
CREATE ROLE

Ejemplo 23-1 Salida TKPROF

SELECT * FROM emp, dept 
WHERE emp.deptno = dept.deptno;

call   count      cpu    elapsed     disk    query current    rows
---- -------  -------  --------- -------- -------- -------  ------
Parse      1     0.16      0.29         3       13       0       0
Execute    1     0.00      0.00         0        0       0       0
Fetch      1     0.03      0.26         2        2       4      14 
 
Misses in library cache during parse: 1 
Parsing user id: (8) SCOTT 

Rows     Execution Plan
-------  --------------------------------------------------- 14  MERGE JOIN
 4   SORT JOIN
 4     TABLE ACCESS (FULL) OF 'DEPT'
14    SORT JOIN
14      TABLE ACCESS (FULL) OF 'EMP'

Para esta declaración, la salida de TKPROF incluye la siguiente información:

  • El texto de la instrucción SQL
  • Estadísticas de SQL Trace en formato tabular
  • El número de errores de caché de la biblioteca para el análisis y la ejecución de sentencias.
  • El usuario analiza inicialmente la declaración.
  • El plan de ejecución generado por EXPLAIN PLAN.

TKPROF también proporciona un resumen de declaraciones a nivel de usuario y llamadas SQL recursivas al archivo de seguimiento.

23.4.4 Paso 4: Almacenamiento de estadísticas de recurso de seguimiento de SQL

Es posible que desee mantener un historial de las estadísticas generadas por la herramienta SQL Trace para su aplicación y compararlas a lo largo del tiempo.

TKPROF puede generar un script SQL que crea una tabla e inserta filas de estadísticas en ella. El guión contiene lo siguiente:

  • Una instrucción CREATE TABLE que crea una tabla de salida denominada TKPROF_TABLE.
  • Instrucciones INSERT que agregan filas de estadísticas a TKPROF_TABLE, una para cada instrucción SQL rastreada.

Después de ejecutar TKPROF, ejecute este script para almacenar estadísticas en la base de datos.

23.4.4.1 Generación del script SQL de salida TKPROF

Cuando ejecute TKPROF, use el parámetro INSERT para especificar el nombre del script SQL generado.

Si se omite el parámetro INSERT, TKPROF no genera scripts.

23.4.4.2 Edición del script SQL de salida TKPROF

Después de que TKPROF haya creado el script SQL, es posible que desee editar el script antes de ejecutarlo.

Si ya creó una tabla de salida para las estadísticas recopiladas anteriormente y desea agregar nuevas estadísticas a esa tabla, elimine la instrucción CREATE TABLE del script. Luego, el script inserta la nueva fila en la tabla existente. Si creó varias tablas de salida, tal vez para almacenar estadísticas de diferentes bases de datos en tablas diferentes, edite las declaraciones CREATE TABLE e INSERT para cambiar los nombres de las tablas de salida.

23.4.4.3 Consultar la tabla de salida

Después de crear la tabla de salida, use la declaración SELECT para consultar.

La siguiente instrucción CREATE TABLE crea TKPROF_TABLE:

CREATE TABLE TKPROF_TABLE (

DATE_OF_INSERT    DATE,
CURSOR_NUM        NUMBER,
DEPTH             NUMBER,
USER_ID           NUMBER,
PARSE_CNT         NUMBER,
PARSE_CPU         NUMBER,
PARSE_ELAP        NUMBER,
PARSE_DISK        NUMBER,
PARSE_QUERY       NUMBER,
PARSE_CURRENT     NUMBER,
PARSE_MISS        NUMBER,
EXE_COUNT         NUMBER,
EXE_CPU           NUMBER,
EXE_ELAP          NUMBER,
EXE_DISK          NUMBER,
EXE_QUERY         NUMBER,
EXE_CURRENT       NUMBER,
EXE_MISS          NUMBER,
EXE_ROWS          NUMBER,
FETCH_COUNT       NUMBER,
FETCH_CPU         NUMBER,
FETCH_ELAP        NUMBER,
FETCH_DISK        NUMBER,
FETCH_QUERY       NUMBER,
FETCH_CURRENT     NUMBER,
FETCH_ROWS        NUMBER,
CLOCK_TICKS       NUMBER,
SQL_STATEMENT     LONG);

La mayoría de las columnas de la tabla de salida corresponden directamente a las estadísticas que aparecen en el archivo de salida formateado. Por ejemplo, el valor de la columna PARSE_CNT corresponde a las estadísticas de recuento de los pasos de análisis en el archivo de salida.

Las columnas de la siguiente tabla lo ayudan a identificar una fila de estadísticas.

Tabla 23-2 Columnas TKPROF_TABLE utilizadas para identificar filas de estadísticas

Lista describir
SQL_STATEMENT Esta es la declaración de SQL para la cual la herramienta Seguimiento de SQL recopila filas de estadísticas. Debido a que el tipo de datos de esta columna es LONG, no se puede usar en expresiones o condiciones de la cláusula WHERE.
FECHA_DE_INSERTAR Esta es la fecha y la hora en que se insertó la fila en la tabla. Este valor difiere de cuando la herramienta Seguimiento de SQL recopila estadísticas.
PROFUNDIDAD Esto indica el nivel de recursividad en el que se emiten las sentencias SQL. Por ejemplo, un valor de 0 indica que el usuario emitió la declaración. Un valor de 1 indica que Oracle Database genera la declaración como una llamada recursiva para procesar una declaración con un valor de 0 (una declaración emitida por el usuario). Un valor de n indica que Oracle Database genera sentencias como llamadas recursivas para procesar sentencias con valor n-1.
ID_USUARIO Esto identifica al usuario que emitió la declaración. Este valor también aparece en el archivo de salida formateado.
CURSOR_NUM Oracle Database utiliza este valor de columna para realizar un seguimiento de a qué cursor se asigna cada instrucción SQL.

La tabla de salida no almacena el plan de ejecución de la declaración. La siguiente consulta devuelve estadísticas en la tabla de salida.

SELECT * FROM TKPROF_TABLE;

DATE_OF_INSERT CURSOR_NUM DEPTH USER_ID PARSE_CNT PARSE_CPU PARSE_ELAP
-------------- ---------- ----- ------- --------- --------- ---------- 
21-DEC-2017          1      0     8         1        16         22

PARSE_DISK PARSE_QUERY PARSE_CURRENT PARSE_MISS EXE_COUNT EXE_CPU 
---------- ----------- ------------- ---------- --------- ------- 
    3          11           0            1           1         0 

EXE_ELAP EXE_DISK EXE_QUERY EXE_CURRENT EXE_MISS EXE_ROWS FETCH_COUNT 
-------- -------- --------- ----------- -------- -------- ----------- 
    0        0        0          0          0        0         1 

FETCH_CPU FETCH_ELAP FETCH_DISK FETCH_QUERY FETCH_CURRENT FETCH_ROWS 
--------- ---------- ---------- ----------- ------------- ---------- 
     2        20          2          2            4           10 

SQL_STATEMENT 
---------------------------------------------------------------------
SELECT * FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO 

23.5 Directrices para interpretar la salida de TKPROF

Si bien TKPROF proporciona un análisis útil, la medida de eficiencia más precisa es el rendimiento de la aplicación . Al final de la salida de TKPROF hay un resumen del trabajo que realizó el proceso durante la ejecución del rastreo.

23.5.1 Pauta para Interpretar la Resolución de Estadísticas

Las estadísticas de tiempo tienen una resolución de centésimas de segundo . Por lo tanto, es posible que no se cronometre con precisión cualquier operación del cursor que tarde una centésima de segundo o menos.

Al interpretar las estadísticas, tenga en cuenta las limitaciones de tiempo. Tenga especial cuidado al interpretar los resultados de consultas simples que se ejecutan muy rápidamente.

23.5.2 Directrices para sentencias SQL recursivas

SQL recursivo es el SQL adicional que la base de datos Oracle debe emitir para ejecutar la sentencia SQL emitida por el usuario .

Conceptualmente, SQL recursivo es "SQL de efectos secundarios". Por ejemplo, si una sesión inserta una fila en una tabla que no tiene suficiente espacio para la fila, la base de datos realiza llamadas SQL recursivas para asignar espacio de forma dinámica. La base de datos también genera llamadas recursivas cuando la información del diccionario de datos no está disponible en la memoria y, por lo tanto, debe recuperarse del disco.

Si se producen llamadas recursivas cuando la función de seguimiento de SQL está habilitada, TKPROF genera estadísticas para sentencias SQL recursivas y las marca claramente como sentencias SQL recursivas en el archivo de salida. Puede suprimir las llamadas recursivas internas de la base de datos de Oracle (por ejemplo, la gestión del espacio) para que no aparezcan en el archivo de salida configurando el parámetro de línea de comandos SYS en NO. Las estadísticas de las sentencias SQL recursivas se incluyen en la lista de esa sentencia, no en la lista de la sentencia SQL que provocó la llamada recursiva. Por lo tanto, cuando calcule los recursos totales necesarios para procesar una sentencia SQL, tenga en cuenta las estadísticas de esa sentencia y las estadísticas de las llamadas recursivas que realiza la sentencia.

Nota: las operaciones de nivel SQL no incluyen estadísticas SQL recursivas.

23.5.3 Pauta para decidir qué sentencias ajustar

Debe determinar qué sentencias SQL usan la mayoría de los recursos de CPU o disco .

Si el parámetro TIMED_STATISTICS está habilitado, puede encontrar una alta actividad de la CPU en la columna de la CPU. Si TIMED_STATISTICS no está habilitado, verifique las columnas QUERY y CURRENT.

Además de los problemas de bloqueo y los bucles PL/SQL ineficientes, no se necesita tiempo de CPU ni tiempo de ejecución para encontrar la declaración del problema. La clave es el número de accesos al bloque , tanto de consulta (es decir, sujeto a restricciones de coherencia de lectura) como actual (es decir, no sujeto a restricciones de coherencia de lectura). Los encabezados de sección y los bloques que se actualizarán se recuperan de la manera actual, pero todo el procesamiento de consultas y subconsultas solicita datos en forma de consulta. Estas son exactamente las mismas que las estadísticas de instancia CONSISTENT GETS y DB BLOCK GETS . Puede encontrar alta actividad de disco en la columna de disco.

La siguiente lista muestra la salida de TKPROF para una instrucción SQL tal como aparece en el archivo de salida:

SELECT * 
FROM emp, dept 
WHERE emp.deptno = dept.deptno;

call   count      cpu    elapsed     disk    query current    rows
---- -------  -------  --------- -------- -------- -------  ------
Parse     11     0.08      0.18        0       0       0         0
Execute   11     0.23      0.66        0       3       6         0
Fetch     35     6.70      6.83      100   12326       2       824
------------------------------------------------------------------
total     57     7.01      7.67      100   12329       8       826

Misses in library cache during parse: 0 

Si 7,01 segundos de CPU y 824 filas recuperadas son aceptables, entonces no es necesario que busque más en este resultado de seguimiento. De hecho, uno de los principales usos de los informes TKPROF en los ejercicios de ajuste es eliminar procesos de la fase de ajuste detallado.

El resultado muestra que se realizaron 10 llamadas de análisis innecesarias (ya que hubo 11 llamadas de análisis para esta sola declaración) y se realizó una búsqueda de matriz. Se obtuvieron más filas de las que se ejecutaron. Las grandes brechas entre la CPU y los tiempos transcurridos indican E/S física .

23.5.4 Directrices para evitar trampas en la interpretación de TKPROF

Al interpretar la salida de TKPROF, es útil estar al tanto de las trampas comunes.

23.5.4.1 Pauta para evitar la trampa del argumento

Si no conoce el límite de valor en tiempo de ejecución, puede caer en la trampa de parámetros.

EXPLAIN PLAN no puede determinar el tipo de una variable de vinculación a partir del texto de la declaración SQL, siempre asume que el tipo es VARCHAR. Si las variables de vinculación son en realidad números o fechas, TKPROF provoca conversiones de datos implícitas, lo que puede conducir a planes de ejecución ineficientes. Para evitar esto, pruebe diferentes tipos de datos en sus consultas y realice la conversión usted mismo.

23.5.4.2 Pauta para evitar la trampa de coherencia de lectura

Sin saber que una transacción no confirmada realizó una serie de actualizaciones en la columna, es difícil entender por qué se producen tantos accesos a bloques.

Esta situación no suele ser repetible. Si el proceso se vuelve a ejecutar, es poco probable que otra transacción interactúe con él de la misma manera.

SELECT name_id
FROM cq_names 
WHERE name = 'FLOOR';

call     count     cpu     elapsed     disk     query current     rows
----     -----     ---     -------     ----     ----- -------     ----
Parse        1    0.10        0.18        0         0       0        0
Execute      1    0.00        0.00        0         0       0        0
Fetch        1    0.11        0.21        2       101       0        1

Misses in library cache during parse: 1
Parsing user id: 01 (USER1)

Rows     Execution Plan
----     --------- ----
   0     SELECT STATEMENT
   1       TABLE ACCESS (BY ROWID) OF 'CQ_NAMES'
   2         INDEX (RANGE SCAN) OF 'CQ_NAMES_NAME' (NON_UNIQUE) 

23.5.4.3 Pauta para evitar la trampa del esquema

En algunos casos, una consulta de índice aparentemente simple analiza muchos bloques de base de datos y accede a ellos en el esquema actual.

El siguiente ejemplo muestra un ejemplo extremo (y por lo tanto fácil de detectar) de una trampa arquitectónica:

SELECT name_id
FROM cq_names 
WHERE name = 'FLOOR';

call        count        cpu      elapsed     disk  query current rows
--------  -------   --------    ---------  ------- ------ ------- ----
Parse           1       0.06         0.10        0      0       0    0
Execute         1       0.02         0.02        0      0       0    0 
Fetch           1       0.23         0.30       31     31       3    1

Misses in library cache during parse: 0
Parsing user id: 02  (USER2)

Rows     Execution Plan
-------  ---------------------------------------------------
      0  SELECT STATEMENT
   2340    TABLE ACCESS (BY ROWID) OF 'CQ_NAMES'
      0      INDEX (RANGE SCAN) OF 'CQ_NAMES_NAME' (NON-UNIQUE)

Dos estadísticas indican que la consulta puede haberse ejecutado con una exploración completa de la tabla: el acceso al bloque de esquema actual y el número de filas en el plan desde el origen de la fila del acceso a la tabla. La explicación es que el índice requerido se crea después de generar el archivo de rastreo pero antes de ejecutar TKPROF. La generación de un nuevo archivo de seguimiento proporciona los siguientes datos:

SELECT name_id
FROM cq_names 
WHERE name = 'FLOOR'; 

call    count    cpu   elapsed  disk  query current     rows
-----  ------ ------  -------- ----- ------ -------    -----
Parse       1   0.01      0.02     0      0       0        0
Execute     1   0.00      0.00     0      0       0        0
Fetch       1   0.00      0.00     0      2       0        1

Misses in library cache during parse: 0
Parsing user id: 02  (USER2)

Rows     Execution Plan
-------  ---------------------------------------------------
      0  SELECT STATEMENT
      1    TABLE ACCESS (BY ROWID) OF 'CQ_NAMES'
      2      INDEX (RANGE SCAN) OF 'CQ_NAMES_NAME' (NON-UNIQUE)

En la versión correcta, la llamada de análisis tomó 10 ms de tiempo de CPU y 20 ms de tiempo de ejecución, pero la consulta obviamente no tomó tiempo para ejecutarse y ejecutar la recuperación. Estas excepciones se producen porque 10 milisegundos de pulsos de reloj son demasiado largos en relación con el tiempo que se tarda en ejecutar y obtener datos. En este caso, es importante ejecutar la declaración varias veces para obtener números estadísticamente válidos.

23.5.4.4 Pauta para evitar la trampa del tiempo

En algunos casos, la consulta tarda un tiempo inexplicablemente largo.

Por ejemplo, la actualización de las siguientes 7 filas tardó 19 segundos:

UPDATE cq_names 
  SET ATTRIBUTES = lower(ATTRIBUTES)
  WHERE ATTRIBUTES = :att 

call       count       cpu    elapsed     disk    query current        rows
-------- -------  --------  --------- -------- -------- -------  ----------
Parse          1      0.06       0.24        0        0       0           0
Execute        1      0.62      19.62       22      526      12           7
Fetch          0      0.00       0.00        0        0       0           0

Misses in library cache during parse: 1
Parsing user id: 02  (USER2)

Rows     Execution Plan
-------  ---------------------------------------------------
      0  UPDATE STATEMENT
   2519  TABLE ACCESS (FULL) OF 'CQ_NAMES'

La explicación fue la interferencia de otra transacción . En este caso, otra transacción mantiene un bloqueo compartido en la tabla cq_names durante unos segundos antes y después de que se publique la actualización. El diagnóstico de la aparición de efectos de interferencia requiere experiencia . Por un lado, la comparación de datos es esencial cuando las perturbaciones provocan solo latencias cortas (o pequeños aumentos en los accesos a bloques en el ejemplo anterior). Sin embargo, si la interferencia genera solo una sobrecarga modesta y la declaración es intrínsecamente válida, puede que no sea necesario analizar sus estadísticas.

23.6 Utilidades de rastreo de aplicaciones

Las utilidades de seguimiento de Oracle son TKPROF y TRCSESS.

23.6.1 TRCSESS

La utilidad TRCSESS combina la salida de seguimiento de los archivos de seguimiento seleccionados de acuerdo con los criterios especificados por el usuario.

Después de que TRCSESS haya fusionado la información de seguimiento en un solo archivo de salida, TKPROF puede procesar el archivo de salida.

23.6.1.1 Propósito

TRCSESS es útil para consolidar seguimientos específicos de la sesión con fines de rendimiento o depuración.

El seguimiento de una sesión específica generalmente no es un problema en el modelo de servidor dedicado, ya que un proceso sirve una sesión durante su vida útil. Puede ver la información de seguimiento de las sesiones de los archivos de seguimiento que pertenecen al proceso del servidor. Sin embargo, en una configuración de servidor compartido, las sesiones de usuario son atendidas por diferentes procesos a lo largo del tiempo. Los rastros de las sesiones de los usuarios están dispersos en diferentes archivos de rastreo que pertenecen a diferentes procesos, lo que dificulta obtener una imagen completa del ciclo de vida de la sesión.

23.6.1.2 Directrices

Debe especificar una de las opciones de sesión, ID de cliente, servicio, acción o módulo.

Si especifica más de una opción, TRCSESS fusionará todos los archivos de rastreo que cumplan con los criterios especificados en el archivo de salida.

23.6.1.3 Sintaxis

trcsess  [output=output_file_name]
         [session=session_id]
         [clientid=client_id]
         [service=service_name]
         [action=action_name]
         [module=module_name]
         [trace_files]

23.6.1.4 Opciones

TRCSESS admite muchas opciones de línea de comandos.

parámetro describir
producción Especifica el archivo donde se genera la salida. Si no se especifica esta opción, la utilidad escribirá en la salida estándar.
sesión Combine la información de seguimiento para las sesiones especificadas. Un identificador de sesión es una combinación de un índice de sesión y un número de secuencia de sesión, como 21.2371. Puede encontrar estos valores en la vista V$SESSION.
Identificación del cliente Combine la información de seguimiento para el ID de cliente especificado.
servicio Combine la información de rastreo para el nombre de servicio especificado.
acción Combine la información de rastreo para el nombre de operación especificado.
módulo Combine la información de rastreo para el nombre del módulo especificado.
archivos_rastreo Enumere los nombres de los archivos de rastreo, separados por espacios, donde TRCSESS debe buscar información de rastreo. Puede utilizar caracteres comodín (*) para especificar nombres de archivos de seguimiento. Si no se especifica ningún archivo de seguimiento, TRCSESS utilizará todos los archivos del directorio actual como entrada.

23.6.1.5 Ejemplos

Ejemplo 23-2 Seguimiento de una sola sesión:

trcsess session=21.2371
trcsess session=21.2371 main_12359.trc main_12995.trc

La salida es:

[PROCESS ID = 12359] 
*** 2014-04-02 09:48:28.376 
PARSING IN CURSOR #1 len=17 dep=0 uid=27 oct=3 lid=27 tim=868373970961 hv=887450622 ad='22683fb4' 
select * from cat 
END OF STMT 
PARSE #1:c=0,e=339,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=868373970944 
EXEC #1:c=0,e=221,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=868373971411 
FETCH #1:c=0,e=791,p=0,cr=7,cu=0,mis=0,r=1,dep=0,og=4,tim=868373972435 
FETCH #1:c=0,e=1486,p=0,cr=20,cu=0,mis=0,r=6,dep=0,og=4,tim=868373986238 
*** 2014-04-02 10:03:58.058 
XCTEND rlbk=0, rd_only=1 
STAT #1 id=1 cnt=7 pid=0 pos=1 obj=0 op='FILTER  ' 
STAT #1 id=2 cnt=7 pid=1 pos=1 obj=18 op='TABLE ACCESS BY INDEX ROWID OBJ$ ' 
STAT #1 id=3 cnt=7 pid=2 pos=1 obj=37 op='INDEX RANGE SCAN I_OBJ2 ' 
STAT #1 id=4 cnt=0 pid=1 pos=2 obj=4 op='TABLE ACCESS CLUSTER TAB$J2 ' 
STAT #1 id=5 cnt=6 pid=4 pos=1 obj=3 op='INDEX UNIQUE SCAN I_OBJ# ' 
[PROCESS ID=12995] 
*** 2014-04-02 10:04:32.738 
Archiving is disabled  

23.6.2 PROF TK

El programa TKPROF formatea el contenido de un archivo de rastreo y coloca la salida en un archivo de salida legible.

TKPROF también puede hacer lo siguiente:

  • Cree scripts SQL que almacenen estadísticas en la base de datos
  • Determinar el plan de ejecución de la sentencia SQL

Nota: la salida de TKPROF no incluye automáticamente el plan de ejecución real de la instrucción SQL si el cursor de la instrucción SQL no está cerrado. En este caso, utilice la opción EXPLAIN con TKPROF para generar un plan de ejecución.
TKPROF informa los recursos consumidos por cada declaración ejecutada, la cantidad de veces que se llamó y la cantidad de filas que procesó.

23.6.2.1 Propósito

TKPROF encuentra las sentencias que más recursos consumen .

Con una línea de base disponible , puede evaluar si los recursos utilizados son razonables para la situación de trabajo dada.

23.6.2.2 Directrices

Los archivos de entrada y salida son los únicos parámetros necesarios.

Si invoca TKPROF sin argumentos, la herramienta muestra ayuda en línea.

23.6.2.3 Sintaxis

tkprof input_file output_file
  [ waits=yes|no ] 
  [ sort=option ] 
  [ print=n ]
  [ aggregate=yes|no ] 
  [ insert=filename3 ] 
  [ sys=yes|no ]
  [ table=schema.table ]
  [ explain=user/password ] 
  [ record=filename4 ] 
  [ width=n ]

23.6.2.4 Opciones

TKPROF admite muchas opciones de línea de comandos.

parámetro describir
fichero de entrada Especifica el archivo de entrada, que es un archivo de seguimiento que contiene estadísticas generadas por la función Seguimiento de SQL. Este archivo puede ser un archivo de seguimiento generado para una única sesión o mediante la concatenación de un único archivo de seguimiento de varias sesiones.
archivo de salida Especifica el archivo en el que TKPROF escribe su salida formateada.
MURGA Especifica si registrar un resumen de los eventos de espera encontrados en el archivo de seguimiento. Los valores válidos son SÍ (predeterminado) y NO.
CLASIFICAR Ordena las instrucciones SQL rastreadas en orden descendente de las opciones de ordenación especificadas antes de incluirlas en el archivo de salida. Si se especifica más de una opción, la salida se ordena en orden descendente por la suma de los valores especificados en las opciones de ordenación. Si omite este parámetro, TKPROF enumera las declaraciones en el archivo de salida en el orden en que se usaron por primera vez. Las opciones de clasificación son las siguientes:
IMPRIMIR Enumere solo la primera instrucción SQL ordenada por enteros en el archivo de salida. Si se omite este parámetro, TKPROF enumera todas las sentencias de SQL rastreadas. Este parámetro no afecta a los scripts SQL opcionales. Los scripts SQL siempre generan datos de inserción para todas las declaraciones SQL rastreadas.
AGREGAR Si especifica AGGREGATE = NO, TKPROF no agregará múltiples usos del mismo literal SQL.
INSERTAR Cree un script SQL que almacene estadísticas de archivos de seguimiento en la base de datos. TKPROF crea este script con el nombre filename3. Este script crea una tabla e inserta una fila de estadísticas en la tabla para cada instrucción SQL rastreada.
SISTEMA Habilita y deshabilita la lista de sentencias SQL emitidas por el usuario SYS o sentencias SQL recursivas en el archivo de salida. El valor predeterminado SÍ hace que TKPROF enumere estas declaraciones. Un valor de NO hace que TKPROF los ignore. Este parámetro no afecta a los scripts SQL opcionales. Los scripts SQL siempre insertan estadísticas para todas las declaraciones SQL rastreadas, incluidas las declaraciones SQL recursivas.
MESA Especifica el esquema y el nombre de la tabla donde TKPROF coloca temporalmente el plan de ejecución antes de escribirlo en el archivo de salida. Si la tabla especificada existe, TKPROF elimina todas las filas de la tabla, las usa en la instrucción EXPLAIN PLAN (escribe más filas en la tabla) y luego elimina las filas. Si la tabla no existe, TKPROF la crea, la usa y la descarta.
EXPLICAR Determina el plan de ejecución para cada instrucción SQL en el archivo de seguimiento y escribe estos planes de ejecución en el archivo de salida. TKPROF también muestra el número de filas procesadas por cada paso del plan de ejecución.
REGISTRO Crea un script SQL con el nombre de archivo especificado usando todo el SQL no recursivo en el archivo de seguimiento. Puede utilizar este script para reproducir eventos de usuario en un archivo de seguimiento.
ANCHO Un número entero que controla el ancho de línea de salida de ciertas salidas TKPROF, como los planes de explicación. Este parámetro es útil para el procesamiento posterior de la salida TKPROF.

Las opciones después del parámetro SORT son las siguientes: El prefijo PRS indica la fase PARSE, EXE indica la fase EXECUTE y FCH indica la fase FETCH:

PRSCNT - 解析次数
PRSCPU - 解析所花费的 CPU 时间
PRSELA - 解析所用时间
PRSDSK - 解析期间从磁盘物理读取的次数
PRSQRY - 解析期间一致模式块读取数
PRSCU - 解析期间读取的当前模式块数
PRSMIS - 分析期间库高速缓存未命中数
EXECNT - 执行次数
EXECPU - 执行所花费的 CPU 时间
EXEELA - 执行所花费的时间
EXEDSK - 执行期间从磁盘物理读取的次数
EXEQRY - 执行期间一致模式块读取数
EXECU - 执行期间当前模式块读取数
EXEROW - 执行期间处理的行数
EXEMIS - 执行期间库缓存未命中数
FCHCNT - 提取次数
FCHCPU - 获取数据所花费的 CPU 时间
FCHELA - 提取所用的时间
FCHDSK - 提取期间从磁盘物理读取的次数
FCHQRY - 获取期间一致模式块读取数
FCHCU - 获取期间当前模式块读取数
FCHROW - 获取的行数
USERID - 解析游标的用户 ID

23.6.2.5 Salida

Esta sección explica la salida de TKPROF.

23.6.2.5.1 Identificación del Usuario que Emite la Sentencia SQL en TKPROF

TKPROF enumera el ID de usuario del usuario que emitió cada instrucción SQL.

如果 SQL 跟踪输入文件包含来自多个用户的统计信息,并且如果该语句是由多个用户发出的,那么 TKPROF 会列出最后一个用户的 ID 来解析该语句。 所有数据库用户的用户 ID 出现在数据字典中的 ALL_USERS.USER_ID 列中。

23.6.2.5.2 Tabular Statistics in TKPROF

TKPROF 列出发出每个 SQL 语句的用户的用户 ID。

如果 SQL 跟踪输入文件包含来自多个用户的统计信息,并且如果该语句是由多个用户发出的,那么 TKPROF 会列出最后一个用户的 ID 来解析该语句。 所有数据库用户的用户 ID 出现在数据字典中的 ALL_USERS.USER_ID 列中。

表 23-4 CALL 列值

CALL值 含义
PARSE 将 SQL 语句转换为执行计划,包括检查是否有适当的安全授权以及检查表、列和其他引用对象是否存在。
EXECUTE Oracle 数据库实际执行的语句。 对于 INSERT、UPDATE、DELETE 和 MERGE 语句,这会修改数据。 对于 SELECT 语句,这标识了选定的行。
FETCH 检索查询返回的行。 仅对 SELECT 语句执行提取。

SQL 跟踪工具输出的其他列是语句的所有解析、执行和提取的组合统计信息。 query 和 current 的总和是访问的缓冲区总数,也称为逻辑 I/O (LIO)。 请参见表 23-5。

表 23-5 解析、执行和获取的 SQL 跟踪统计信息。

SQL Trace统计 含义
COUNT 语句被解析、执行或提取的次数。
CPU 语句的所有解析、执行或提取调用的总 CPU 时间(以秒为单位)。 如果未启用 TIMED_STATISTICS,则此值为零 (0)。
ELAPSED 语句的所有解析、执行或提取调用的总耗用时间(以秒为单位)。 如果未启用 TIMED_STATISTICS,则此值为零 (0)。
DISK 为所有解析、执行或提取调用从磁盘上的数据文件物理读取的数据块总数。
QUERY 在一致模式下为所有解析、执行或提取调用检索的缓冲区总数。 通常,缓冲区以查询的一致模式检索。
CURRENT 当前模式中检索到的缓冲区总数。 在当前模式下检索缓冲区以用于 INSERT、UPDATE 和 DELETE 等语句。

有关已处理行的统计信息显示在 ROWS 列中。 该列显示 SQL 语句处理的行数。 此总数不包括由 SQL 语句的子查询处理的行。 对于 SELECT 语句,返回的行数出现在提取步骤中。 对于 UPDATE、DELETE 和 INSERT 语句,处理的行数出现在执行步骤中。

注意:关闭游标时会显示行源计数。 在SQL*Plus中,只有一个用户游标,所以每执行一条语句都会导致前一个游标关闭; 因此,显示行源计数。 PL/SQL 有自己的游标处理,并且在父游标关闭时不会关闭子游标。 退出或重新连接会导致显示计数。

23.6.2.5.3 Library Cache Misses in TKPROF

TKPROF 还列出了每个 SQL 语句的解析和执行步骤导致的库缓存未命中数。

这些统计数据出现在表格统计数据之后的单独行中。 如果该语句导致没有库高速缓存未命中,则 TKPROF 不会列出统计信息。 在“示例”中,该语句导致解析步骤有一次库缓存未命中,而执行步骤没有未命中。

23.6.2.5.4 Row Source Operations in TKPROF

在 TKPROF 输出中,行源操作显示对行执行的每个操作处理的行数,以及其他行源信息,例如物理读取和写入。

表 23-6 行源操作

行源操作 含义
cr 行源执行的一致读取。
r 行源执行的物理读取
w 行源执行的物理写入
time 以微秒为单位的时间

在以下示例 TKPROF 输出中,注意行源操作列下的 cr、r、w 和时间值:

Rows     Row Source Operation
-------  ---------------------------------------------------
      0  DELETE  (cr=43141 r=266947 w=25854 time=60235565 us)
  28144   HASH JOIN ANTI (cr=43057 r=262332 w=25854 time=48830056 us)
  51427    TABLE ACCESS FULL STATS$SQLTEXT (cr=3465 r=3463 w=0 time=865083 us)
 647529    INDEX FAST FULL SCAN STATS$SQL_SUMMARY_PK 
                      (cr=39592 r=39325 w=0 time=10522877 us) (object id 7409)
23.6.2.5.5 Wait Event Information in TKPROF

如果存在等待事件信息,则 TKPROF 输出包括等待事件部分。

输出类似于以下内容:

Elapsed times include waiting on following events:

  Event waited on                 Times Waited   Max. Wait  Total Waited
  ---------------------------     ------------   ---------  ------------
  db file sequential read                 8084        0.12          5.34
  direct path write                        834        0.00          0.00
  direct path write temp                   834        0.00          0.05
  db file parallel read                      8        1.53          5.51
  db file scattered read                  4180        0.07          1.45
  direct path read                        7082        0.00          0.05
  direct path read temp                   7082        0.00          0.44
  rdbms ipc reply                           20        0.00          0.01
  SQL*Net message to client                  1        0.00          0.00
  SQL*Net message from client                1        0.00          0.00

此外,在文件末尾对整个跟踪文件的等待事件进行汇总。

要确保将等待事件信息写入会话的跟踪文件,请运行以下 SQL 语句:

ALTER SESSION SET EVENTS '10046 trace name context forever, level 8';

23.6.2.6 Examples

本节演示常见的 TKPROF 用例。

示例 23-4 打印资源最密集的语句

如果您正在使用 SORT 参数和 PRINT 参数的组合处理大型跟踪文件,那么您可以生成仅包含最高资源密集型语句的 TKPROF 输出文件。 以下语句打印跟踪文件中产生最多物理 I/O 的 10 个语句:

TKPROF ora53269.trc ora53269.prf SORT = (PRSDSK, EXEDSK, FCHDSK) PRINT = 10

示例 23-5 生成 SQL 脚本

此示例运行 TKPROF,接受名为 examp12_jane_fg_sqlplus_007.trc 的跟踪文件,并写入名为 outputa.prf 的格式化输出文件:

TKPROF examp12_jane_fg_sqlplus_007.trc OUTPUTA.PRF EXPLAIN=hr 
  TABLE=hr.temp_plan_table_a INSERT=STOREA.SQL SYS=NO SORT=(EXECPU,FCHCPU)

此示例可能比屏幕上的单行长,您可能需要使用连续字符,具体取决于操作系统。

请注意此示例中的其他参数:

  • EXPLAIN 值导致 TKPROF 作为用户 hr 连接并使用 EXPLAIN PLAN 语句为每个跟踪的 SQL 语句生成执行计划。 您可以使用它来获取访问路径和行源计数。
    注意:如果 SQL 语句的游标没有关闭,则 TKPROF 输出不会自动包含 SQL 语句的实际执行计划。 在这种情况下,您可以使用带有 TKPROF 的 EXPLAIN 选项来生成执行计划。
  • TABLE 值导致 TKPROF 使用模式 scott 中的表 temp_plan_table_a 作为临时计划表。
  • INSERT 值导致 TKPROF 生成名为 STOREA.SQL 的 SQL 脚本,该脚本存储数据库中所有跟踪的 SQL 语句的统计信息。
  • 值为 NO 的 SYS 参数导致 TKPROF 从输出文件中省略递归 SQL 语句。 这样就可以忽略临时表操作等Oracle数据库内部语句。
  • SORT 值导致 TKPROF 按照执行所花费的 CPU 时间和在将它们写入输出文件之前获取行所花费的 CPU 时间的总和对 SQL 语句进行排序。 为了获得最高效率,请始终使用 SORT 参数。

示例 23-6 TKPROF 标头

此示例显示了 TKPROF 报告的样本标题。

TKPROF: Release 12.1.0.0.2
 
Copyright (c) 1982, 2012, Oracle and/or its affiliates.  All rights reserved.
 
Trace file: /disk1/oracle/log/diag/rdbms/orcla/orcla/trace/orcla_ora_917.trc
Sort options: default
 
***************************************************************************
count    = number of times OCI procedure was executed
cpu      = cpu time in seconds executing
elapsed  = elapsed time in seconds executing
disk     = number of physical reads of buffers from disk
query    = number of buffers gotten for consistent read
current  = number of buffers gotten in current mode (usually for update)
rows     = number of rows processed by the fetch or execute call
***************************************************************************

示例 23-7 TKPROF 主体

此示例显示了 TKPROF 报告的样本主体。

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2      0.01       0.00          0          0          0           0

Misses in library cache during parse: 1
Optimizer mode: FIRST_ROWS
Parsing user id: 44  

Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                       1        0.00          0.00
  SQL*Net message from client                     1       28.59         28.59
********************************************************************************

select condition 
from
 cdef$ where rowid=:1

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        1      0.00       0.00          0          2          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        3      0.00       0.00          0          2          0           1

Misses in library cache during parse: 1
Optimizer mode: CHOOSE
Parsing user id: SYS   (recursive depth: 1)

Rows     Row Source Operation
-------  ---------------------------------------------------
      1  TABLE ACCESS BY USER ROWID OBJ#(31) (cr=1 r=0 w=0 time=151 us)

********************************************************************************

SELECT last_name, job_id, salary
  FROM employees
WHERE salary =
  (SELECT max(salary) FROM employees)

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.02       0.01          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      0.00       0.00          0         15          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      0.02       0.01          0         15          0           1

Misses in library cache during parse: 1
Optimizer mode: FIRST_ROWS
Parsing user id: 44  

Rows     Row Source Operation
-------  ---------------------------------------------------
      1  TABLE ACCESS FULL EMPLOYEES (cr=15 r=0 w=0 time=1743 us)
      1   SORT AGGREGATE (cr=7 r=0 w=0 time=777 us)
    107    TABLE ACCESS FULL EMPLOYEES (cr=7 r=0 w=0 time=655 us)

Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                       2        0.00          0.00
  SQL*Net message from client                     2        9.62          9.62
********************************************************************************

********************************************************************************
 delete
         from stats$sqltext st
        where (hash_value, text_subset) not in
             (select --+ hash_aj
                     hash_value, text_subset
                from stats$sql_summary ss
               where (   (   snap_id     < :lo_snap
                          or snap_id     > :hi_snap
                         )
                         and dbid            = :dbid
                         and instance_number = :inst_num
                     )
                  or (   dbid            != :dbid
                      or instance_number != :inst_num)
              )

call     count       cpu    elapsed       disk      query    current rows
------- ------  -------- ---------- ---------- ---------- ---------- ----------
Parse        1      0.00       0.00          0          0          0          0
Execute      1     29.60      60.68     266984      43776     131172      28144
Fetch        0      0.00       0.00          0          0          0          0
------- ------  -------- ---------- ---------- ---------- ---------- ----------
total        2     29.60      60.68     266984      43776     131172      28144

Misses in library cache during parse: 1
Misses in library cache during execute: 1
Optimizer mode: CHOOSE
Parsing user id: 22

Rows     Row Source Operation
-------  ---------------------------------------------------
      0  DELETE  (cr=43141 r=266947 w=25854 time=60235565 us)
  28144   HASH JOIN ANTI (cr=43057 r=262332 w=25854 time=48830056 us)
  51427    TABLE ACCESS FULL STATS$SQLTEXT (cr=3465 r=3463 w=0 time=865083 us)
 647529    INDEX FAST FULL SCAN STATS$SQL_SUMMARY_PK 
                      (cr=39592 r=39325 w=0 time=10522877 us) (object id 7409)

Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  db file sequential read                      8084        0.12          5.34
  direct path write                             834        0.00          0.00
  direct path write temp                        834        0.00          0.05
  db file parallel read                           8        1.53          5.51
  db file scattered read                       4180        0.07          1.45
  direct path read                             7082        0.00          0.05
  direct path read temp                        7082        0.00          0.44
  rdbms ipc reply                                20        0.00          0.01
  SQL*Net message to client                       1        0.00          0.00
  SQL*Net message from client                     1        0.00          0.00
********************************************************************************

示例 23-8 TKPROF 摘要

此示例显示 TKPROF 报告的摘要。

OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        4      0.04       0.01          0          0          0           0
Execute      5      0.00       0.04          0          0          0           0
Fetch        2      0.00       0.00          0         15          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total       11      0.04       0.06          0         15          0           1

Misses in library cache during parse: 4
Misses in library cache during execute: 1
Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                       6        0.00          0.00
  SQL*Net message from client                     5       77.77        128.88

OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        1      0.00       0.00          0          2          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        3      0.00       0.00          0          2          0           1

Misses in library cache during parse: 1
    5  user  SQL statements in session.
    1  internal SQL statements in session.
    6  SQL statements in session.
********************************************************************************
Trace file: main_ora_27621.trc
Trace file compatibility: 9.00.01
Sort options: default
       1  session in tracefile.
       5  user  SQL statements in trace file.
       1  internal SQL statements in trace file.
       6  SQL statements in trace file.
       6  unique SQL statements in trace file.
      76  lines in trace file.
     128  elapsed seconds in trace file.

23.7 Views for Application Tracing

您可以使用数据字典和 V$ 视图来监视跟踪。

23.7.1 Views Relevant for Trace Statistics

您可以显示使用以下 V$ 和 DBA 视图收集的统计信息。

表 23-7 诊断视图

视图 描述
DBA_ENABLED_AGGREGATIONS 当前启用的统计信息的累积全局统计信息
V$CLIENT_STATS 指定客户端标识符的累积统计信息
V$SERVICE_STATS 指定服务的累计统计信息
V$SERV_MOD_ACT_STATS 指定服务、模块和操作的组合的累积统计信息
V$SERVICEMETRIC 数据库调用经过时间和 CPU 使用的累积统计信息
V$DIAG_TRACE_FILE 有关当前容器的 ADR 中所有跟踪文件的信息
V$DIAG_APP_TRACE_FILE 有关当前容器的 ADR 中包含应用程序跟踪数据(SQL_TRACE 或 OPTIMIZER_TRACE 事件数据)的所有跟踪文件的信息
V$DIAG_TRACE_FILE_CONTENTS ADR 中跟踪文件中的跟踪数据
V$DIAG_SQL_TRACE_RECORDS ADR 中跟踪文件中的 SQL_TRACE 数据
V$DIAG_OPT_TRACE_RECORDS ADR 中跟踪文件中的优化器跟踪事件数据
V$DIAG_SESS_SQL_TRACE_RECORDS 当前用户会话的 ADR 跟踪文件中的 SQL_TRACE 数据
V$DIAG_SESS_OPT_TRACE_RECORDS 当前用户会话的 ADR 跟踪文件中的优化器跟踪事件数据
V$DIAG_ALERT_EXT 当前容器的 ADR 中基于 XML 的警报日志的内容

23.7.2 Views Related to Enabling Tracing

Cloud Control 报告或 DBA_ENABLED_TRACES 视图可以显示未完成的跟踪。

在 DBA_ENABLED_TRACES 视图中,您可以确定有关如何启用跟踪的详细信息,包括跟踪类型。 跟踪类型指定是否为客户端标识符、会话、服务、数据库或服务、模块和操作的组合启用跟踪。

Supongo que te gusta

Origin blog.csdn.net/stevensxiao/article/details/128891358
Recomendado
Clasificación