All Products
Search
Document Center

MaxCompute:SKEWJOIN HINT

Last Updated:Jun 26, 2026

Ketika terjadi hotspot pada operasi Join antara dua tabel yang menyebabkan masalah long tail, Anda dapat meningkatkan efisiensi Join dengan mengekstraksi key hotspot, membagi data menjadi dua bagian—data hotspot dan non-hotspot—memprosesnya secara terpisah, lalu menggabungkan hasilnya. SkewJoin Hint dapat mendeteksi key hotspot dari kedua tabel secara otomatis atau manual, menghitung hasil Join untuk data hotspot dan non-hotspot secara terpisah, kemudian menggabungkannya guna mempercepat eksekusi Join.

Cara Penggunaan

Gunakan petunjuk /*+ skewJoin(<table_name>[(<column1_name>[,<column2_name>,...])][((<value11>,<value12>)[,(<value21>,<value22>)...])]*/ dalam pernyataan select agar SkewJoin dieksekusi. table_name adalah nama tabel yang miring (skewed), column_name adalah nama kolom yang miring, dan value adalah nilai key yang miring.

-- Metode 1: Hint nama tabel (perhatikan bahwa Hint merujuk pada alias tabel).
select /*+ skewjoin(a) */ * from T0 a join T1 b on a.c0 = b.c0 and a.c1 = b.c1;
-- Metode 2: Hint nama tabel dan kolom yang diduga menyebabkan kemiringan, misalnya kolom c0 dan c1 pada tabel a mengalami data skew.
select /*+ skewjoin(a(c0, c1)) */ * from T0 a join T1 b on a.c0 = b.c0 and a.c1 = b.c1 and a.c2 = b.c2;
-- Metode 3: Hint nama tabel dan kolom, serta berikan nilai key yang miring. Untuk tipe STRING, tambahkan tanda kutip. Misalnya, nilai (a.c0=1 dan a.c1="2") serta (a.c0=3 dan a.c1="4") mengalami data skew.
select /*+ skewjoin(a(c0, c1)((1, "2"), (3, "4"))) */ * from T0 a join T1 b on a.c0 = b.c0 and a.c1 = b.c1 and a.c2 = b.c2;
Catatan

Efisiensi pemrosesan Metode 3, yang secara langsung menentukan nilai, lebih tinggi dibandingkan Metode 1 dan Metode 2 (tanpa menentukan nilai).

Prinsip Implementasi

Key hotspot mengacu pada nilai key yang muncul sangat sering. Misalnya, pada gambar di bawah ini (bagian berwarna merah), a.c0=1 and a.c1=2 memiliki 10.000 baris, sedangkan a.c0=3 and a.c1 = 4 memiliki 9.000 baris.热值key

Tanpa SkewJoin Hint, saat melakukan Join antara tabel T0 dan T1, karena ukuran kedua tabel sangat besar, sistem hanya dapat menggunakan MergeJoin. Akibatnya, semua nilai hotspot akan di-Shuffle ke satu node yang sama, menyebabkan data skew. Setelah menambahkan SkewJoin Hint, pengoptimal akan menjalankan operasi Aggregate untuk mendeteksi secara dinamis 20 nilai hotspot dengan jumlah baris duplikat tertinggi. Selanjutnya, tabel T0 dibagi menjadi nilai yang termasuk hotspot (data A) dan nilai yang tidak termasuk hotspot (data B); sementara tabel T1 dibagi menjadi nilai yang dapat di-Join dengan hotspot dari T0 (data C) dan nilai yang tidak dapat di-Join dengan hotspot tersebut (data D). Kemudian, data A dan data C di-Join menggunakan MapJoin (karena volume data C sangat kecil sehingga memungkinkan penggunaan MapJoin), sedangkan data B dan data D di-Join menggunakan MergeJoin. Hasil dari MapJoin dan MergeJoin akhirnya digabungkan melalui operasi union untuk menghasilkan output akhir, seperti yang ditunjukkan pada gambar berikut.SkewJoin Hint

Hal yang Perlu Diperhatikan

  • Jenis Join yang didukung oleh SkewJoin Hint:

    • Inner Join memungkinkan pemberian Hint pada salah satu sisi tabel dalam operasi Join.

    • Left Join, Semi Join, dan Anti Join hanya memungkinkan Hint pada tabel sisi kiri.

    • Right Join hanya memungkinkan Hint pada tabel sisi kanan.

    • Full Join tidak mendukung Skew Join Hint.

  • Disarankan hanya memberikan Hint pada operasi Join yang benar-benar mengalami data skew, karena Hint akan menjalankan operasi Aggregate yang memiliki overhead tertentu. Selain itu, untuk query A Join B, jika Anda memberikan SkewJoin Hint pada tabel A, sistem akan memaksa pembuatan rencana eksekusi fisik yang mirip dengan MapJoin union all MergeJoin. Rencana eksekusi MapJoin tersebut, setelah diekspansi, akan tampak seperti: Top 20(A) MapJoin (B Semi Join Top20(A)). Jika tabel B sendiri memiliki volume data yang sangat besar, dan data setelah difilter oleh Top20(A) tetap besar, hal ini berpotensi menyebabkan masalah OOM (Out of Memory) saat membangun HashJoin dan HashTable dalam MapJoin.

  • Tipe Join Key pada sisi kiri dan sisi kanan dari operasi Join yang diberi Hint harus identik; jika tidak, SkewJoin Hint tidak akan berlaku. Misalnya, pada contoh sebelumnya, tipe a.c0 harus sama dengan b.c0, dan tipe a.c1 harus sama dengan b.c1. Anda dapat menggunakan Cast pada Join key dalam subquery untuk menyamakan tipe datanya. Contohnya sebagai berikut:

    create table T0(c0 int, c1 int, c2 int, c3 int);
    create table T1(c0 string, c1 int, c2 int);
    -- Metode 1:
    select /*+ skewjoin(a) */ * from T0 a join T1 b on cast(a.c0 as string) = cast(b.c0 as string) and a.c1 = b.c1;
    -- Metode 2:
    select /*+ skewjoin(b) */ * from (select cast(a.c0 as string) as c00 from T0 a) b join T1 c on b.c00 = c.c0;
  • Setelah menambahkan SkewJoin Hint, pengoptimal akan menjalankan operasi Aggregate untuk mendapatkan 20 nilai hotspot teratas. Nilai 20 merupakan nilai default, yang dapat Anda ubah melalui perintah set odps.optimizer.skew.join.topk.num = xx;.

  • SkewJoin Hint hanya mendukung pemberian Hint pada salah satu sisi operasi Join.

  • Operasi Join yang diberi Hint harus memiliki kondisi left key = right key; Join jenis Cartesian product tidak didukung.

  • Berikut adalah contoh penggunaan SkewJoin Hint bersama Hint lainnya. Namun, perlu diperhatikan bahwa operasi Join yang telah diberi MapJoin Hint tidak boleh lagi diberi SkewJoin Hint.

    select /*+ mapjoin(c), skewjoin(a) */ * from T0 a join T1 b on a.c0 = b.c3 join T2 c on a.c0 = c.c7;
  • Anda dapat memverifikasi apakah SkewJoin Hint berlaku dengan mencari field topk_agg pada Json Summary di Logview.