All Products
Search
Document Center

PolarDB:Percepatan\ paralel\ untuk\ Hash\ Join

Last Updated:Mar 29, 2026

Hash join adalah metode eksekusi gabungan yang diperkenalkan di MySQL Community Edition 8.0. Kueri analitik yang menggabungkan tabel besar sering kali mengalami bottleneck akibat pemrosesan gabungan secara sekuensial. PolarDB for MySQL 8.0 mendukung dua strategi hash join paralel—simple hash join dan shuffle hash join—yang mendistribusikan beban gabungan ke beberapa worker untuk mengurangi latensi kueri. Kebijakan eksekusi paralel tambahan sedang dalam pengembangan dan akan dirilis di masa mendatang.

Pilih strategi

StrategiRevisi minimumPaling cocok untuk
Simple hash join8.0.2.1.0Gabungan di mana tabel hash muat dalam memori
Shuffle hash join8.0.2.2.0Gabungan di mana tabel hash akan tumpah ke disk

Gunakan shuffle hash join ketika simple hash join menyebabkan I/O disk akibat ukuran tabel hash yang besar.

PolarDB hanya mendukung EXPLAIN FORMAT=TREE untuk memverifikasi strategi hash join yang aktif. Format EXPLAIN lainnya tidak menampilkan penggunaan hash join.

Simple hash join

Prasyarat

Sebelum memulai, pastikan Anda memiliki:

  • Kluster PolarDB for MySQL 8.0 Cluster Edition dengan versi revisi 8.0.2.1.0 atau lebih baru

Untuk memeriksa versi revisi Anda, lihat Kueri versi engine.

Cara kerja

Simple hash join parallel execution policy

Dengan tingkat paralelisme (DOP) sebesar 4, empat worker melakukan pemindaian tabel t1 secara paralel. Setiap worker membangun tabel hash lokal dari bagian datanya sendiri dari t1, lalu melakukan probing terhadap tabel hash tersebut dengan baris-baris t2. Sebuah node leader menjalankan operasi Gather untuk mengumpulkan dan menggabungkan hasil dari semua worker.

Strategi ini efektif ketika tabel hash muat dalam memori. Jika ukuran gabungan tabel hash terlalu besar dan memicu I/O disk, gunakan shuffle hash join sebagai gantinya.

Verifikasi bahwa simple hash join digunakan

Contoh

Buat dua tabel dan masukkan 1.000 baris ke masing-masing:

CREATE TABLE t1 (c1 INT, c2 INT);
CREATE TABLE t2 (c1 INT, c2 INT);

INSERT t1(c1, c2)
WITH RECURSIVE seq AS (
  SELECT 1 AS a, 1 AS b
  UNION ALL
  SELECT a + 1, b + 1 FROM seq WHERE a < 1000
)
SELECT a, b FROM seq;

INSERT INTO t2 SELECT * FROM t1;

Jalankan EXPLAIN FORMAT=TREE dengan petunjuk PQ_DISTRIBUTE untuk memastikan simple hash join dipilih:

EXPLAIN FORMAT=TREE SELECT /*+ PQ_DISTRIBUTE(t1 PQ_NONE) PQ_DISTRIBUTE(t2 PQ_NONE) */ * FROM t1 JOIN t2 ON t1.c1 = t2.c2;

Output yang diharapkan:

EXPLAIN FORMAT=TREE
 EXPLAIN
  -> Gather (slice: 1; workers: 4)  (cost=10.82 rows=4)
    -> Parallel inner hash join (t2.c2 = t1.c1)  (cost=0.57 rows=1)
        -> Parallel table scan on t2, with parallel partitions: 1  (cost=0.03 rows=1)
        -> Parallel hash
            -> Parallel table scan on t1, with parallel partitions: 1  (cost=0.16 rows=1)

Membaca Rencana Eksekusi

NodePeran
Parallel table scan on t1Setiap worker memindai partisi t1 (sisi build)
Parallel hashSetiap worker membangun tabel hash lokal dari partisi t1-nya
Parallel inner hash joinSetiap worker melakukan probing terhadap tabel hash-nya dengan baris-baris t2 (sisi probe)
Gather (workers: 4)Leader mengumpulkan hasil dari keempat worker

Shuffle hash join

Prasyarat

Sebelum memulai, pastikan Anda memiliki:

  • Kluster PolarDB for MySQL 8.0 Cluster Edition dengan versi revisi 8.0.2.2.0 atau lebih baru

Untuk memeriksa versi revisi Anda, lihat Kueri versi engine.

Cara kerja

Shuffle hash join parallel execution policy

Shuffle hash join (juga dikenal sebagai partition hash join) mengatasi tekanan memori pada simple hash join. Alih-alih setiap worker membangun tabel hash dari seluruh dataset, worker terlebih dahulu mempartisi ulang kedua tabel berdasarkan kunci gabungan. Setiap worker kemudian secara independen membangun tabel hash kecil hanya dari partisi yang ditugaskan kepadanya.

Dengan DOP sebesar 2, eksekusi berlangsung dalam tiga fase:

  1. Fase build: Worker memindai t1, mempartisi ulang baris berdasarkan kunci gabungan, dan setiap worker membangun tabel hash kecil dari partisi yang ditugaskan.

  2. Fase probe: Worker memindai t2, mempartisi ulang baris berdasarkan kunci gabungan yang sama, dan melakukan probing terhadap partisi tabel hash yang sesuai.

  3. Gather: Leader mengumpulkan dan menggabungkan hasil dari semua worker.

Karena setiap tabel hash hanya mencakup subset data, shuffle hash join dapat menangani dataset besar tanpa tumpah ke disk.

Verifikasi bahwa shuffle hash join digunakan

Contoh

Gunakan tabel t1 dan t2 yang sama seperti pada contoh simple hash join. Jalankan EXPLAIN FORMAT=TREE tanpa petunjuk—PolarDB secara otomatis memilih shuffle hash join jika sesuai:

EXPLAIN FORMAT=TREE SELECT * FROM t1 JOIN t2 ON t1.c1 = t2.c2;

Output yang diharapkan:

EXPLAIN FORMAT=TREE
EXPLAIN
| -> Gather (slice: 1; workers: 2)  (cost=33.38 rows=4)
    -> Inner hash join (t2.c1 = t1.c1)  (cost=23.08 rows=2)
        -> Repartition (hash keys: t2.c1; slice: 2; workers: 1)  (cost=11.35 rows=2)
            -> Parallel table scan on t2, with parallel partitions: 1  (cost=0.65 rows=4)
        -> Hash
            -> Repartition (hash keys: t1.c1; slice: 3; workers: 1)  (cost=11.35 rows=2)
                -> Parallel table scan on t1, with parallel partitions: 1  (cost=0.65 rows=4)

Membaca Rencana Eksekusi

NodePeran
Repartition (hash keys: t1.c1)Mendistribusikan ulang baris t1 ke worker berdasarkan kunci gabungan (sisi build)
HashSetiap worker membangun tabel hash kecil dari partisi t1 yang ditugaskan kepadanya
Repartition (hash keys: t2.c1)Mendistribusikan ulang baris t2 ke worker yang sesuai berdasarkan kunci gabungan (sisi probe)
Inner hash joinSetiap worker melakukan probing terhadap tabel hash-nya dengan baris t2 yang ditugaskan kepadanya
Gather (workers: 2)Leader mengumpulkan hasil dari semua worker