Metode hash join, yang diperkenalkan dalam MySQL Community Edition 8.0, secara signifikan meningkatkan performa kueri analitik. PolarDB for MySQL 8.0 mendukung eksekusi paralel untuk hash join dengan serangkaian strategi yang terus berkembang. Topik ini menjelaskan cara menggunakan fitur hash join untuk parallel queries di PolarDB.
Hash join paralel sederhana
Prasyarat
Kluster Anda harus merupakan PolarDB for MySQL 8.0 Cluster Edition yang menjalankan revision version 8.0.2.1.0 atau lebih baru. Untuk memeriksa versi Anda, lihat Query the engine version.
Strategi paralel
Gambar tersebut menunjukkan execution plan untuk parallel query dengan tingkat paralelisme (DOP) sebesar 4. Artinya, PolarDB menggunakan empat workers untuk memindai bagian berbeda dari table t1 secara konkuren. Setiap worker membangun hash table-nya sendiri menggunakan bagian datanya dari t1. Hash tables ini kemudian digabungkan dengan seluruh table t2. Terakhir, sebuah leader mengumpulkan hasil dari semua workers.
Penggunaan
-
Sintaksis:
Di PolarDB, gunakan pernyataan
EXPLAIN FORMAT=TREEuntuk melihat operasihash joindalamexecution plan. -
Contoh:
Contoh berikut membuat dua
tablesdan memasukkan data sampel: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;Lihat
execution planuntuk pernyataan SQL berikut:EXPLAIN FORMAT=TREE SELECT /*+ PQ_DISTRIBUTE(t1 PQ_NONE) PQ_DISTRIBUTE(t2 PQ_NONE) */ * FROM t1 JOIN t2 ON t1.c1 = t2.c2;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)Contoh di atas menunjukkan rencana eksekusi paralel dengan tingkat paralelisme (DOP) sebesar 4. Artinya, PolarDB menjalankan empat worker untuk mengeksekusi kueri. Dalam rencana ini, tabel
t1menjalani Pemindaian Paralel. Keempat worker memindai bagian berbeda dari tabel ini. Setiap worker menggunakan bagian datanya darit1untuk membangun tabel hash, lalu melakukan operasi JOIN dengan seluruh tabelt2. Terakhir, leader mengumpulkan hasil dari semua worker untuk menghasilkan hasil akhir kueri.
Shuffle hash join
Prasyarat
Kluster Anda harus merupakan PolarDB for MySQL 8.0 Cluster Edition yang menjalankan revision version 8.0.2.2.0 atau lebih baru. Untuk memeriksa versi Anda, lihat Query the engine version.
Strategi paralel
Hash join paralel mengeksekusi fase build dan probe secara paralel. Namun, jika hash table bersama terlalu besar untuk muat di memori, data tersebut akan disimpan ke disk, sehingga menimbulkan overhead I/O dan mengurangi efisiensi kueri. Strategi shuffle hash join mengatasi hal ini dengan mempartisi ulang data dari kedua tabel. Seperti yang ditunjukkan pada gambar, proses dimulai dengan pemindaian paralel pada table t1, di mana beberapa workers memindai table tersebut secara konkuren. Setiap worker kemudian mempartisi ulang (shuffles) datanya ke sekumpulan workers kedua berdasarkan join key. Hal ini memungkinkan setiap worker pada kelompok kedua untuk membangun hash table lokal yang lebih kecil dari partisi data di t1. Setelah fase build selesai, pemindaian paralel dimulai pada table t2. Data dari t2 juga dipartisi ulang berdasarkan join key dan dikirim ke workers yang menyimpan partisi hash table yang sesuai. Setiap worker kemudian melakukan operasi probe pada partisi data lokalnya. Terakhir, leader mengumpulkan hasil dari semua workers.
Penggunaan
-
Sintaksis:
Di PolarDB, gunakan pernyataan
EXPLAIN FORMAT=TREEuntuk melihat operasihash joindalamexecution plan. -
Contoh:
Contoh berikut membuat dua
tablesdan memasukkan data sampel: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;Lihat
execution planuntuk pernyataan SQL berikut:EXPLAIN FORMAT=TREE SELECT * FROM t1 JOIN t2 ON t1.c1 = t2.c2;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)