全部产品
Search
文档中心

PolarDB:Hash joins dalam kueri paralel

更新时间:Jul 06, 2025

Hash join adalah metode eksekusi join baru yang diperkenalkan di Edisi Komunitas MySQL 8.0. Metode ini dapat secara signifikan meningkatkan kinerja eksekusi kueri analitik. PolarDB untuk MySQL 8.0 mendukung eksekusi paralel dari hash joins. Kebijakan eksekusi paralel lainnya sedang dalam pengembangan dan akan dirilis di masa mendatang. Topik ini menjelaskan cara menggunakan hash joins untuk kueri paralel di PolarDB.

Hash join sederhana

Prerequisites

Cluster PolarDB untuk MySQL 8.0 dari Edisi Kluster digunakan, dengan versi revisi cluster 8.0.2.1.0 atau lebih baru. Untuk informasi lebih lanjut tentang cara memeriksa versi cluster, lihat Kueri Versi Mesin.

Parallel execution policy并行策略

Dalam rencana eksekusi sebelumnya, derajat paralelisme (DOP) diatur ke 4, yang menunjukkan bahwa PolarDB menggunakan empat pekerja untuk melakukan kueri paralel. Pertama, empat pekerja memindai tabel t1 secara paralel. Setiap pekerja hanya menggunakan sebagian data dalam tabel t1 untuk membuat tabel hash. Kemudian, operasi JOIN dilakukan antara empat tabel hash dan tabel t2. Terakhir, seorang pemimpin mengumpulkan hasil gabungan untuk menghasilkan hasil kueri akhir.

Usage

  • Sintaks:

    Di PolarDB, Anda hanya dapat menjalankan pernyataan EXPLAIN FORMAT=TREE untuk memeriksa apakah hash joins digunakan.

  • Contoh:

    Dalam contoh berikut, dua tabel dibuat dan data dimasukkan ke dalam tabel.

    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;

    Kueri rencana eksekusi dari pernyataan SELECT berikut:

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

    Contoh berikut menunjukkan rencana eksekusi untuk kedua tabel ketika hash joins digunakan:

    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)

    Dalam rencana eksekusi sebelumnya, DOP diatur ke 4, yang menunjukkan bahwa PolarDB menggunakan empat pekerja untuk melakukan kueri paralel. Pertama, empat pekerja memindai tabel t1 secara paralel. Setiap pekerja hanya menggunakan sebagian data dalam tabel t1 untuk membuat tabel hash. Kemudian, operasi JOIN dilakukan antara empat tabel hash dan tabel t2. Terakhir, seorang pemimpin mengumpulkan hasil gabungan untuk menghasilkan hasil kueri akhir.

Shuffle Hash Join

Prerequisites

Cluster PolarDB untuk MySQL 8.0 dari Edisi Kluster digunakan, dengan versi revisi cluster 8.0.2.2.0 atau lebih baru. Untuk informasi lebih lanjut tentang cara memeriksa versi cluster, lihat Kueri Versi Mesin.

Parallel execution policy并行策略

Hash join paralel mengimplementasikan eksekusi paralel baik pada fase pembuatan maupun penyelidikan. Namun, jika tabel hash bersama terlalu besar, operasi I/O dilakukan untuk menulis data ke disk, yang mempengaruhi efisiensi kueri paralel. Untuk menyelesaikan masalah ini, partisi hash join digunakan. Dalam rencana eksekusi sebelumnya, empat pekerja memindai tabel t1 secara paralel, mempartisi dan mendistribusikan data ke pekerja fase berikutnya berdasarkan kunci join, serta membangun tabel hash kecil di setiap partisi. Setelah fase pembuatan selesai, empat pekerja memindai tabel t2, mempartisi data berdasarkan kunci join, dan mendistribusikan data ke pekerja yang telah menyelesaikan pembuatan tabel hash kecil. Setelah operasi penyelidikan selesai, seorang pemimpin mengumpulkan hasil gabungan untuk menghasilkan hasil kueri akhir.

Usage

  • Sintaks:

    Di PolarDB, Anda hanya dapat menjalankan pernyataan EXPLAIN FORMAT=TREE untuk memeriksa apakah hash joins digunakan.

  • Contoh:

    Dalam contoh berikut, dua tabel dibuat dan data dimasukkan ke dalam tabel.

    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;

    Kueri rencana eksekusi dari pernyataan SELECT berikut:

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

    Contoh berikut menunjukkan rencana eksekusi untuk kedua tabel ketika hash joins digunakan:

    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)