Primary key (PK) menegakkan keunikan dan integritas data untuk setiap baris dalam tabel. Di Hologres, primary key berfungsi serupa dengan database tradisional: secara unik mengidentifikasi setiap record, harus bernilai non-null, dan dapat mencakup beberapa kolom (composite key). Topik ini menjelaskan cara mengonfigurasi primary key untuk tabel Hologres.
Cara kerja primary key
Hologres secara otomatis memelihara file indeks primary key yang disimpan dalam format berorientasi baris, menyediakan pencarian key-value (KV) berkecepatan tinggi. Indeks ini memetakan primary key ke RID (Row Identifier) dan clustering key. RID dihasilkan secara otomatis dan meningkat secara monoton pada setiap operasi UPSERT. Indeks ini memungkinkan deteksi konflik primary key yang efisien serta lokalisasi file data yang cepat. Saat sebuah tabel memiliki PK yang didefinisikan, sistem menemukan RID dan clustering key melalui indeks PK, lalu menggunakan informasi tersebut untuk menentukan lokasi tepat file data target.
Mendefinisikan primary key di Hologres mengaktifkan kemampuan utama untuk skenario gudang data real-time:
-
Operasi UPSERT dan DELETE berkinerja tinggi.
Selain menulis hanya dengan append seperti biasa, Hologres mendukung pembaruan seluruh baris maupun sebagian kolom berkinerja tinggi melalui primary key. Saat melakukan pembaruan, sistem hanya perlu menemukan baris target berdasarkan PK alih-alih memindai seluruh tabel, sehingga mencapai UPSERT ber-throughput tinggi sambil tetap menjaga keunikan data.
-
Kueri titik berbasis primary key dengan QPS tinggi.
Seperti dijelaskan dalam Set up data orientation, ketika sebuah tabel memiliki PK yang didefinisikan, kueri yang difilter berdasarkan PK dapat dengan cepat menemukan seluruh baris, sehingga meningkatkan performa kueri secara signifikan. Hal ini terutama efektif untuk tabel berorientasi baris, di mana PK secara default berfungsi sebagai clustering key sekaligus distribution key. Pendekatan ini memungkinkan kueri titik dengan latensi milidetik pada QPS sangat tinggi, cocok untuk skenario layanan online seperti pengendalian risiko real-time dan mesin rekomendasi.
Praktik terbaik
Pilih kolom yang memiliki makna bisnis nyata sebagai primary key. Hindari penggunaan kolom bertipe SERIAL sebagai primary key karena SERIAL memperoleh lock tingkat tabel selama penulisan, yang menurunkan performa tulis. Selain itu, nilai SERIAL dapat mengalami overflow seiring pertumbuhan data.
Batasan
-
Kolom primary key harus unik dan NOT NULL. Anda hanya dapat mendefinisikan primary key dalam satu pernyataan, yang boleh mencakup beberapa kolom.
-
Hanya sintaks kendala PRIMARY KEY tingkat tabel yang didukung:
PRIMARY KEY (col1, col2, ...). Sintaks inline (tingkat kolom) seperticol_name type PRIMARY KEYtidak didukung. Sebagai contoh,id bigint PRIMARY KEYakan mengembalikan errorthe usage of PRIMARY KEY in the create table with ID columns is unsupported. GunakanPRIMARY KEY (id)sebagai gantinya. -
Primary key komposit mendukung maksimal 32 kolom.
-
Tipe data berikut tidak dapat digunakan sebagai kolom primary key: FLOAT, DOUBLE, NUMERIC, ARRAY, JSON, JSONB, DATE, dan tipe kompleks lainnya. Mulai dari Hologres V1.3.22, kolom DATE didukung sebagai primary key. Untuk menggunakan kolom DATE sebagai primary key, periksa versi instans Anda dan lakukan upgrade jika diperlukan. Untuk informasi lebih lanjut, lihat Instance details dan Upgrade an instance.
-
Tabel berorientasi baris dan tabel hibrida baris-kolom wajib memiliki primary key. Tabel berorientasi kolom tidak wajib memiliki primary key.
-
Primary key tidak dapat diubah setelah pembuatan tabel. Untuk mengganti primary key, Anda harus membuat ulang tabel tersebut.
Contoh
Contoh berikut menggunakan sintaks yang tersedia mulai dari Hologres V2.1. Jika instans Anda menjalankan V2.0 atau versi sebelumnya, ganti klausa WITH (property = 'value') dengan pernyataan CALL set_table_property. Untuk informasi lebih lanjut, lihat CREATE TABLE.
-
Buat tabel berorientasi kolom dengan satu primary key.
-
Sintaks yang didukung mulai dari V2.1:
CREATE TABLE tbl_1 ( id bigint NOT NULL, name text NOT NULL, age bigint NOT NULL, class text, reg_timestamp timestamptz NOT NULL, PRIMARY KEY (id) ) WITH ( orientation = 'column', distribution_key = 'id', clustering_key = 'age', event_time_column = 'reg_timestamp', bitmap_columns = 'name,class', dictionary_encoding_columns = 'class:auto' ); -
Sintaks yang didukung di semua versi:
BEGIN; CREATE TABLE tbl_1 ( id bigint NOT NULL, name text NOT NULL, age bigint, class text, reg_timestamp timestamptz, PRIMARY KEY (id) ); CALL set_table_property('tbl_1', 'orientation', 'column'); CALL set_table_property('tbl_1', 'distribution_key', 'id'); CALL set_table_property('tbl_1', 'clustering_key', 'age'); CALL set_table_property('tbl_1', 'event_time_column', 'reg_timestamp'); CALL set_table_property('tbl_1', 'bitmap_columns', 'name,class'); CALL set_table_property('tbl_1', 'dictionary_encoding_columns', 'class:auto'); COMMIT;
-
-
Buat tabel berorientasi kolom dengan primary key komposit (dua kolom).
-
Sintaks yang didukung mulai dari V2.1:
CREATE TABLE tbl_1 ( id bigint NOT NULL, name text NOT NULL, age bigint NOT NULL, class text NOT NULL, reg_timestamp timestamptz NOT NULL, PRIMARY KEY (id,age) ) WITH ( orientation = 'column', distribution_key = 'id', clustering_key = 'age', event_time_column = 'reg_timestamp', bitmap_columns = 'name,class', dictionary_encoding_columns = 'class:auto' ); -
Sintaks yang didukung di semua versi:
BEGIN; CREATE TABLE tbl_2 ( id bigint NOT NULL, name text NOT NULL, age bigint NOT NULL, class text NOT NULL, reg_timestamp timestamptz NOT NULL, PRIMARY KEY (id,age) ); CALL set_table_property('tbl_2', 'orientation', 'column'); CALL set_table_property('tbl_2', 'distribution_key', 'id'); CALL set_table_property('tbl_2', 'clustering_key', 'age'); CALL set_table_property('tbl_2', 'event_time_column', 'reg_timestamp'); CALL set_table_property('tbl_2', 'bitmap_columns', 'name,class'); CALL set_table_property('tbl_2', 'dictionary_encoding_columns', 'class:auto'); COMMIT;
-
-
Buat tabel berorientasi baris dengan primary key.
-
Sintaks yang didukung mulai dari V2.1:
CREATE TABLE public.tbl_row ( id text NOT NULL, name text NOT NULL, class text, PRIMARY KEY (id) ) WITH ( orientation = 'row', distribution_key = 'id', clustering_key = 'id' ); -
Sintaks yang didukung di semua versi:
BEGIN; CREATE TABLE public.tbl_row ( id text NOT NULL, name text NOT NULL, class text , PRIMARY KEY (id) ); CALL set_table_property('public.tbl_row', 'orientation', 'row'); CALL set_table_property('public.tbl_row', 'clustering_key', 'id'); CALL set_table_property('public.tbl_row', 'distribution_key', 'id'); COMMIT;
-
-
Buat tabel partisi dengan primary key.
-
Sintaks yang didukung mulai dari V2.1:
BEGIN; CREATE TABLE public.tbl_parent( a text , b int, c timestamp, d text, ds text, PRIMARY KEY (ds,b) ) PARTITION BY LIST(ds) WITH ( orientation = 'column'); CREATE TABLE public.tbl_child_1 PARTITION OF public.tbl_parent FOR VALUES IN('20221207'); CREATE TABLE public.tbl_child_2 PARTITION OF public.tbl_parent FOR VALUES IN('20221208'); COMMIT; -
Sintaks yang didukung di semua versi:
BEGIN; CREATE TABLE public.tbl_parent( a text , b int, c timestamp, d text, ds text, PRIMARY KEY (ds,b) ) PARTITION BY LIST(ds); CALL set_table_property('public.tbl_parent', 'orientation', 'column'); CREATE TABLE public.tbl_child_1 PARTITION OF public.tbl_parent FOR VALUES IN('20221207'); CREATE TABLE public.tbl_child_2 PARTITION OF public.tbl_parent FOR VALUES IN('20221208'); COMMIT;
-
Topik terkait
-
Untuk panduan memilih properti tabel berdasarkan pola kueri Anda, lihat Best practices for Hologres table properties.
-
Untuk praktik terbaik dalam desain tabel dan kueri pada skenario pencarian key/value, lihat Best practices for fast point queries.
-
Untuk pernyataan DDL terkait tabel internal Hologres, lihat: