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
| Parameter | Deskripsi |
|---|---|
schema | Nama skema. |
query | Pernyataan 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\GOutput 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: NULLBidang 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\GOutput 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: NULLOutput 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 rencanaNO_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.