PolarDB memungkinkan Anda menurunkan kondisi dari klausa HAVING dalam kueri SQL ke klausa WHERE. Untuk meningkatkan performa kueri, transformasikan kueri SQL yang kompleks dengan menurunkan kondisi yang sesuai untuk penyaringan lebih awal dari HAVING ke WHERE.
Versi yang didukung
Kluster Anda menjalankan salah satu versi mesin database berikut. Untuk informasi lebih lanjut tentang cara melihat versi kluster, lihat Kueri versi mesin.
MySQL 8.0.1 dengan versi revisi 8.0.1.1.42 atau lebih baru.
MySQL 8.0.2 dengan versi revisi 8.0.2.2.10 atau lebih baru.
Batasan
Jika suatu kondisi (atau sebagian dari kondisi) hanya bergantung pada bidang yang digunakan dalam klausa
GROUP BY, atau bidang yang identik dengan bidang yang dikelompokkan, kondisi tersebut dapat diturunkan dari klausaHAVINGke klausaWHERE.Fungsi agregat tidak dapat diturunkan.
Latar Belakang
Klausa HAVING digunakan dalam banyak kueri kompleks untuk menyaring hasil pengelompokan. Umumnya, kondisi pada klausa HAVING diterapkan ke data terkelompok yang dihasilkan oleh operasi GROUP BY. Kondisi dalam klausa HAVING yang sesuai untuk penyaringan lebih awal dapat dipindahkan ke klausa WHERE. Hal ini mengurangi jumlah data yang diproses pada tahap akhir kueri, sehingga meningkatkan performa dan efisiensi secara signifikan.
Penggunaan
Gunakan parameter loose_polar_optimizer_switch untuk mengaktifkan penurunan kondisi dari klausa HAVING ke klausa WHERE. Parameter loose_having_cond_pushdown_mode dapat digunakan untuk menentukan node tempat fitur ini diaktifkan. Untuk informasi lebih lanjut tentang konfigurasi parameter, lihat Konfigurasikan parameter kluster dan node.
Parameters
Parameter | Level | Deskripsi |
loose_polar_optimizer_switch | Global dan sesi | Menentukan apakah akan mengaktifkan penurunan kondisi dari klausa HAVING ke klausa WHERE. Nilai valid:
|
loose_having_cond_pushdown_mode | Global | Menentukan jenis node tempat Anda ingin mengaktifkan penurunan kondisi dari klausa HAVING ke klausa WHERE. Nilai valid:
|
Contoh
Menurunkan kondisi dari klausa HAVING ke klausa WHERE.
Contoh 1:
SELECT t1.a,MAX(t1.b)
FROM t1
GROUP BY t1.a
HAVING (t1.a>2) AND (MAX(c)>12);Sintaks kueri setelah transformasi:
SELECT t1.a,MAX(t1.b)
FROM t1
WHERE (t1.a>2)
GROUP BY t1.a
HAVING (MAX(c)>12);Contoh 2:
SELECT t1.a,MAX(t1.b),t1.c
FROM t1
GROUP BY t1.a
HAVING ((t1.a=t1.c) AND (t1.a>1)) OR ((t1.a<3) AND (t1.c>3));Sintaks kueri setelah transformasi:
SELECT t1.a,MAX(t1.b),t1.c
FROM t1
WHERE ((t1.a=t1.c) AND (t1.a>1)) OR (t1.a<3)
GROUP BY t1.a
HAVING ((t1.a=t1.c) AND (t1.a>1)) OR ((t1.a<3) AND (t1.c>3));