Tüm Ürünler
Search
Belge Merkezi

ApsaraDB for SelectDB:Bucket Shuffle Join Kullanımı

Son Güncelleme:Oct 08, 2026

Bucket Shuffle Join, ApsaraDB for SelectDB içindeki dağıtılmış Join sorgularını optimize eder. Bu yöntem, her iki tabloyu da küme genelinde karıştırmak yerine sağ tablo verilerini sol tablonun verilerinin zaten bulunduğu depolama düğümlerine yönlendirir. Broadcast Join ve Shuffle Join ile karşılaştırıldığında bu yaklaşım, ağ ve bellek ek yükünü küme ölçeğinden bağımsız olarak yalnızca sağ tablonun boyutuna indirger.

Tasarım arka planı için bkz. ISSUE 4394.

Çalışma Mantığı

ApsaraDB for SelectDB, iki yaygın dağıtılmış Join stratejisini destekler:

  • Broadcast Join: Sağ tablonun tamamını, sol tablo verilerini tutan her HashJoinNode'a gönderir. Üç HashJoinNode bulunduğunda bu durum, hem ağ hem de bellek açısından sağ tablo veri hacminin 3 katına eşdeğerdir.

  • Shuffle Join: Her iki tabloyu da hash'leyerek tüm satırları küme düğümleri arasında yeniden dağıtır. Ağ ek yükü her iki tablonun toplam boyutuna; bellek ek yükü ise sağ tablonun boyutuna eşittir.

image.png

Frontend (FE) düğümü, her tablo için veri dağıtım bilgilerini saklar. Bir Join işlemindeki eşitlik koşulu sol tablonun bucket sütunuyla eşleştiğinde FE, bu dağıtım haritasını kullanarak sağ tablo verilerini doğrudan sol tablonun depolama düğümlerine gönderir. Böylece sol tablonun yeniden dağıtılmasına gerek kalmaz.

Sonuç olarak hem ağ hem de bellek ek yükü yalnızca sağ tablonun boyutuna eşit olur. FE'nin sol tablo üzerinde bölüm budama veya bucket budama uygulayabilmesi durumunda bu avantaj daha da artar; böylece her düğümün işlemesi gereken veri miktarı azalır.

Bucket Shuffle Join'in Colocate Join'den Farkı: Bucket Shuffle Join, herhangi bir tablonun veri dağılımı hakkında bilgi sahibi olmayı veya değişiklik yapmayı gerektirmez. İki tablo arasında eşleşen dağıtım kuralları dayatmadığından veri çarpıklığını önler. Ayrıca sorgu planlaması sırasında Join Yeniden Sıralama (Join Reorder) işleminin keşfedebileceği daha fazla yol sunar.

Temel Kavramlar

Terim Tanım
Sol tablo Bir Join sorgusundaki sol taraftaki tablodur; probe işleminde kullanılır. Join Yeniden Sıralama, hangi tablonun sol tarafta olacağını değiştirebilir.
Sağ tablo Bir Join sorgusundaki sağ taraftaki tablodur; build işleminde kullanılır. Join Yeniden Sıralama, hangi tablonun sağ tarafta olacağını değiştirebilir.
Bucket sütunu Tablo oluşturma sırasında satırların bucket'lara dağıtıldığı sütundur.
FE düğümü Her tablonun veri dağıtım bilgilerini saklayan ve sorgu yürütme planlarını oluşturan frontend düğümüdür.

Bucket Shuffle Join'i Etkinleştirme

Oturum değişkeni enable_bucket_shuffle_join değerini true olarak ayarlayın. FE, ardından uygun olan herhangi bir sorgu için Bucket Shuffle Join'i otomatik olarak seçer.

set enable_bucket_shuffle_join = true;

Dağıtılmış bir sorguyu planlarken FE şu öncelik sırasını uygular:

Colocate Join > Bucket Shuffle Join > Broadcast Join > Shuffle Join

Otomatik seçimi geçersiz kılmak için bir ipucu (hint) kullanın:

SELECT * FROM test JOIN [shuffle] baseall ON test.k1 = baseall.k1;

Bucket Shuffle Join'in Kullanıldığını Doğrulama

Yürütme planını incelemek için bir sorguda explain komutunu çalıştırın. join op alanında BUCKET_SHUFFLE ifadesini arayın.

Bucket Shuffle Join uygulandı:

|   2:HASH JOIN                                                       |
|   |  join op: INNER JOIN (BUCKET_SHUFFLE)                          |
|   |  hash predicates:                                              |
|   |  colocate: false, reason: table not in the same group          |
|   |  equal join conjunct: `test`.`k1` = `baseall`.`k1`            |

Başka bir Join yöntemine geri dönüş (Bucket Shuffle Join uygulanmadı):

|   2:HASH JOIN                                                       |
|   |  join op: INNER JOIN (BROADCAST)                               |
|   |  hash predicates:                                              |
|   |  colocate: false, reason: table not in the same group          |
|   |  equal join conjunct: `test`.`k1` = `baseall`.`k1`            |

Plan, BUCKET_SHUFFLE yerine BROADCAST veya SHUFFLE gösteriyorsa optimizasyonun neden uygulanmadığını belirlemek için aşağıdaki planlama kurallarını kontrol edin.

Planlama Kuralları

Bucket Shuffle Join, hash hesaplamalı bucket atamalarına göre verileri yönlendirir. Tüm planlama gereksinimleri bu temel kısıtlamadan kaynaklanır: FE, planlama zamanında sol tablonun her satırının hangi depolama düğümlerinde bulunduğunu tam olarak belirleyebilmelidir.

Gereksinim Ayrıntı
Eşitlik join koşulu Join, bir eşitlik yüklemi (=) kullanmalıdır. Aralık veya eşitsizlik koşulları hash tabanlı yönlendirme için kullanılamaz.
Join koşulunda sol tablonun bucket sütunu Eşitlik yüklemi, sol tablonun bucket sütununu içermelidir.
Eşleşen veri türleri Sol tablonun bucket sütunu ile sağ tablonun ilgili sütunu aynı veri türüne sahip olmalıdır. Tür uyumsuzluğu planlamayı engeller.
Yalnızca yerel OLAP tabloları Sol tablo, yerel çevrimiçi analitik işleme (OLAP) tablosu olmalıdır. Open Database Connectivity (ODBC), MySQL veya Elasticsearch tabloları gibi harici tablolar sol tablo olarak hizmet edemez.
Sol tabloda tek bölüm Bölümlenmiş tablolar için Bucket Shuffle Join yalnızca sorgu tam olarak bir bölüme dokunduğunda uygulanır. Bu gereksinimi karşılamak ve bölüm budamayı etkinleştirmek için bir WHERE yan tümcesi kullanın.
Colocate tabloları en iyi performansı sağlar Sol tablo bir Colocate tablosuysa bölüm başına veri dağılımı sabittir ve FE tarafından tam olarak bilinir. Bu durum, Bucket Shuffle Join'e en hassas yönlendirme bilgilerini sağlar.