Todos los productos
Search
Centro de documentos

PolarDB:dbms_sql.add_trace

Última actualización: Sep 09, 2026

dbms_sql.add_trace es un procedimiento almacenado que registra instrucciones SQL específicas para que la función SQL Trace las rastree bajo demanda.

Requisitos previos

Establezca el parámetro loose_sql_trace_type en DEMAND antes de llamar a este procedimiento.

Sintaxis

dbms_sql.add_trace('<schema>', '<query>')

Después de ejecutar el procedimiento, PolarDB normaliza las constantes de la instrucción SQL y genera una plantilla. Las instrucciones que coinciden con esta plantilla se rastrean automáticamente.

Parámetros

Parámetro

Descripción

schema

El nombre del esquema.

query

La instrucción SQL que se está ejecutando.

Notas de uso

El comportamiento del procedimiento varía según el nodo donde se ejecute.

Nodo primario: el registro de rastreo se persiste. Los registros relacionados en la tabla mysql.sql_sharing se eliminan y se sincronizan con todos los nodos de solo lectura.

Nodos de solo lectura: el registro de rastreo no se persiste. El procedimiento almacenado solo se puede ejecutar en esos nodos. Cuando acceda a la base de datos mediante un endpoint de clúster, las instrucciones SQL basadas en plantillas se enrutan automáticamente al nodo primario.

Ejemplo

En este ejemplo se rastrea una consulta por rango y luego se consultan ambas tablas del sistema para revisar la plantilla y las estadísticas de ejecución.

Paso 1: Registrar la instrucción SQL para su rastreo

call dbms_sql.add_trace('test', 'select * from t where c1 > 1 and c1 < 10');

Paso 2: Comprobar la plantilla de rastreo en mysql.sql_sharing

Consulte la tabla mysql.sql_sharing para confirmar que la instrucción se registró y se convirtió en plantilla:

select * from mysql.sql_sharing\G

Salida esperada:

*************************** 1. row ***************************
         Id: (id number)
     Sql_id: 82t4dswtqjg02
Schema_name: test
       Type: SQL_TRACE
Digest_text: SELECT * FROM `t` WHERE `c1` > ? AND `c1` < ?
    Plan_id: NULL
       Plan: NULL
    Version: 0
Create_time: 2022-11-07 19:05:27.980605
Update_time: 2022-11-07 19:05:27.980605
 Extra_info: NULL

El campo Digest_text muestra la plantilla normalizada: los valores literales 1 y 10 se reemplazaron por ?. A partir de ahora se rastrea cualquier instrucción que coincida con este patrón, sin importar los valores constantes específicos que utilice.

Paso 3: Ejecutar instrucciones que coincidan con la plantilla

select * from  t where c1 > 1 and c1 < 10;
select * from  t where c1 > 1 and c1 < 100;

Paso 4: Revisar los datos de rastreo y las estadísticas del plan de ejecución

Consulte information_schema.sql_sharing para ver las estadísticas de ejecución y los planes de ejecución utilizados:

select * from information_schema.sql_sharing\G

Salida esperada:

*************************** 1. row ***************************
              TYPE: SQL
            SQL_ID: 82t4dswtqjg02
       SCHEMA_NAME: test
       DIGEST_TEXT: SELECT * FROM `t` WHERE `c1` > ? AND `c1` < ?
           PLAN_ID: NULL
              PLAN: NULL
        PLAN_EXTRA: NULL
        ERROR_CODE: NULL
            REF_BY: SQL_TRACE(DEMAND)
   FIRST_LOAD_TIME: 2022-11-07 19:05:28
     LAST_HIT_TIME: 2022-11-07 19:17:24
        EXECUTIONS: 2
     SUM_WAIT_TIME: 363
     MIN_WAIT_TIME: 179
     MAX_WAIT_TIME: 184
     SUM_EXEC_TIME: 925
     MIN_EXEC_TIME: 438
     MAX_EXEC_TIME: 487
     SUM_ROWS_SENT: 106
     MIN_ROWS_SENT: 8
     MAX_ROWS_SENT: 98
 SUM_ROWS_EXAMINED: 108
 MIN_ROWS_EXAMINED: 8
 MAX_ROWS_EXAMINED: 100
 SUM_ROWS_AFFECTED: 0
 MIN_ROWS_AFFECTED: 0
 MAX_ROWS_AFFECTED: 0
  SUM_LOGICAL_READ: 122
  MIN_LOGICAL_READ: 19
  MAX_LOGICAL_READ: 103
 SUM_PHY_SYNC_READ: 0
 MIN_PHY_SYNC_READ: 0
 MAX_PHY_SYNC_READ: 0
SUM_PHY_ASYNC_READ: 0
MIN_PHY_ASYNC_READ: 0
MAX_PHY_ASYNC_READ: 0
             EXTRA: {TRACE_ROW_ID:10}
*************************** 2. row ***************************
              TYPE: PLAN
            SQL_ID: 82t4dswtqjg02
       SCHEMA_NAME: test
       DIGEST_TEXT: NULL
           PLAN_ID: 5a4cvp4gjqgfj
              PLAN: /*+ NO_INDEX(`t`@`select#1`) */
        PLAN_EXTRA: {`t`@`select#1`:ALL}
        ERROR_CODE: 0
            REF_BY: SQL_TRACE(DEMAND)
   FIRST_LOAD_TIME: 2022-11-07 19:17:24
     LAST_HIT_TIME: 2022-11-07 19:17:24
        EXECUTIONS: 1
     SUM_WAIT_TIME: 184
     MIN_WAIT_TIME: 184
     MAX_WAIT_TIME: 184
     SUM_EXEC_TIME: 487
     MIN_EXEC_TIME: 487
     MAX_EXEC_TIME: 487
     SUM_ROWS_SENT: 98
     MIN_ROWS_SENT: 98
     MAX_ROWS_SENT: 98
 SUM_ROWS_EXAMINED: 100
 MIN_ROWS_EXAMINED: 100
 MAX_ROWS_EXAMINED: 100
 SUM_ROWS_AFFECTED: 0
 MIN_ROWS_AFFECTED: 0
 MAX_ROWS_AFFECTED: 0
  SUM_LOGICAL_READ: 103
  MIN_LOGICAL_READ: 103
  MAX_LOGICAL_READ: 103
 SUM_PHY_SYNC_READ: 0
 MIN_PHY_SYNC_READ: 0
 MAX_PHY_SYNC_READ: 0
SUM_PHY_ASYNC_READ: 0
MIN_PHY_ASYNC_READ: 0
MAX_PHY_ASYNC_READ: 0
             EXTRA: NULL
*************************** 3. row ***************************
              TYPE: PLAN
            SQL_ID: 82t4dswtqjg02
       SCHEMA_NAME: test
       DIGEST_TEXT: NULL
           PLAN_ID: 463zszw4mbv3w
              PLAN: /*+ INDEX(`t`@`select#1` `i_c1`) */
        PLAN_EXTRA: {`t`@`select#1`:range}
        ERROR_CODE: 0
            REF_BY: SQL_TRACE(DEMAND)
   FIRST_LOAD_TIME: 2022-11-07 19:17:21
     LAST_HIT_TIME: 2022-11-07 19:17:21
        EXECUTIONS: 1
     SUM_WAIT_TIME: 179
     MIN_WAIT_TIME: 179
     MAX_WAIT_TIME: 179
     SUM_EXEC_TIME: 438
     MIN_EXEC_TIME: 438
     MAX_EXEC_TIME: 438
     SUM_ROWS_SENT: 8
     MIN_ROWS_SENT: 8
     MAX_ROWS_SENT: 8
 SUM_ROWS_EXAMINED: 8
 MIN_ROWS_EXAMINED: 8
 MAX_ROWS_EXAMINED: 8
 SUM_ROWS_AFFECTED: 0
 MIN_ROWS_AFFECTED: 0
 MAX_ROWS_AFFECTED: 0
  SUM_LOGICAL_READ: 19
  MIN_LOGICAL_READ: 19
  MAX_LOGICAL_READ: 19
 SUM_PHY_SYNC_READ: 0
 MIN_PHY_SYNC_READ: 0
 MAX_PHY_SYNC_READ: 0
SUM_PHY_ASYNC_READ: 0
MIN_PHY_ASYNC_READ: 0
MAX_PHY_ASYNC_READ: 0
             EXTRA: NULL

La salida contiene una fila SQL y dos filas PLAN, todas con el mismo SQL_ID. Esto indica que las dos ejecuciones rastreadas usaron planes de ejecución distintos:

  • Fila 2 (PLAN): un escaneo completo de tabla (ALL), identificado por la sugerencia de plan NO_INDEX. Este plan examinó 100 filas y tardó 487 microsegundos.

  • Fila 3 (PLAN): un escaneo por rango de índice con el índice i_c1 (range). Este plan examinó solo 8 filas y tardó 438 microsegundos.

Las instrucciones SQL que coinciden con la plantilla corresponden a los siguientes planes de ejecución: i_c1 escaneos por rango del índice y escaneos completos de tabla.