Operasi JOIN umum digunakan dalam sistem terdistribusi, tetapi juga mahal dari segi waktu dan sumber daya. Operasi shuffle terutama mahal dalam skenario data berskala besar. Untuk mengatasi hal ini, MaxCompute mengoptimalkan operasi shuffle dengan memanfaatkan properti equi-join.
Cara kerja
Contoh pernyataan SQL yang mencakup JOIN adalah sebagai berikut:
SELECT * FROM (table1) A JOIN (table2) B ON A.a = B.b;
Dalam skenario dengan set data kecil, filter dinamis hanya berlaku bila digunakan bersama MergeJoin. Untuk memastikan eksekusi yang tepat, atur flag berikut:
-
set odps.optimizer.enable.conditional.mapjoin=false; -
set odps.optimizer.cbo.rule.filter.black=hj;
Berdasarkan kondisi kesetaraan pada JOIN, MaxCompute dapat menghasilkan filter dari data di Tabel A untuk menyaring data di Tabel B sebelum operasi shuffle atau JOIN. MaxCompute bahkan dapat mendorong filter tersebut ke penyimpanan dasar untuk menyaring data di sumbernya. Fitur ini—yang secara dinamis menghasilkan filter pada waktu proses—disebut filter dinamis (DF).
Diagram berikut menunjukkan rencana eksekusi untuk pernyataan SQL di atas sebelum dan sesudah filter dinamis diaktifkan.

Kasus penggunaan
Fitur filter dinamis memanfaatkan properti equi-join untuk menghasilkan filter pada waktu proses. Hal ini memungkinkan penyaringan data sebelum operasi shuffle atau JOIN, sehingga mempercepat eksekusi kueri. Fitur ini ideal untuk skenario di mana tabel dimensi digabungkan dengan tabel fakta.
Rentang dinamis atau filter Bloom
Seperti yang ditunjukkan pada diagram sebelumnya, tidak ada filter dalam rencana eksekusi asli. Sistem secara otomatis menghasilkan filter berdasarkan properti JOIN tersebut. Filter ini memeriksa apakah elemen dari tabel B ada dalam set yang dihasilkan dari tabel A dan menghapus elemen yang tidak ada.
Dalam praktiknya, filter dinamis dapat menggunakan filter Bloom atau metode penyaringan data lainnya, seperti filter rentang berdasarkan nilai [min, max] atau predikat IN.
Filter dinamis mengikuti model produsen-konsumen khas, seperti yang ditunjukkan pada diagram berikut.
-
Operator DFP (Dynamic Filter Producer): Produsen filter dinamis. Operator ini menggunakan data dari tabel yang lebih kecil untuk menghasilkan filter Bloom serta mendapatkan nilai
mindanmax(untuk filter rentang) dari kunci gabungan. Informasi ini kemudian dikirim ke DFC. -
Operator DFC (Dynamic Filter Consumer): Konsumen filter dinamis. Operator ini menggunakan filter Bloom dan filter rentang untuk menyaring data dari tabel yang lebih besar. Filter rentang berusaha mendorong kondisi filter ke penyimpanan dasar agar data dapat disaring di sumbernya.
Untuk semantik JOIN yang berbeda, tabel dalam operasi gabungan dapat memainkan peran yang berbeda:
-
A JOIN B: Baik A maupun B dapat bertindak sebagai produsen atau konsumen.
-
A LEFT JOIN B: A hanya dapat bertindak sebagai produsen, dan B hanya sebagai konsumen.
-
A RIGHT JOIN B: A hanya dapat bertindak sebagai konsumen, dan B hanya sebagai produsen.
-
A FULL OUTER JOIN B: Filter dinamis tidak dapat digunakan.
Untuk informasi tentang cara menggunakan filter dinamis, lihat Aktifkan filter dinamis.
Pemangkasan partisi dinamis
Contoh filter Bloom dan filter rentang sebelumnya menggambarkan optimasi untuk tabel non-partisi, di mana kunci gabungan bukan kolom kunci partisi. Ketika kunci gabungan merupakan kolom kunci partisi, filter rentang atau Bloom dinamis masih dapat digunakan. Namun, MaxCompute membaca seluruh data dalam suatu partisi sebelum menyaringnya. Proses ini dapat dioptimalkan dengan memangkas partisi yang tidak relevan sebelum membacanya. Fitur ini disebut Pemangkasan Partisi Dinamis (DPP).
Sebagai contoh, pertimbangkan pernyataan SQL berikut yang mencakup JOIN:
-- A adalah tabel non-partisi. Nilai dalam kolom a adalah 20200701.
-- B adalah tabel partisi. Kolom kunci partisi ds memiliki tiga partisi: 20200701, 20200702, dan 20200703.
SELECT * FROM (table1) A JOIN (table2) B ON A.a= B.ds;
Setelah Anda mengaktifkan Pemangkasan Partisi Dinamis, pengoptimal memutuskan apakah akan menerapkannya berdasarkan apakah tabel tersebut merupakan tabel partisi. Saat Pemangkasan Partisi Dinamis berlaku, MaxCompute mengumpulkan data dari tabel yang lebih kecil untuk menghasilkan filter Bloom. Selanjutnya, daftar partisi dari tabel yang lebih besar disaring, partisi yang perlu dibaca diidentifikasi, dan sisanya dipangkas. Jika semua partisi target suatu proses dipangkas, proses tersebut tidak dijadwalkan.
Dalam contoh di atas, karena satu-satunya nilai dalam kolom a tabel A adalah 20200701, pengaktifan Pemangkasan Partisi Dinamis memangkas partisi 20200702 dan 20200703 dari tabel B. Hal ini menghemat sumber daya dan mengurangi waktu proses Pekerjaan.
Untuk informasi tentang cara menggunakan Pemangkasan Partisi Dinamis, lihat Aktifkan Pemangkasan Partisi Dinamis.
Aktifkan filter dinamis
MaxCompute menyediakan metode berikut untuk mengaktifkan filter dinamis:
-
Metode 1: Paksa penyaringan dinamis pada tingkat session. Kirim perintah berikut bersama pernyataan SQL Anda:
set odps.optimizer.force.dynamic.filter=true;CatatanProperti ini juga dapat diatur pada tingkat Proyek, tetapi kami menyarankan Anda mengaturnya pada tingkat session. Hal ini dapat mengurangi efisiensi pemrosesan untuk Pekerjaan JOIN yang tidak mendapat manfaat dari penyaringan.
Metode ini menyisipkan filter dinamis untuk setiap Pekerjaan JOIN yang didukung.
-
Metode 2: Izinkan pengoptimal untuk secara cerdas memutuskan kapan menggunakan penyaringan dinamis pada tingkat session.
set odps.optimizer.enable.dynamic.filter=true;Saat menggunakan metode ini, pengoptimal memperkirakan apakah penyisipan filter dinamis memberikan manfaat yang cukup. Jika ya, pengoptimal akan menyisipkan filter dinamis; jika tidak, maka tidak dilakukan.
CatatanMetode ini bergantung pada statistik metadata, seperti jumlah nilai unik (NDV). Untuk informasi lebih lanjut tentang statistik metadata, lihat Kumpulkan informasi untuk pengoptimal. Karena statistik metadata merupakan perkiraan dari pengoptimal, nilainya mungkin tidak akurat. Akibatnya, pengoptimal mungkin tidak menyisipkan filter dinamis seperti yang diharapkan.
-
Metode 3: Aktifkan filter dinamis menggunakan petunjuk dalam pernyataan SQL.
Format petunjuknya adalah
/*+dynamicfilter(Producer, Consumer1[, Consumer2,...])*/. Petunjuk ini memungkinkan satu produsen menyaring beberapa konsumen. Contoh perintahnya adalah sebagai berikut:select /*+dynamicfilter(A, B)*/ * from table1 A join table2 B on A.a= B.b;
Aktifkan Pemangkasan Partisi Dinamis
Aktifkan Pemangkasan Partisi Dinamis pada tingkat session dengan mengirim perintah berikut bersama pernyataan SQL Anda:
set odps.optimizer.dynamic.filter.dpp.enable=true;
Properti ini juga dapat diatur pada tingkat Proyek, tetapi kami menyarankan Anda mengaturnya pada tingkat session. Jika Pekerjaan JOIN tidak mendapat manfaat dari penyaringan data, hal ini dapat mengurangi efisiensi pemrosesan.
Verifikasi optimasi
Setelah Anda mengaktifkan fitur-fitur tersebut sebagaimana dijelaskan dalam Aktifkan filter dinamis atau Aktifkan Pemangkasan Partisi Dinamis, Anda dapat menggunakan metode berikut untuk memverifikasi bahwa fitur-fitur tersebut aktif:
Verifikasi filter dinamis
Setelah menjalankan Pekerjaan SQL, lihat informasi LogView-nya. Jika operator serupa DynamicFilterConsumer1 muncul dalam LogView, filter dinamis telah berlaku.
Verifikasi Pemangkasan Partisi Dinamis
Setelah menjalankan Pekerjaan SQL, periksa informasi LogView-nya. Jika operator seperti DppDynamicProducer yang berisi PartitionPruneInfos muncul dalam LogView, hal ini menunjukkan bahwa Pemangkasan Partisi Dinamis telah berlaku.
