All Products
Search
Document Center

PolarDB:dbms_sql.add_trace

Last Updated:Mar 29, 2026

dbms_sql.add_trace adalah prosedur tersimpan yang mendaftarkan pernyataan SQL tertentu untuk pelacakan berdasarkan permintaan oleh fitur SQL Trace.

Prasyarat

Atur parameter loose_sql_trace_type ke DEMAND sebelum memanggil prosedur ini.

Sintaksis

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

Setelah prosedur dijalankan, PolarDB menormalisasi konstanta dalam pernyataan SQL menjadi templat. Pernyataan yang sesuai dengan templat ini akan dilacak secara otomatis.

Parameter

ParameterDeskripsi
schemaNama skema.
queryPernyataan SQL yang sedang dieksekusi.

Catatan penggunaan

Prosedur ini berperilaku berbeda tergantung pada node tempatnya dijalankan.

Primary node: Pendaftaran jejak dipertahankan. Catatan terkait dalam tabel mysql.sql_sharing dihapus dan disinkronkan ke semua node read-only.

Read-only nodes: Pendaftaran jejak tidak dipertahankan. Prosedur tersimpan hanya dapat dieksekusi pada node tersebut. Saat Anda mengakses database melalui cluster endpoint, pernyataan SQL bertemplat akan secara otomatis diarahkan ke primary node.

Contoh

Contoh ini melacak kueri rentang, lalu melakukan kueri terhadap kedua tabel sistem untuk memeriksa templat dan statistik eksekusi.

Langkah 1: Daftarkan pernyataan SQL untuk pelacakan

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

Langkah 2: Verifikasi templat jejak di mysql.sql_sharing

Lakukan kueri terhadap tabel mysql.sql_sharing untuk memastikan bahwa pernyataan telah didaftarkan dan dibuat templatnya:

select * from mysql.sql_sharing\G

Output yang diharapkan:

*************************** 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

Bidang Digest_text menampilkan templat yang dinormalisasi: nilai literal 1 dan 10 diganti dengan ?. Setiap pernyataan yang sesuai dengan pola ini kini dilacak, terlepas dari nilai konstanta spesifik yang digunakan.

Langkah 3: Jalankan pernyataan yang sesuai dengan templat

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

Langkah 4: Periksa data jejak dan statistik rencana eksekusi

Lakukan kueri terhadap information_schema.sql_sharing untuk melihat statistik eksekusi dan rencana eksekusi yang digunakan:

select * from information_schema.sql_sharing\G

Output yang diharapkan:

*************************** 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

Output berisi satu baris SQL dan dua baris PLAN, semuanya memiliki SQL_ID yang sama. Hal ini berarti dua eksekusi yang dilacak menggunakan rencana eksekusi yang berbeda:

  • Baris 2 (PLAN): Pemindaian tabel penuh (ALL), diidentifikasi oleh petunjuk rencana NO_INDEX. Rencana ini memeriksa 100 baris dan membutuhkan waktu 487 mikrodetik.

  • Baris 3 (PLAN): Pemindaian rentang indeks menggunakan indeks i_c1 (range). Rencana ini hanya memeriksa 8 baris dan membutuhkan waktu 438 mikrodetik.

Pernyataan SQL yang sesuai dengan templat tersebut berkorespondensi dengan rencana eksekusi berikut: pemindaian rentang indeks i_c1 dan pemindaian tabel penuh.