Dalam beberapa skenario, pengoptimal tidak dapat secara akurat memperkirakan jumlah baris yang akan dipindai dalam tabel, laju pemilihan predikat, dan biaya dari suatu rencana eksekusi. Untuk menyelesaikan masalah ini, PolarDB for MySQL menyediakan fitur pengalihan rencana eksekusi adaptif untuk secara otomatis menyesuaikan rencana eksekusi berdasarkan informasi aktual. Topik ini menjelaskan fitur pengalihan rencana eksekusi adaptif.
Informasi latar belakang
Pengoptimal memperkirakan kardinalitas dan laju pemilihan berdasarkan statistik dan sebagian data sampel. Hasil perkiraan mungkin menyimpang dari informasi aktual karena presisi pengambilan sampel dan metode pengambilan sampel. Statistik juga tidak dikumpulkan dalam berbagai skenario. Dalam kasus ini, pengoptimal memperkirakan statistik berdasarkan nilai empiris atau asumsi matematis, yang dapat menyebabkan penyimpangan besar antara nilai perkiraan dan nilai aktual. Dalam skenario di mana hasil perkiraan pengoptimal tidak sesuai dengan nilai aktual dan rencana eksekusi yang tidak tepat dipilih, pengoptimal tidak dapat dengan mudah mengumpulkan informasi yang diperlukan sebelumnya.
Pengalihan rencana eksekusi adaptif
Pengalihan rencana eksekusi adaptif mendukung dua mode: perutean adaptif baris-kolom dan pemilihan adaptif indeks terurut.
Perutean adaptif baris-kolom
Saat menggunakan fitur Indeks Kolom IMCI dengan perutean otomatis baris-kolom diaktifkan, beberapa kueri lambat mungkin dirutekan ke node penyimpanan baris ketika biaya eksekusi perkiraan kueri lambat pada node penyimpanan baris relatif rendah.
Untuk menyelesaikan masalah tersebut, Anda dapat menggunakan salah satu solusi berikut:
Kurangi threshold biaya untuk kueri yang dirutekan ke node penyimpanan kolom. Namun, jika Anda menggunakan solusi ini, sejumlah besar kueri pendek dirutekan ke node penyimpanan kolom. Akibatnya, beban pada node penyimpanan kolom menjadi tinggi dan kueri lainnya terblokir.
Gunakan fitur outline pernyataan untuk merutekan kueri dengan template tetap ke node penyimpanan kolom. Sebagai contoh, Anda dapat menambahkan outline yang dijelaskan dalam pernyataan contoh berikut untuk secara paksa merutekan kueri ke node penyimpanan kolom. Namun, solusi ini menyebabkan peningkatan signifikan dalam biaya O&M.
CALL dbms_outln.add_optimizer_outline("<Schema_name>", "/*+ SET_VAR(cost_threshold_for_imci=0) SET_VAR(imci_ap_threshold=0) */","<query>");
Fitur pengalihan rencana eksekusi adaptif di PolarDB for MySQL dapat diterapkan pada perutean adaptif baris-kolom untuk secara otomatis beralih kueri lambat yang salah dirutekan ke node penyimpanan baris ke node penyimpanan kolom dan meningkatkan efisiensi eksekusi. Seperti yang ditunjukkan pada gambar berikut, ketika fitur pengalihan rencana eksekusi adaptif digunakan, database menandai jumlah baris yang akan dipindai di setiap blok kueri dan di seluruh kueri dalam fase optimasi dan menambahkannya ke informasi pemantauan. Jika IMCI tidak dipilih setelah perhitungan biaya, pengoptimal menghitung threshold untuk memicu fitur pengalihan rencana eksekusi adaptif. Di versi baru (seperti 8.0.1.1.49 dan yang lebih baru atau 8.0.2.2.29 dan yang lebih baru), threshold ini dihitung berdasarkan parameter loose_adaptive_cost_threshold_for_imci. Di versi kluster yang lebih lama, threshold ini dihitung berdasarkan parameter loose_cost_threshold_for_imci. Pada fase eksekusi, ketika jumlah baris yang dipindai dalam blok kueri atau di seluruh kueri mencapai threshold untuk memicu fitur pengalihan rencana eksekusi adaptif, sistem memeriksa apakah akan beralih ke eksekusi penyimpanan kolom. Memantau baris yang dipindai di jalur inti hanya membandingkan bilangan bulat dan tidak memengaruhi kinerja eksekusi. Sebelum beralih ke eksekusi penyimpanan kolom, pengoptimal memastikan bahwa set hasil eksekusi penyimpanan baris tidak dikembalikan ke klien. Setelah beralih ke eksekusi penyimpanan kolom, sistem membersihkan set hasil yang disimpan dalam cache.
Pemilihan adaptif indeks terurut
Dalam optimasi kueri basis data, optimasi prefer_ordering_index menginstruksikan pengoptimal untuk memprioritaskan indeks yang mendukung operasi pengurutan. Namun, dalam beberapa kasus, optimasi ini dapat menurunkan kinerja kueri. Terutama ketika indeks terurut dan selektivitas kueri tidak cocok, memilih indeks terurut dengan selektivitas rendah atau memerlukan pemindaian data dalam jumlah besar dan pencarian tabel dapat menyebabkan kueri memindai data yang tidak relevan secara substansial dan oleh karena itu meningkatkan beban kerja I/O dan CPU.
Solusi berikut dapat mengatasi kueri lambat yang disebabkan oleh optimasi prefer_ordering_index:
Anda dapat menggunakan fitur outline pernyataan untuk menonaktifkan optimasi prefer_ordering_index untuk template SQL tertentu. Namun, solusi ini secara signifikan meningkatkan biaya O&M. Selain itu, hal ini memengaruhi beberapa kueri yang menggunakan template SQL dan berkinerja lebih baik dengan optimasi prefer_ordering_index diaktifkan.
CALL dbms_outln.add_optimizer_outline("<Schema_name>", "/*+ SET_VAR(optimizer_switch='prefer_ordering_index=off') */","<query>");Fitur pengalihan rencana eksekusi adaptif dapat diterapkan pada pemilihan adaptif indeks terurut. Jika kinerja kueri menurun akibat optimasi prefer_ordering_index, rencana eksekusi akan meninggalkan indeks terurut. Jika kueri memilih indeks terurut karena optimasi prefer_ordering_index, pengoptimal menghitung threshold untuk memicu fitur pengalihan rencana eksekusi adaptif. Pada fase eksekusi, ketika jumlah baris yang dieksekusi pada indeks terurut mencapai threshold untuk memicu fitur pengalihan rencana eksekusi adaptif, sistem memeriksa apakah akan beralih ke eksekusi penyimpanan kolom. Memantau baris yang dipindai di jalur inti hanya membandingkan bilangan bulat dan tidak memengaruhi kinerja eksekusi. Sebelum beralih ke eksekusi penyimpanan kolom, pengoptimal memastikan bahwa set hasil eksekusi penyimpanan baris tidak dikembalikan ke klien. Setelah beralih ke eksekusi penyimpanan kolom, sistem membersihkan set hasil yang disimpan dalam cache.
Prasyarat
Untuk mengaktifkan perutean adaptif baris-kolom (sesuai dengan nilai imci_chosen=on), kluster Anda harus memenuhi persyaratan berikut:
PolarDB for MySQL 8.0.1 dengan versi revisi 8.0.1.1.39 atau yang lebih baru.
PolarDB for MySQL 8.0.2 dengan versi revisi 8.0.2.2.29 atau yang lebih baru.
Untuk mengaktifkan pemilihan adaptif indeks terurut (sesuai dengan nilai ordering_index=on), kluster Anda harus memenuhi persyaratan berikut:
PolarDB for MySQL 8.0.1 dengan versi revisi 8.0.1.1.47 atau yang lebih baru.
PolarDB for MySQL 8.0.2 dengan versi revisi 8.0.2.2.29 atau yang lebih baru.
Catatan penggunaan
Aktifkan atau nonaktifkan fitur pengalihan rencana eksekusi adaptif
Masuk ke Konsol PolarDB. Konfigurasikan fitur pengalihan rencana eksekusi adaptif di halaman Parameters:
Atur parameter
loose_adaptive_plans_switchke'imci_chosen=on'untuk mengaktifkan perutean adaptif baris-kolom.Atur parameter
loose_adaptive_plans_switchke'ordering_index=on'untuk mengaktifkan pemilihan adaptif indeks terurut yang dipilih oleh optimasiprefer_ordering_index.Atur parameter
loose_adaptive_plans_switchke'imci_chosen=on,ordering_index=on'untuk mengaktifkan kedua mode, atau atur salah satunya ke'off'untuk menonaktifkan mode yang sesuai.
Untuk informasi lebih lanjut, lihat Konfigurasi Parameter Kluster dan Node. Tabel berikut menjelaskan parameter yang dapat Anda konfigurasikan.
Parameter | Tingkat | Deskripsi |
loose_adaptive_plans_switch | Global/Sesi | Menentukan apakah akan mengaktifkan fitur pengalihan rencana eksekusi adaptif. Nilai valid:
|
loose_adaptive_cost_threshold_for_imci | Global/Sesi | Threshold biaya untuk perutean adaptif baris-kolom. Nilai valid: 1-18446744073709551615. Nilai default: 50000. Catatan Parameter ini hanya tersedia untuk versi mesin database berikut:
|
loose_adaptive_plans_max_time | Global/Sesi | Waktu eksekusi maksimum dari pernyataan SQL yang dapat dirutekan menggunakan fitur pengalihan rencana eksekusi adaptif. Jika waktu eksekusi pernyataan SQL melebihi periode yang ditentukan, rencana eksekusi pernyataan tersebut tidak beralih meskipun threshold untuk pengalihan rencana eksekusi tercapai. Nilai valid: 0~1800000. Nilai default: 500. Unit: milidetik. |
loose_adaptive_ordering_rows_threshold | Global/Sesi | Checkpoint untuk pemilihan adaptif indeks terurut. Nilai kecil berarti sistem memeriksa jumlah baris yang dipindai dan memicu pengalihan rencana eksekusi adaptif dalam interval pendek. Nilai valid: 0~4294967295. Nilai default: 50000. |
Lihat jumlah tindakan pengalihan adaptif
Anda dapat mengeksekusi pernyataan berikut untuk melihat jumlah tindakan pengalihan adaptif:
SHOW GLOBAL STATUS LIKE 'Adaptive_plan_used';Tabel berikut menjelaskan variabel Adaptive_plan_used.
Nama variabel | Tingkat | Deskripsi |
Adaptive_plan_used | Global | Jumlah tindakan pengalihan adaptif yang telah dilakukan sejak fitur pengalihan rencana eksekusi adaptif diaktifkan. |