Anda dapat mengonfigurasi kunci utama untuk sebuah tabel guna memastikan keunikan setiap catatan dalam tabel dan menjaga konsistensi data. Kunci utama mempermudah pengelolaan data. Karakteristik kunci utama di Hologres serupa dengan yang ada di database tradisional. Kunci utama secara unik mengidentifikasi setiap catatan dalam tabel. Oleh karena itu, nilai kolom yang digunakan sebagai kunci utama atau beberapa kolom yang membentuk kunci utama harus unik dan tidak boleh bernilai null. Beberapa kolom dapat ditentukan untuk membentuk kunci utama. Topik ini menjelaskan cara mengonfigurasi kunci utama untuk sebuah tabel di Hologres.
Ikhtisar
Hologres secara otomatis menyimpan file indeks kunci utama di lapisan bawah. File indeks ini menggunakan mode penyimpanan berorientasi baris untuk memberikan layanan key-value berkecepatan tinggi. Key menunjukkan kunci utama dari sebuah tabel, sedangkan value menunjukkan pengenal baris (RID) dan kunci kluster. RID awalnya dikenal sebagai unique_id. Nilai RID dibuat secara otomatis setiap kali Anda mengeksekusi pernyataan UPSERT, dan nilainya meningkat secara monoton. File indeks kunci utama membantu Anda menentukan konflik kunci utama dan menemukan file data. Jika Anda mengonfigurasi kunci utama untuk sebuah tabel, Anda dapat dengan cepat menemukan RID dan kunci kluster berdasarkan kunci utama di file indeks kunci utama, serta menemukan file data yang diperlukan berdasarkan RID dan kunci kluster.
Oleh karena itu, persyaratan berikut dapat dipenuhi di Hologres setelah Anda mengonfigurasi kunci utama:
Operasi UPSERT atau DELETE berperforma tinggi
Hologres memungkinkan Anda menulis data dalam mode Append Only, serta menulis atau memperbarui data dalam seluruh baris atau kolom tertentu dalam baris berdasarkan kunci utama. Saat Anda mengeksekusi pernyataan UPSERT untuk menyisipkan data ke dalam tabel, Hologres memperbarui tabel berdasarkan kunci utama tanpa perlu memindai seluruh tabel. Ini mencapai operasi UPSERT berperforma tinggi dan memastikan keunikan data.
Kueri berbasis kunci utama dengan permintaan per detik (QPS) tinggi
Setelah Anda mengonfigurasi kunci utama untuk sebuah tabel, Anda dapat dengan cepat menemukan seluruh baris data berdasarkan kunci utama saat melakukan kueri berbasis kunci utama. Ini meningkatkan performa kueri. Untuk informasi lebih lanjut, lihat Mode Penyimpanan Tabel: Penyimpanan Berorientasi Baris, Penyimpanan Berorientasi Kolom, dan Penyimpanan Hibrid Baris-Kolom. Jika tabel menggunakan mode penyimpanan berorientasi baris, kunci utama digunakan sebagai kunci kluster dan kunci distribusi secara default. Dalam hal ini, Anda dapat menemukan file data yang diperlukan berdasarkan kunci utama. Ini mencapai kueri titik dengan QPS tinggi dan latensi level milidetik, cocok untuk skenario aplikasi online seperti pengendalian risiko real-time dan rekomendasi real-time.
Catatan Penggunaan
Kami merekomendasikan agar Anda mengonfigurasi kolom informatif untuk membentuk kunci utama. Hindari menggunakan kolom tipe data SERIAL untuk membentuk kunci utama. Jika Anda menulis data tipe data SERIAL ke dalam tabel, kunci terkunci pada tingkat tabel akan diperoleh, yang mengakibatkan penurunan performa penulisan. Seiring pertumbuhan data, panjang data SERIAL mungkin melebihi batas atas.
Batasan
Nilai kolom yang digunakan sebagai kunci utama atau beberapa kolom yang membentuk kunci utama harus unik dan tidak boleh bernilai null. Anda dapat menentukan beberapa kolom untuk membentuk kunci utama untuk sebuah tabel hanya dalam satu pernyataan.
Anda dapat mengonfigurasi hingga 32 kolom untuk membentuk kunci utama.
Kolom dengan tipe data berikut tidak dapat dikonfigurasi sebagai kunci utama: FLOAT, DOUBLE, NUMERIC, ARRAY, JSON, JSONB, DATE, dan tipe data kompleks. Hologres V1.3.22 dan versi lebih baru memungkinkan Anda mengonfigurasi kolom tipe data DATE sebagai kunci utama. Untuk mengonfigurasi kolom tipe data DATE sebagai kunci utama, periksa versi instance Hologres Anda. Jika versi instance Hologres Anda lebih lama dari V1.3.22, tingkatkan instance Hologres Anda. Untuk informasi lebih lanjut, lihat Konfigurasi Instance dan Tingkatkan Instance.
Anda harus menentukan kunci utama untuk tabel berorientasi baris atau tabel hibrid baris-kolom. Kunci utama bersifat opsional untuk tabel berorientasi kolom.
Kunci utama tidak dapat dimodifikasi. Jika Anda ingin mengubah kunci utama sebuah tabel, Anda harus membuat tabel lain.
Contoh
Bagian ini memberikan contoh untuk Hologres V2.1 dan versi lebih baru. Jika versi instance Hologres Anda adalah V2.0 atau lebih lama, ubah pernyataan WITH (property = 'value') menjadi pernyataan CALL set_table_property. Untuk informasi lebih lanjut, lihat Ikhtisar.
Buat tabel berorientasi kolom dan konfigurasikan kolom sebagai kunci utama tabel.
Sintaksis yang didukung oleh Hologres V2.1 dan versi lebih baru:
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' );Sintaksis yang didukung oleh semua versi Hologres:
BEGIN; CREATE TABLE tbl_1 ( id bigint NOT NULL, name text NOT NULL, age bigint, class text, reg_timestamp timesatmptz, 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 dan konfigurasikan dua kolom untuk membentuk kunci utama tabel.
Sintaksis yang didukung oleh Hologres V2.1 dan versi lebih baru:
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' );Sintaksis yang didukung oleh semua versi Hologres:
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 dan konfigurasikan kunci utama untuk tabel.
Sintaksis yang didukung oleh Hologres V2.1 dan versi lebih baru:
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' );Sintaksis yang didukung oleh semua versi Hologres:
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 dan konfigurasikan kunci utama untuk tabel.
Sintaksis yang didukung oleh Hologres V2.1 dan versi lebih baru:
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;Sintaksis yang didukung oleh semua versi Hologres:
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;
Referensi
Untuk informasi lebih lanjut tentang cara mengonfigurasi properti tabel berdasarkan skenario kueri bisnis, lihat Panduan Pembuatan dan Penyetelan Tabel Berbasis Skenario.
Untuk informasi lebih lanjut tentang praktik terbaik untuk membuat tabel dan menanyakan pasangan kunci-nilai, lihat Kueri Pasangan Kunci-Nilai.
Untuk informasi lebih lanjut tentang pernyataan DDL untuk tabel internal Hologres, lihat topik-topik berikut: