Tüm Ürünler
Search
Belge Merkezi

ApsaraDB for SelectDB:Colocation join

Son Güncelleme:Oct 08, 2026

Shuffle join ve broadcast join gibi standart dağıtılmış birleştirme (join) stratejileri, birleştirme işleminden önce verileri backend (BE) düğümleri arasında taşır; bu durum veri hacmiyle orantılı gecikme süresine yol açar. Colocation join, aynı Colocation Group (CG) içindeki tabloların eşleşen paketlerini her zaman aynı BE düğümünde saklayarak bu ağ aktarımını ortadan kaldırır. Böylece paket sütunları üzerinden yapılan birleştirmeler tamamen yerel olarak gerçekleşir.

Önemli

Bir tablonun colocation özelliği, kümeler arası çoğaltma (CCR) tarafından senkronize edilemez. Bir tabloda is_being_synced = true değeri varsa colocation özelliği kaldırılır.

Nasıl çalışır

ApsaraDB for SelectDB, birlikte konumlandırılan tabloları bir Colocation Group (CG) içinde gruplar. Aynı CG içindeki tüm tablolar aynı Colocation Group Schema (CGS) yapısını paylaşmalıdır. Bu koşullar sağlandığında bir paket sıralaması, her paket indeksini tüm CG tablolarında aynı BE düğümüne eşit şekilde map eder. Aynı paket sütunu değerlerine sahip satırlar her zaman aynı BE düğümüne yazıldığından yerel birleştirmeler mümkün hale gelir.

Örnek: 4 BE düğümüne (A, B, C, D) eşlenen 8 paket

+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
| 0 | | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 |
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
| A | | B | | C | | D | | A | | B | | C | | D |
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+

CGS gereksinimleri — bir CG içindeki tüm tablolarda eşleşmesi gerekenler:

Gereksinim Ayrıntılar
Paket sütunu türleri Her paket sütununun veri türü aynı olmalıdır
Paket sütunu sayısı DISTRIBUTED BY HASH(...) yan tümcesi aynı sayıda sütun içermelidir
Paket sayısı BUCKETS değeri aynı olmalıdır

Eşleşmesi gerekmeyenler:

  • Bölüm sayısı

  • Bölüm kapsamı veya aralığı

  • Bölüm sütunu türleri

Tek bölümlü bir tabloda her paket tek bir tablet içerir. Çok bölmeli bir tabloda ise her paket bölüm başına bir tane olmak üzere birden çok tablet içerir.

Temel kavramlar

  • Colocation Group (CG): Aynı CGS ve paket dağıtımını paylaşan bir veya daha fazla tablodan oluşan adlandırılmış grup. Bir CG tek bir veritabanına aittir; adı o veritabanı içinde benzersizdir. SelectDB, CG'yi dahili olarak dbId_groupName biçiminde saklar ancak siz yalnızca grup adını kullanarak etkileşime girersiniz.

  • Colocation Group Schema (CGS): Bir CG içindeki tüm tabloların paylaştığı şema kısıtlamaları: paket sütunu türleri, paket sütunu sayısı ve paket sayısı.

  • Stable/Unstable: Tüm tabletleri tam olarak çoğaltıldığında ve herhangi bir geçiş işlemi devam etmediğinde bir CG Stable durumundadır. Bir CG Unstable olduğunda (örneğin çoğaltma onarımı veya yeniden dengeleme sırasında) colocation join geçici olarak normal bir birleştirmeye düşer; bu durum sorgu performansını belirgin şekilde azaltabilir.

Colocation tablosu oluşturma

Tablo oluştururken PROPERTIES yan tümcesine "colocate_with" = "group_name" ekleyin:

CREATE TABLE tbl (k1 int, v1 int sum)
DISTRIBUTED BY HASH(k1)
BUCKETS 8
PROPERTIES(
    "colocate_with" = "group1"
);
  • CG yoksa SelectDB bu tabloyu ilk üye olarak otomatik şekilde oluşturur.

  • CG zaten mevcutsa SelectDB tablonun CGS'i karşılayıp karşılamadığını denetler. Karşılanıyorsa tablo eklenir ve tabletleri mevcut paket dağıtımına göre oluşturulur.

Veritabanları arası colocation grupları

Tabloları veritabanları arasında birlikte konumlandırmak için grup adının önüne __global__ önekini ekleyin:

CREATE TABLE tbl (k1 int, v1 int sum)
DISTRIBUTED BY HASH(k1)
BUCKETS 8
PROPERTIES(
    "colocate_with" = "__global__group1"
);

Global bir CG herhangi bir veritabanına ait değildir ve adı küme genelinde benzersizdir.

Colocation join'in etkin olduğunu doğrulama

Colocation tablolarını diğer tabloları sorguladığınız gibi sorgulayın. Koşullar sağlandığında SelectDB colocation join kullanan bir sorgu planını otomatik olarak oluşturur.

Doğrulamak için bir birleştirme sorgusunda DESC (veya EXPLAIN) çalıştırın ve çıktıyı inceleyin:

-- Create tbl1 and tbl2 in the same CG, then run:
DESC SELECT * FROM tbl1 INNER JOIN tbl2 ON (tbl1.k2 = tbl2.k2);

Colocation join etkin — HASH JOIN düğümü colocate: true gösterir:

| 2:HASH JOIN                                      |
| |  join op: INNER JOIN                           |
| |  colocate: true                                |
| |    `tbl1`.`k2` = `tbl2`.`k2`                   |

Colocation join etkin değil — HASH JOIN düğümü bir gerekçeyle colocate: false gösterir ve bir EXCHANGE düğümü görünür:

| 2:HASH JOIN                                       |
| |  join op: INNER JOIN (BROADCAST)                |
| |  colocate: false, reason: group is not stable   |
| |    `tbl1`.`k2` = `tbl2`.`k2`                    |
...
| 3:EXCHANGE                                        |

colocate: false değerinin en yaygın nedeni CG'nin Unstable olmasıdır; bu durum çoğaltma onarımı veya yeniden dengelemenin devam ettiğini gösterir.

Colocation gruplarını yönetme

CG bilgilerini görüntüleme

Kümedeki tüm CG'leri listelemek için aşağıdaki komutu çalıştırın (admin rolü gerekir):

SHOW PROC '/colocation_group';

Örnek çıktı:

+-------------+--------------+--------------+------------+----------------+----------+----------+
| GroupId     | GroupName    | TableIds     | BucketsNum | ReplicationNum | DistCols | IsStable |
+-------------+--------------+--------------+------------+----------------+----------+----------+
| 10005.10008 | 10005_group1 | 10007, 10040 | 10         | 3              | int(11)  | true     |
+-------------+--------------+--------------+------------+----------------+----------+----------+
Alan Açıklama
GroupId dbId.grpId biçiminde küme genelinde benzersiz tanımlayıcı
GroupName CG'nin tam adı
TableIds CG içindeki tabloların ID'leri
BucketsNum Paket sayısı
ReplicationNum Çoğaltma sayısı
DistCols Paket sütunu türleri
IsStable CG Stable ise ve colocation join kullanılabilir ise true

Belirli bir CG için paket-BE eşlemesini incelemek için:

SHOW PROC '/colocation_group/10005.10008';

Örnek çıktı:

+-------------+------------+
| BucketIndex | BackendIds |
+-------------+------------+
| 0           | 10004      |
| 1           | 10003      |
| 2           | 10002      |
| 3           | 10003      |
| 4           | 10002      |
| 5           | 10003      |
| 6           | 10003      |
| 7           | 10003      |
+-------------+------------+
SHOW PROC komutlarını çalıştırmak için admin rolü gereklidir. Normal kullanıcılar bu komutları çalıştıramaz.

Tablonun colocation özelliğini değiştirme

Bir tabloyu farklı bir CG'ye taşımak için:

ALTER TABLE tbl SET ("colocate_with" = "group2");
  • Tablo henüz herhangi bir CG'de değilse SelectDB şemayı denetler ve tabloyu belirtilen CG'ye ekler (gerekirse CG'yi oluşturur).

  • Tablo zaten bir CG'deyse SelectDB tabloyu mevcut CG'den kaldırır ve belirtilen CG'ye ekler (gerekirse CG'yi oluşturur).

Bir tablodan colocation özelliğini kaldırmak için:

ALTER TABLE tbl SET ("colocate_with" = "");

Colocation tablosu silme

DROP TABLE çalıştırdığınızda tablo geri dönüşüm kutusuna taşınır ve kalıcı olarak silinmeden önce bir gün boyunca orada kalır. Bir CG içindeki son tablo kalıcı olarak silindikten sonra CG otomatik olarak kaldırılır.

Şema değişikliklerine ilişkin kısıtlamalar

Bir colocation tablosuna bölüm eklerken (ADD PARTITION) veya çoğaltma sayısını değiştirirken SelectDB değişikliği CGS'e göre doğrular. Değişiklik CGS kısıtlamalarını ihlal ederse SelectDB değişikliği reddeder.

Gelişmiş yapılandırma

FE yapılandırma öğeleri

Aşağıdaki frontend (FE) yapılandırma öğeleri colocation join davranışını kontrol eder. disable_colocate_relocate ve disable_colocate_balance değerlerini ADMIN SET CONFIG kullanarak dinamik şekilde değiştirebilirsiniz. Mevcut değerleri görüntülemek veya yapılandırma söz dizimi hakkında bilgi edinmek için HELP ADMIN SHOW CONFIG; ve HELP ADMIN SET CONFIG; çalıştırın.

Yapılandırma öğesi Varsayılan Açıklama
disable_colocate_relocate false Otomatik colocation çoğaltma onarımını devre dışı bırakır. Yalnızca colocation tablolarını etkiler.
disable_colocate_balance false Otomatik colocation çoğaltma yeniden dengelemesini devre dışı bırakır. Yalnızca colocation tablolarını etkiler.
disable_colocate_join false Colocation join özelliğini tamamen devre dışı bırakır.
use_new_tablet_scheduler true Yeni çoğaltma zamanlama mantığını etkinleştirir.

HTTP RESTful API

SelectDB, CG'leri görüntülemek ve yönetmek için HTTP RESTful API uç noktalarını sunar. Tüm uç noktalar FE düğümleri tarafından fe_host:fe_http_port adresinde sunulur ve admin rolü gerektirir.

Tüm colocation bilgilerini görüntüleme:

GET /api/colocate

Colocation bilgilerini JSON biçiminde döndürür:

{
    "msg": "success",
    "code": 0,
    "data": {
        "infos": [
            ["10003.12002", "10003_group1", "10037, 10043", "1", "1", "int(11)", "true"]
        ],
        "unstableGroupIds": [],
        "allGroupIds": [{"dbId": 10003, "grpId": 12002}]
    },
    "count": 0
}

Bir CG'yi Stable olarak işaretleme:

DELETE /api/colocate/group_stable?db_id=10005&group_id=10008

Return value: 200

Bir CG'yi Unstable olarak işaretleme:

POST /api/colocate/group_stable?db_id=10005&group_id=10008

Return value: 200

Paket dağıtımını manuel yapılandırma:

POST /api/colocate/bucketseq?db_id=10005&group_id=10008

Body:
[[10004],[10003],[10002],[10003],[10002],[10003],[10003],[10003],[10003],[10002]]

Return value: 200

İstek gövdesi, her elemanın o paket indeksi için BE düğüm ID'lerini listelediği iç içe geçmiş bir dizidir.

Önemli

bucketseq uç noktasını çağırmadan önce disable_colocate_relocate ve disable_colocate_balance değerlerinin ikisini de true olarak ayarlayın. Aksi takdirde sistemin otomatik onarım ve yeniden dengeleme işlemleri manuel yapılandırmanızı geçersiz kılar.

Çoğaltma dengeleme ve onarım

Çoğaltma onarımı nasıl çalışır

Colocation çoğaltmaları belirli BE düğümlerine sabitlenir. Bir BE düğümü çöker veya hizmet dışı bırakılırsa SelectDB yedek olarak en az yükte olan uygun BE düğümünü seçer ve etkilenen tüm tabletleri onarmaya başlar. Bu geçiş sırasında CG Unstable olarak işaretlenir.

Çoğaltma yeniden dengeleme nasıl çalışır

Normal tablolar için SelectDB çoğaltmaları tek tek dengeler; her çoğaltma için bağımsız şekilde uygun bir BE bulur. Colocation tablolarında ise çoğaltmalar paket düzeyinde dengelenir: birlikte konumlandırma garantisi korunması için bir paketteki tüm çoğaltmalar birlikte taşınır.

Dengeleme algoritması paket sıralamasını gerçek veri boyutuna göre değil çoğaltma sayısına göre BE düğümlerine dağıtır.

Geçerli dengeleme algoritması, BE düğümlerinin farklı disk kapasitelerine, disk sayılarına veya disk türlerine (SSD ile HDD) sahip olduğu heterojen dağıtımlarda yükü eşit şekilde dağıtmayabilir. Bu tür ortamlarda küçük kapasiteli ve büyük kapasiteli düğümler aynı sayıda çoğaltma tutabilir.

Bir CG Unstable hale gelirse ve otomatik yeniden dengelemenin sorguları tekrar tekrar bozmasını önlemek isterseniz disable_colocate_balance değerini true olarak ayarlayın. Yeniden dengelemeye izin vermeye hazır olduğunuzda değeri tekrar false olarak ayarlayın.