O procedimento armazenado dbms_sql.add_trace registra instruções SQL específicas para rastreamento sob demanda pelo recurso SQL Trace.
Pré-requisitos
Defina o parâmetro loose_sql_trace_type como DEMAND antes de chamar este procedimento.
Sintaxe
dbms_sql.add_trace('<schema>', '<query>')
Após a execução do procedimento, o PolarDB normaliza as constantes da instrução SQL em um modelo. As instruções correspondentes a esse modelo são rastreadas automaticamente.
Parâmetros
|
Parâmetro |
Descrição |
|
|
Nome do schema. |
|
|
Instrução SQL em execução. |
Observações de uso
O comportamento do procedimento varia conforme o nó de execução.
Nó primário: O registro de rastreamento é persistente. Os registros relacionados na tabela mysql.sql_sharing são excluídos e sincronizados com todos os nós somente leitura.
Nós somente leitura: O registro de rastreamento não é persistente. A execução do procedimento armazenado ocorre apenas nesses nós. Ao acessar o banco de dados por um endpoint de cluster, o sistema roteia automaticamente as instruções SQL modeladas para o nó primário.
Exemplo
Este exemplo rastreia uma consulta de intervalo e consulta ambas as tabelas do sistema para inspecionar o modelo e as estatísticas de execução.
Etapa 1: Registrar a instrução SQL para rastreamento
call dbms_sql.add_trace('test', 'select * from t where c1 > 1 and c1 < 10');
Etapa 2: Verifique o modelo de rastreamento em mysql.sql_sharing
Consulte a tabela mysql.sql_sharing para confirme se a instrução foi registrada e modelada:
select * from mysql.sql_sharing\G
Saída 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
O campo Digest_text exibe o modelo normalizado: os valores literais 1 e 10 foram substituídos por ?. Qualquer instrução correspondente a esse padrão passa a ser rastreada, independentemente dos valores constantes específicos utilizados.
Etapa 3: Execute instruções correspondentes ao modelo
select * from t where c1 > 1 and c1 < 10;
select * from t where c1 > 1 and c1 < 100;
Etapa 4: Inspecionar dados de rastreamento e estatísticas do plano de execução
Consulte information_schema.sql_sharing para visualizar as estatísticas e os planos de execução utilizados:
select * from information_schema.sql_sharing\G
Saída 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
A saída contém uma linha SQL e duas linhas PLAN, todas com o mesmo SQL_ID. Isso indica que as duas execuções rastreadas utilizaram planos de execução diferentes:
Linha 2 (PLAN): Varredura completa da tabela (
ALL), identificada pela dica de planoNO_INDEX. Este plano examinou 100 linhas e levou 487 microssegundos.Linha 3 (PLAN): Varredura de intervalo de índice usando o índice
i_c1(range). Este plano examinou apenas 8 linhas e levou 438 microssegundos.
As instruções SQL correspondentes ao modelo associam-se aos seguintes planos de execução: varreduras de intervalo de índice i_c1 e varreduras completas de tabela.