Persist plan dan query blocker memberi Anda kendali langsung atas cara AnalyticDB for MySQL mengeksekusi pernyataan SQL berparameter. Gunakan persist plan untuk mengunci petunjuk pengoptimal (optimizer hints) tertentu pada pola pernyataan, dan gunakan query blocker untuk mencegat serta memblokir pernyataan yang sesuai dengan pola tersebut—berfungsi sebagai firewall SQL. Kedua fitur ini memerlukan versi V3.1.4 atau lebih baru.
Cara kerja
AnalyticDB for MySQL mengidentifikasi pernyataan yang memiliki struktur sama melalui parameterisasi: mengganti konstanta dalam klausa seperti WHERE dan LIMIT dengan tanda tanya (?). Setiap struktur unik, yang disebut pattern, diberi sign value—pengenal hash untuk pola tersebut.
Persist plan menyambungkan petunjuk pengoptimal ke suatu pola. Setiap pernyataan yang sesuai dengan pola tersebut dijalankan dengan petunjuk tersebut diterapkan, tanpa mengubah SQL aslinya.
Query blocker bekerja dengan cara yang sama, tetapi alih-alih mengoptimalkan eksekusi, ia menolak semua pernyataan yang sesuai dengan pola tersebut.
Ketika fitur optimasi lanjutan diaktifkan pada suatu kluster, berbagai pernyataan dapat terpengaruh. Anda dapat menggunakan persist plan untuk mengontrol petunjuk mana yang diterapkan pada pernyataan dengan pola yang sama.
MenjalankanPERSIST_PLANatau/*+query_blocker=true*/ PERSIST_PLANtidak mengeksekusi pernyataan SQL target. Perintah tersebut hanya menyimpan konfigurasi petunjuk.
Kapan menggunakan masing-masing fitur
| Situasi | Fitur |
|---|---|
| Pengoptimal memilih rencana eksekusi yang suboptimal untuk sekelompok kueri serupa | Persist plan |
| Sekelompok kueri serupa menyebabkan masalah performa dan perlu segera dihentikan | Query blocker |
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Kluster AnalyticDB for MySQL yang berjalan pada versi V3.1.4 atau lebih baru
Akses ke client MySQL (diperlukan untuk
PERSIST_PLAN_CHECK—Data Management (DMS) tidak mengembalikan hasil untuk perintah ini)
Referensi sintaksis
| Operasi | Sintaksis |
|---|---|
| Menghasilkan pola dan sign value untuk suatu pernyataan | PARAMETERIZE $sql |
| Menyambungkan petunjuk ke suatu pola | /*+hints*/ PERSIST_PLAN $sql |
| Memblokir semua pernyataan yang sesuai dengan suatu pola | /*+query_blocker=true*/ PERSIST_PLAN $sql |
| Memeriksa apakah petunjuk telah dikonfigurasi untuk suatu pernyataan | PERSIST_PLAN_CHECK $sql |
| Menampilkan semua pola yang memiliki petunjuk | SELECT * FROM INFORMATION_SCHEMA.KEPLER_PERSIST_PLAN_SUMMARY |
| Menghapus petunjuk berdasarkan pernyataan SQL | DELETE_PLAN $sql |
| Menghapus petunjuk berdasarkan sign value | DELETE_PLAN_BY_SIGN $Sign |
Contoh rencana persisten
Menghasilkan pola dan sign value
Jalankan PARAMETERIZE pada suatu pernyataan untuk melihat bagaimana AnalyticDB for MySQL melakukan normalisasi dan sign value yang dihasilkan:
PARAMETERIZE
SELECT t1.c1
FROM t1
INNER JOIN t2 ON t1.c1 = t2.c1
WHERE t1.c2 < 9999;Hasil:
| Sign | Pattern |
|---|---|
| 2506ed2c1f53ea59a1ef996a98a50411 | SELECT t1.c1 FROM t1 INNER JOIN t2 ON t1.c1 = t2.c1 WHERE t1.c2 < ? |
Sign value secara unik mengidentifikasi pola ini. Gunakan nilai tersebut untuk menghapus persist plan tanpa harus menentukan ulang SQL lengkapnya.
Menyambungkan petunjuk ke suatu pola
Untuk menerapkan algoritma nested_loop_join pada semua pernyataan yang sesuai dengan pola tersebut:
/*+nested_loop_join=true*/
PERSIST_PLAN
SELECT t1.c1
FROM t1
INNER JOIN t2 ON t1.c1 = t2.c1
WHERE t1.c2 < 9999;Pernyataan blok yang cocok dengan pola
Untuk mencegat semua pernyataan yang sesuai dengan suatu pola:
/*+query_blocker=true*/
PERSIST_PLAN
SELECT t1.c1
FROM t1
INNER JOIN t2 ON t1.c1 = t2.c1
WHERE t1.c2 < 9999;Hapus rencana persisten
Tersedia dua metode.
Berdasarkan pernyataan SQL:
DELETE_PLAN
SELECT t1.c1
FROM t1
INNER JOIN t2 ON t1.c1 = t2.c1
WHERE t1.c2 < 9999;Berdasarkan sign value:
DELETE_PLAN_BY_SIGN 2506ed2c1f53ea59a1ef996a98a50411;Untuk mendapatkan sign value suatu pola, jalankan PARAMETERIZE $sql atau kueri INFORMATION_SCHEMA.KEPLER_PERSIST_PLAN_SUMMARY.
Verifikasi dan pantau persist plan
Periksa petunjuk pada pernyataan tertentu
Jalankan PERSIST_PLAN_CHECK untuk memastikan persist plan telah dikonfigurasi dan melihat berapa kali petunjuk tersebut telah diterapkan:
PERSIST_PLAN_CHECK
SELECT t1.c1
FROM t1
INNER JOIN t2 ON t1.c1 = t2.c1
WHERE t1.c2 < 9999;Hasil:
| Sign | Hint | hitApplied | Pattern |
|---|---|---|---|
| 2506ed2c1f53ea59a1ef996a98a50411 | nested_loop_join=true | 12 | SELECT t1.c1 FROM t1 INNER JOIN t2 ON t1.c1 = t2.c1 WHERE t1.c2 < ? |
Deskripsi kolom:
| Bidang | Deskripsi |
|---|---|
Sign | Pengenal hash untuk pola tersebut |
Hint | Petunjuk yang saat ini dikonfigurasi untuk pola tersebut |
hitApplied | Jumlah kali pola tersebut cocok sejak persist plan dibuat atau terakhir diperbarui. Nilai ini diatur ulang menjadi 0 setelah setiap pembaruan. |
Pattern | Bentuk parameterisasi dari pernyataan, dengan konstanta diganti oleh ? |
PERSIST_PLAN_CHECK tidak mengembalikan hasil saat dijalankan di Data Management (DMS). Jalankan dari client MySQL untuk melihat output-nya.
Daftar semua pola yang dikonfigurasi
SELECT * FROM INFORMATION_SCHEMA.KEPLER_PERSIST_PLAN_SUMMARY;Kueri ini mengembalikan semua pola yang saat ini memiliki persist plan dikonfigurasi, beserta petunjuk dan sign value-nya.