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 |
|
|
El nombre del esquema. |
|
|
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 planNO_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.