AnalyticDB for PostgreSQL mendistribusikan data tabel ke seluruh compute node berdasarkan skema distribusi yang Anda pilih saat membuat tabel. Skema dan kunci distribusi yang Anda pilih secara langsung memengaruhi performa kueri, keseimbangan data, serta efisiensi operasi join di seluruh kluster.
Skema distribusi
AnalyticDB for PostgreSQL mendukung tiga skema distribusi:
CREATE TABLE <table_name> (...)
[ DISTRIBUTED BY (<column> [,..] ) | DISTRIBUTED RANDOMLY | DISTRIBUTED REPLICATED ]V4.3 hanya mendukung distribusi hash dan distribusi acak. Distribusi replikasi diperkenalkan pada V6.0.
| Scheme | Syntax | Cara kerja | Kapan digunakan |
|---|---|---|---|
| Hash distribution (default) | DISTRIBUTED BY (column, [...]) | Menetapkan setiap baris ke compute node berdasarkan nilai hash dari kolom distribusi. Baris dengan nilai hash yang sama akan ditempatkan di node yang sama. Jika klausa DISTRIBUTED tidak ditentukan, tabel menggunakan primary key-nya sebagai kunci distribusi. Jika tidak ada kunci yang sesuai, sistem akan menggunakan distribusi acak. | Gunakan untuk sebagian besar tabel. Memungkinkan collocated join dan filtering di compute node ketika kueri menggunakan kunci distribusi. |
| Random distribution | DISTRIBUTED RANDOMLY | Mendistribusikan baris secara merata ke semua compute node menggunakan algoritma round-robin. Baris dengan nilai hash yang sama mungkin ditempatkan di node yang berbeda. | Gunakan hanya jika tidak ada kolom yang cocok untuk distribusi hash. Tidak mendukung collocated join atau filtering di compute node. |
| Replicated distribution | DISTRIBUTED REPLICATED | Menyimpan salinan lengkap tabel di setiap compute node. | Gunakan untuk tabel lookup kecil yang sering di-join dengan tabel besar. Meningkatkan performa join. |
Contoh:
-- Hash distribution
CREATE TABLE products (
name varchar(40),
prod_id integer,
supplier_id integer
) DISTRIBUTED BY (prod_id);
-- Random distribution
CREATE TABLE random_stuff (
things text,
doodads text,
etc text
) DISTRIBUTED RANDOMLY;
-- Replicated distribution
CREATE TABLE replicated_stuff (
things text,
doodads text,
etc text
) DISTRIBUTED REPLICATED;Cara distribusi hash memengaruhi perutean kueri
Ketika sebuah kueri melakukan filter berdasarkan kunci distribusi, AnalyticDB for PostgreSQL hanya mengarahkan kueri tersebut ke compute node yang menyimpan baris yang sesuai. Sebagai contoh, kueri berikut hanya dikirim ke node yang berisi prod_id = 101, bukan memindai semua node:
SELECT * FROM products WHERE prod_id = 101;Pilih kunci distribusi
Ikuti langkah-langkah berikut secara berurutan untuk memilih kunci distribusi yang efektif dalam distribusi hash:
Langkah 1: Pilih kolom dengan data yang terdistribusi merata.
Distribusi data yang tidak merata menyebabkan kesenjangan data—beberapa compute node berakhir dengan jauh lebih banyak baris daripada yang lain, sehingga meningkatkan beban mereka dan memperlambat kueri. Hindari kolom Boolean, waktu, dan tanggal yang biasanya memiliki kardinalitas rendah dan menghasilkan distribusi miring.
Langkah 2: Pilih kolom yang sering digunakan dalam kondisi join.
Ketika kunci gabungan (join key) sesuai dengan kunci distribusi, AnalyticDB for PostgreSQL melakukan collocated join: setiap compute node hanya melakukan join terhadap datanya sendiri tanpa perpindahan data antar-node.
Jika kunci gabungan berbeda dari kunci distribusi, mesin kueri harus melakukan redistribute motion atau broadcast motion sebelum join—keduanya menimbulkan overhead jaringan yang lebih besar dibandingkan collocated join.
![]()
![]()
![]()
Langkah 3: Pilih kolom yang sering digunakan sebagai filter kueri.
Filter berdasarkan kunci distribusi memungkinkan AnalyticDB for PostgreSQL melewati compute node yang tidak menyimpan baris relevan, sehingga mengurangi jumlah data yang dipindai per kueri.
Langkah 4: Lebih baik gunakan kunci unik.
Kunci unik—seperti primary key—memaksimalkan kardinalitas dan memastikan baris tersebar merata di seluruh node. Jika tabel Anda memiliki primary key, gunakan itu sebagai titik awal.
Langkah 5: Pertimbangkan kunci distribusi komposit.
Jika tidak ada satu kolom pun yang memenuhi kriteria di atas, gabungkan dua atau lebih kolom sebagai kunci distribusi:
CREATE TABLE t1 (c1 int, c2 int) DISTRIBUTED BY (c1, c2);Batasan pada kunci distribusi
Kolom kunci distribusi tidak dapat diperbarui. Untuk mengubah distribusi, gunakan
ALTER TABLE ... SET DISTRIBUTED BY.Kunci distribusi harus merupakan bagian dari primary key atau kunci unik. Contoh berikut gagal karena
c2(kunci distribusi) tidak termasuk dalam primary keyc1:CREATE TABLE t1 (c1 int, c2 int, PRIMARY KEY (c1)) DISTRIBUTED BY (c2); -- ERROR: PRIMARY KEY and DISTRIBUTED BY definitions incompatibleKolom bertipe data geometry dan tipe data kustom tidak dapat digunakan sebagai kunci distribusi.
Memecahkan masalah kesenjangan data
Kesenjangan data terjadi ketika satu atau beberapa compute node menyimpan jumlah baris yang jauh lebih banyak daripada yang lain. Penyebab umumnya adalah pemilihan kolom dengan kardinalitas rendah—seperti flag status atau kolom tanggal di mana banyak baris memiliki nilai yang sama. Semua baris dengan nilai tersebut akan menghasilkan hash ke node yang sama, sehingga membebani node tersebut sementara node lain tetap kurang dimanfaatkan.
Untuk mendeteksi kesenjangan data, lakukan kueri jumlah baris per compute node:
SELECT gp_segment_id, count(1)
FROM t1
GROUP BY 1
ORDER BY 2 DESC;
gp_segment_id | count
---------------+--------
2 | 131191
0 | 72
1 | 68
(3 rows)Output di atas menunjukkan kesenjangan parah: node 2 menyimpan hampir seluruh data.
Untuk memperbaiki kesenjangan data, ubah kunci distribusi ke kolom dengan nilai yang lebih merata:
ALTER TABLE t1 SET DISTRIBUTED BY (c2);Setelah redistribusi, data akan tersebar merata di seluruh compute node.