全部产品
Search
文档中心

AnalyticDB:Menentukan distribusi tabel

更新时间:Jun 26, 2025

Topik ini menjelaskan cara memilih skema distribusi tabel di AnalyticDB for PostgreSQL.

Pemilihan skema distribusi tabel

AnalyticDB for PostgreSQL mendukung tiga skema distribusi tabel: distribusi hash, distribusi acak, dan distribusi direplikasi.

CREATE TABLE <table_name> (...) [ DISTRIBUTED BY (<column>  [,..] ) | DISTRIBUTED RANDOMLY | DISTRIBUTED REPLICATED ]
Catatan AnalyticDB for PostgreSQL V4.3 hanya mendukung distribusi hash dan distribusi acak. Distribusi direplikasi adalah fitur baru di AnalyticDB for PostgreSQL V6.0.

Pernyataan CREATE TABLE mendukung klausa berikut yang menentukan skema distribusi tabel:

Skema distribusiDeskripsi
Distribusi hash

DISTRIBUTED BY (column, [ ... ])

Baris data didistribusikan ke seluruh node komputasi berdasarkan nilai hash dari nilai kolom distribusi. Baris dengan nilai hash identik ditugaskan ke node komputasi yang sama. Untuk memastikan bahwa data didistribusikan secara merata di seluruh node komputasi, kami merekomendasikan agar Anda menggunakan kunci unik sebagai kunci distribusi, seperti kunci primer.

Skema distribusi tabel default dari AnalyticDB for PostgreSQL adalah distribusi hash. Jika Anda tidak menentukan klausa DISTRIBUTED saat membuat tabel, tabel tersebut akan menggunakan kunci primernya atau kunci pertama yang dianggap cocok oleh sistem sebagai kunci distribusi. Jika tidak ada kunci distribusi yang cocok yang teridentifikasi, sistem akan menggunakan distribusi acak.

Distribusi acak

DISTRIBUTED RANDOMLY

Baris data didistribusikan secara merata ke semua node komputasi dengan menggunakan algoritma round-robin. Baris dengan nilai hash identik mungkin ditugaskan ke node komputasi yang berbeda.

Kami merekomendasikan agar Anda menggunakan distribusi acak hanya jika tabel tidak mengandung kolom yang cocok untuk implementasi distribusi hash.

Distribusi direplikasi

DISTRIBUTED REPLICATED

Setiap node komputasi menyimpan salinan lengkap data tabel.

Jika tabel besar sering digabungkan dengan tabel kecil dalam kasus penggunaan Anda, Anda dapat menentukan distribusi direplikasi untuk tabel kecil untuk meningkatkan kinerja penggabungan.

Contoh:

  • Distribusi hash
    CREATE TABLE products (name varchar(40), 
                           prod_id integer,
                           supplier_id integer)
                           DISTRIBUTED BY (prod_id);                
  • Distribusi acak
    CREATE TABLE random_stuff (things text,
                               doodads text,
                               etc text)
                               DISTRIBUTED RANDOMLY;
  • Distribusi direplikasi
    CREATE TABLE replicated_stuff (things text,
                               doodads text,
                               etc text)
                               DISTRIBUTED REPLICATED;

Untuk query yang memfilter data berdasarkan sejumlah kecil nilai kunci distribusi, AnalyticDB for PostgreSQL hanya melibatkan node yang menyimpan baris dengan nilai-nilai tersebut. Sebagai contoh, jika Anda mengambil data dari tabel bernama products yang menggunakan prod_id sebagai kunci distribusi, query berikut dikirimkan hanya ke node komputasi yang berisi baris dengan nilai prod_id 101. Ini meningkatkan kinerja query Anda.

select * from products where prod_id = 101;

Pemilihan kunci distribusi

Untuk meningkatkan kinerja query, kami merekomendasikan agar Anda memilih kunci distribusi tabel berdasarkan aturan berikut:

  • Pilih kolom di mana data didistribusikan secara merata. Jika tidak, kemungkinan terjadi skew data, di mana beberapa node komputasi mengandung jauh lebih banyak data daripada yang lain. Hal ini menyebabkan beban yang lebih tinggi pada node komputasi dan waktu respons yang lebih lama. Oleh karena itu, kami merekomendasikan agar Anda tidak memilih kolom distribusi bertipe Boolean, waktu, atau tanggal.
  • Pilih kolom yang nilainya sering digunakan sebagai kondisi query. Ini memungkinkan AnalyticDB for PostgreSQL untuk menyaring node komputasi berdasarkan kunci distribusi sebelum mengirimkan permintaan query ke mereka.
  • Kunci distribusi dapat diatur ke lebih dari satu kolom. Contoh:
    create table t1(c1 int, c2 int) distributed by (c1,c2);
  • Kami merekomendasikan agar Anda tidak memilih distribusi acak, karena tidak mendukung penggabungan collocated atau penyaringan node komputasi.
  • Pilih kolom distribusi yang sering digunakan untuk menggabungkan tabel, sehingga penggabungan collocated dapat diimplementasikan, seperti yang ditunjukkan pada gambar berikut. Jika kunci penggabungan sama dengan kunci distribusi, penggabungan dapat diselesaikan dalam node komputasi yang relevan tanpa pergerakan data. Jika kunci distribusi berbeda dari kunci penggabungan dalam sebuah query, sistem harus melakukan redistribute motion atau broadcast motion sebelum dapat menggabungkan tabel. Baik penggabungan yang didistribusikan ulang maupun disiarkan menyebabkan overhead jaringan yang lebih berat daripada penggabungan collocated.
Collocated joinRedistributed joinBroadcast join

Batasan pada kunci distribusi

  • Kolom yang ditentukan sebagai kunci distribusi tabel tidak dapat diperbarui.
  • Kunci distribusi tabel harus menjadi bagian dari kunci primer atau kunci unik. Contoh:
    create table t1(c1 int, c2 int, primary key (c1)) distributed by (c2);
    Catatan Dalam contoh ini, kunci primer c1 tidak mencakup kunci distribusi c2. Akibatnya, eksekusi pernyataan gagal dan sistem melaporkan kesalahan berikut:
    ERROR: PRIMARY KEY and DISTRIBUTED BY definitions incompatible
  • Kolom bertipe Geometry atau tipe data khusus apa pun tidak dapat digunakan sebagai kunci distribusi tabel.

Pemecahan masalah untuk skew data

Jika Anda mengidentifikasi kinerja query yang buruk pada tabel tertentu, periksa apakah kunci distribusi yang tidak sesuai telah ditentukan. Contoh:

create table t1(c1 int, c2 int) distributed by (c1);

Eksekusi pernyataan berikut untuk memeriksa jumlah baris yang didistribusikan ke setiap node komputasi.

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)

Jika beberapa node komputasi menyimpan jauh lebih banyak baris daripada yang lain, skew data ada. Dalam hal ini, ubah kunci distribusi ke kolom yang memiliki data terdistribusi secara merata. Eksekusi pernyataan ALTER TABLE berikut untuk menentukan kolom c2 sebagai kunci distribusi:

alter table t1 set distributed by (c2);

Kunci distribusi tabel t1 diubah ke kolom c2. Setelah tabel t1 didistribusikan ulang berdasarkan kolom c2, datanya tidak lagi condong.