PolarDB mendukung pembangkitan predikat transitif. Fitur ini memungkinkan analisis mendalam terhadap kondisi predikat dalam kueri SQL untuk menghasilkan ekstraksi dan derivasi predikat baru. Proses ini mencakup hubungan kesetaraan dan non-kesetaraan, sehingga PolarDB dapat menghasilkan kondisi predikat yang lebih tepat. Hal ini meningkatkan kemampuan pengoptimal kueri dalam membuat keputusan penting seperti pemilihan indeks dan urutan penggabungan. Dengan menurunkan predikat baru, pengoptimal dapat menjelajahi berbagai rencana eksekusi yang lebih luas, sehingga mengoptimalkan kinerja kueri.
Prasyarat
Fitur ini didukung di kluster yang menggunakan mesin basis data MySQL 8.0.2 dengan versi revisi 8.0.2.2.23 atau lebih baru. Untuk informasi lebih lanjut tentang cara memeriksa versi mesin basis data, lihat Memeriksa versi mesin.
Skenario
Penurunan predikat ditingkatkan oleh pembangkitan predikat transitif di PolarDB. Ini mencakup implementasi berikut:
HAVINGditurunkan keWHEREpenurunan kondisi: Mengubah kondisiHAVINGyang cocok untuk pra-agregasi menjadi kondisiWHERE, mengurangi volume data untuk agregasi. Untuk detail lebih lanjut, lihat penurunan kondisi (HAVING ke WHERE).WHEREpenurunan kondisi ke tabel turunan: KondisiWHEREdari kueri luar diturunkan ke tabel turunan untuk penyaringan data lebih awal. Untuk detail lebih lanjut, lihat penurunan kondisi (penurunan kondisi WHERE ke tabel turunan).WHEREklausul diturunkan keINsubquery: KondisiWHEREdari kueri luar diturunkan ke subqueryINuntuk meningkatkan efisiensi eksekusi subquery. Untuk detail lebih lanjut, lihat penurunan kondisi (penurunan klausul WHERE ke subquery IN).Penurunan kondisi penggabungan ke tabel turunan yang dimaterialisasi: Kondisi penggabungan diterapkan langsung ke tabel turunan yang dimaterialisasi, meminimalkan pemindaian data yang tidak perlu. Untuk detail lebih lanjut, lihat penurunan kondisi (penurunan kondisi penggabungan ke tabel turunan yang dimaterialisasi).
Tujuan utama pembangkitan predikat transitif adalah menghasilkan sebanyak mungkin kondisi tabel tunggal, bukan menurunkan hubungan antar variabel melalui permutasi dan kombinasi. Pendekatan ini memungkinkan sistem mengidentifikasi dan menciptakan kondisi filter baru yang valid untuk digunakan dalam tahap optimasi selanjutnya, menyempurnakan dataset, serta meningkatkan kinerja dan efisiensi kueri. Proses ini memperkuat kemampuan penurunan predikat PolarDB dan membekali pengoptimal kueri untuk menangani kueri kompleks secara lebih cerdas, akhirnya meningkatkan kinerja sistem.
Pembangkitan predikat transitif dapat diterapkan dalam skenario berikut:
Pembangkitan predikat transitif sederhana untuk hubungan non-kesetaraan dan kesetaraan. Contoh:
-- SQL Asli SELECT * FROM t1, v1 WHERE v1.a > t1.a AND t1.a > 1 -- SQL Terderivasi SELECT * FROM t1, v1 WHERE v1.a > t1.a AND t1.a > 1 AND v1.a > 1 -- SQL Asli SELECT * FROM t1, v1 WHERE v1.b < t1.c AND t1.c < t2.c AND t2.c = 1; -- SQL Terderivasi SELECT * FROM t1, v1 WHERE v1.b < t1.c AND t1.c < t2.c AND t2.c = 1 AND v1.b < 1 AND t1.c < 1;Ekspresi yang mematuhi hukum komutatif juga memenuhi syarat untuk pembangkitan predikat transitif. Contoh:
-- SQL Asli SELECT * FROM t1, v2 WHERE v2.c1 < t1.c2 + t1.c1 AND t1.c1 + t1.c2 < 2; -- SQL Terderivasi SELECT * FROM t1, v2 WHERE v2.c1 < t1.c2 + t1.c1 AND t1.c1 + t1.c2 < 2 AND v2.c1 < 2;Pembangkitan predikat transitif kompleks berdasarkan hubungan kesetaraan. Contoh:
-- SQL Asli SELECT * FROM t3, v3 WHERE v3.c2 = t3.c2 AND t3.c2 LIKE "%00%"; -- SQL Terderivasi SELECT * FROM t3, v3 WHERE v3.c2 = t3.c2 AND t3.c2 LIKE "%00%" AND v3.c2 LIKE "%00%"; -- SQL Asli SELECT * FROM t1, v2 WHERE v2.c1 = t1.c2 AND t1.c2 IN (1,5,7); -- SQL Terderivasi SELECT * FROM t1, v2 WHERE v2.c1 = t1.c2 AND t1.c2 IN (1,5,7) AND v2.c1 IN (1,5,7);Derivasi MIN/MAX dalam klausa HAVING. Contoh:
-- SQL Asli SELECT * FROM t1 GROUP BY a,b,c HAVING MAX(b) > 20; -- SQL Terderivasi SELECT * FROM t1 WHERE b > 20 GROUP BY a,b,c; -- SQL Asli SELECT * FROM t1 GROUP BY a,b,c HAVING MIN(b) < 20; -- SQL Terderivasi SELECT * FROM t1 WHERE b < 20 GROUP BY a,b,c;
Batasan
Pembangkitan predikat transitif harus seragam ketika jenis kondisi perbandingan yang sama ada. Contoh:
CREATE TABLE t1(c1 INT, c2 INT); CREATE TABLE t2(c1 INT, c2 VARCHAR(64)); CREATE view v2 AS SELECT * FROM t2; SELECT * FROM v2,t1 WHERE v2.c1 > t1.c2 AND t1.c2 > v2.c2;CatatanDalam contoh SQL,
v2.c2bertipeVARCHAR. Meskipun tampaknya mungkin untuk mentransmisikan hubungan non-kesetaraan melalui variabel perantarat1.c2, karenav2.c1bertipeINTdanv2.c2bertipeVARCHAR,t1.c2sebagai tipeINTdibandingkan denganv2.c1danv2.c2menggunakan metode nilai yang berbeda. Oleh karena itu, derivasi paksa tidak sesuai dengan semantik SQL asli.Derivasi fungsi
MIN/MAXdibatasi pada kueri dengan satu fungsi agregatMIN/MAX. Jika fungsi agregat serupa lainnya hadir, kondisi predikat terderivasi dalam klausaWHEREdapat mengubah hasil fungsi-fungsi tersebut, menyebabkan ketidaksesuaian antara SQL terderivasi dan asli. Contoh:SELECT a, MIN(b), AVG(c) FROM t1 GROUP BY a HAVING MIN(b) < 20;CatatanDalam contoh SQL, dua fungsi agregat digunakan:
AVG(c)danMIN(b). Menerapkan aturan untuk menyertakanb < 20dalam klausaWHEREakan menyaring baris yang tidak memenuhib < 20selama pemindaian tabelt1. Penyaringan ini tidak memengaruhi perhitunganAVG(c). Namun, untuk kelompok tertentu, ini dapat memengaruhi nilai hasilAVG(c), menyebabkan ketidaksesuaian dengan semantik kueri asli. Akibatnya, skenario yang memengaruhi hasil fungsi agregat lainnya tidak mendukung derivasiMIN/MAX.
Penggunaan
Persiapan
Untuk memanfaatkan pembangkitan predikat transitif, konfigurasikan parameter loose_predicate_deduce_mode untuk mengaktifkan derivasi predikat. Untuk langkah-langkah konfigurasi, lihat Konfigurasi parameter kluster dan node.
Nama Parameter | Tingkat | Deskripsi |
loose_predicate_deduce_mode | Global | Saklar kontrol untuk fitur pembangkitan predikat transitif. Nilai valid:
|
Derivasi MIN/MAX tidak memerlukan parameter terpisah. Mengaktifkan fitur penurunan kondisi untuk klausa HAVING ke klausa WHERE juga mengaktifkan derivasi MIN/MAX. Untuk informasi lebih lanjut, lihat penurunan kondisi (HAVING ke WHERE).
Contoh 1
-- Buat tabel contoh
CREATE VIEW v1
AS
SELECT c1, c2, MAX(c3) AS max_c3
, AVG(c4) AS avg_c4
FROM t2
GROUP BY c1, c2
HAVING max_c3 > 10;
EXPLAIN FORMAT = TREE SELECT * FROM v1, t1 WHERE v1.c1 >= t1.c2 AND t1.c2 = v1.c2;
EXPLAIN
-> Inner hash join (t1.c2 = v1.c2)
-> Table scan on t1 (cost=0.18 rows=10)
-> Hash
-> Table scan on v1
-> Materialize
-> Filter: (max_c3 > 10)
-> Table scan on <temporary>
-> Aggregate using temporary table
-> Filter: (t2.c1 >= t2.c2) (cost=0.75 rows=2)
-> Table scan on t2 (cost=0.75 rows=5)Sebelum penurunan kondisi (penurunan kondisi WHERE ke tabel turunan), masukkan langkah pembangkitan predikat transitif. Ekspresi v1.c1 >= t1.c2 and t1.c2 = v1.c2 memungkinkan derivasi kondisi tabel tunggal v1.c1 > v1.c2 dengan mentransmisikan hubungan non-kesetaraan dan kesetaraan. Selanjutnya, kondisi v1.c1 > v1.c2 diturunkan ke tabel turunan melalui penurunan kondisi, berubah menjadi bidang terkait t2.c1 >= t2.c2 dalam tabel turunan, sehingga memfasilitasi penyaringan data lebih awal.
Contoh 2
SELECT a, b, ee
FROM (
SELECT b, a, MIN(c) AS ee
FROM t1
GROUP BY a, b
) dt
GROUP BY a, b
HAVING MIN(ee) < 20;
-- Setelah transformasi derivasi ========>
SELECT a, b, ee
FROM (
SELECT b, a, MIN(c) AS ee
FROM t1
WHERE c < 20
GROUP BY a, b
) dt
GROUP BY a, b;
-- Rencana eksekusi berikut juga menunjukkan hasil setelah menerapkan derivasi MIN/MAX
EXPLAIN FORMAT = TREE SELECT a, b, ee
FROM (
SELECT b, a, MIN(c) AS ee
FROM t1
GROUP BY a, b
) dt
GROUP BY a, b
HAVING MIN(ee) < 20;
EXPLAIN
-> Table scan on <temporary>
-> Aggregate using temporary table
-> Table scan on dt
-> Materialize
-> Table scan on <temporary>
-> Aggregate using temporary table
-> Filter: (t1.c < 20) (cost=*** rows=***)
-> Table scan on t1 (cost=*** rows=***)Dalam kueri luar, kondisi MIN(ee) < 20 pertama kali ditentukan menggunakan kondisi MIN/MAX untuk menetapkan dt.ee < 20. Kondisi ini kemudian diturunkan ke tabel turunan dt. Dalam tabel ini, kondisi HAVING MIN(c) < 20 mengarah pada derivasi t1.c < 20 melalui MIN/MAX. Melalui serangkaian transformasi ini, kondisi filter dibawa lebih dekat ke sumber data, yang mempercepat proses kueri.