全部产品
Search
文档中心

PolarDB:Penurunan kondisi penggabungan ke tabel turunan yang dimaterialisasi

更新时间:Jul 06, 2025

PolarDB mendukung penurunan kondisi penggabungan ke tabel turunan yang dimaterialisasi. Fitur ini memungkinkan transfer ekspresi kondisi yang sesuai dengan aturan penurunan dari klausa ON dalam pernyataan JOIN langsung ke tabel turunan tersebut. Dengan memajukan proses penyaringan data, fitur ini memastikan bahwa kondisi predikat diterapkan ke sumber data sedini mungkin, sehingga mengurangi volume data untuk pemrosesan selanjutnya dan meningkatkan kinerja kueri.

Catatan

Fitur penurunan kondisi ke tabel turunan yang dimaterialisasi berbeda dari penurunan kondisi penggabungan standar (JPP), dengan skenario aplikasi yang berbeda. Teknik penurunan di sini bergantung pada kesetaraan predikat WHERE, yang memungkinkan derivasi kondisi tabel tunggal yang hanya bergantung pada tabel turunan yang dimaterialisasi dan penurunannya selanjutnya. Aturan heuristik ini biasanya meningkatkan kinerja eksekusi SQL. Sebaliknya, JPP berfokus pada predikat ON yang melibatkan kondisi multi-tabel, yang ditransformasikan menjadi subquery terkait berdasarkan estimasi biaya selama penurunan, tanpa jaminan peningkatan kinerja. Untuk informasi lebih lanjut, lihat penurunan kondisi penggabungan.

Prasyarat

Fitur ini didukung di kluster yang menggunakan mesin database berikut. Untuk informasi lebih lanjut tentang cara memeriksa versi mesin database, lihat Nomor Versi Kueri.

  • MySQL 8.0.1 dengan versi revisi 8.0.1.1.44 atau lebih baru.

  • MySQL 8.0.2 dengan versi revisi 8.0.2.2.25 atau lebih baru.

Batasan

  • Penurunan tidak diizinkan jika tabel turunan yang dimaterialisasi memiliki klausa LIMIT. Contoh:

    SELECT * FROM t1 LEFT JOIN (SELECT c, MAX(d) FROM t2 GROUP BY c LIMIT 2) dt ON t1.a < dt.a AND t1.a = 1;
  • Penurunan tidak didukung jika kolom dari ekspresi kondisi WHERE luar atau kolom yang dipetakan ke kolom terkait dari tabel turunan yang dimaterialisasi memenuhi salah satu kondisi berikut:

    • Kolom merujuk ke subquery atau bersifat non-deterministik. Contoh:

      SELECT * FROM t1 LEFT JOIN (SELECT c, MAX(d) FROM t2 GROUP BY c) dt ON t1.a < dt.a AND t1.a = RAND();
    • Kolom merupakan bagian dari prosedur tersimpan atau fungsi. Contoh:

      CREATE FUNCTION f1() RETURNS INT
      BEGIN
      ...
      END;
      
      SELECT * FROM t1 LEFT JOIN (SELECT c, MAX(d) FROM t2 GROUP BY c) dt ON t1.a < dt.a AND t1.a = f1();

Penggunaan

Persiapan

Sebelum menggunakan fitur penurunan kondisi, konfigurasikan parameter loose_join_cond_push_into_derived_mode sesuai dengan kebutuhan bisnis Anda. Untuk instruksi terperinci, lihat Atur Parameter Kluster dan Node.

Tabel berikut menjelaskan parameter tersebut.

Nama parameter

Tingkat

Deskripsi

loose_join_cond_push_into_derived_mode

Global

Saklar kontrol untuk fitur penurunan kondisi dari kondisi penggabungan ke Tabel Turunan. Nilai valid:

  • REPLICA_ON (default): mengaktifkan fitur penurunan kondisi hanya pada node baca saja.

  • ON: mengaktifkan fitur penurunan kondisi.

  • OFF: menonaktifkan fitur penurunan kondisi.

Contoh

Catatan

Jika semua kolom dalam ekspresi kondisi (atau kolom setara mereka) berasal dari tabel turunan yang dimaterialisasi, kondisi tersebut dapat diturunkan ke tabel tersebut.

Eksekusi kode berikut untuk membuat tabel contoh:

CREATE TABLE t1 (a INT, b INT, c INT, d INT);
CREATE TABLE t2 (e INT, f INT, g INT);
  • Aktifkan fitur dengan mengatur loose_join_cond_push_into_derived_mode ke ON dan eksekusi kode berikut:

    EXPLAIN FORMAT=TREE SELECT * FROM t1 LEFT JOIN (SELECT * FROM t2) dt ON dt.x > t1.a WHERE t1.a = 1;

    Hasil contoh:

    -> Left hash join (no condition)
        -> Filter: (t1.a = 1)  (cost=0.55 rows=1)
            -> Table scan on t1  (cost=0.55 rows=3)
        -> Hash
            -> Table scan on dt
                -> Materialize
                    -> Filter: (t2.x > 1)  (cost=0.45 rows=1)
                        -> Table scan on t2  (cost=0.45 rows=2)
    Catatan

    Dalam rencana kueri, kesetaraan t1.a = 1 dari klausa WHERE berhasil diteruskan ke predikat JOIN, menghasilkan dt.x > 1 yang secara efektif diturunkan ke tabel turunan dt. Akibatnya, volume data dalam dt berkurang, yang mengarah pada peningkatan kinerja kueri.

  • Atur loose_join_cond_push_into_derived_mode ke OFF dan eksekusi kode berikut:

    EXPLAIN FORMAT=TREE SELECT * FROM t1 LEFT JOIN (SELECT * FROM t2) dt ON dt.x > t1.a WHERE t1.a=1;

    Hasil contoh:

    -> Left hash join (no condition)
        -> Filter: (t1.a = 1)  (cost=0.55 rows=1)
            -> Table scan on t1  (cost=0.55 rows=3)
        -> Hash
            -> Filter: (dt.x > 1)
                -> Table scan on dt
                    -> Materialize
                        -> Table scan on t2  (cost=0.45 rows=2)
    Catatan

    Dengan loose_join_cond_push_into_derived_mode diatur ke OFF, kondisi dt.x > 1 tidak diturunkan ke Tabel Turunan, dan penyaringan dilakukan hanya setelah tabel turunan dimaterialisasi.