Untuk melakukan operasi UPDATE berdasarkan kunci utama atau menjalankan kueri dengan kondisi filter rentang pada dataset besar, Anda dapat mengonfigurasi kolom waktu kejadian untuk tabel. Sistem mengurutkan file data berdasarkan kolom ini dan menggabungkan file yang relevan, mengurangi duplikasi serta menyaring file secara efisien. Ini meningkatkan performa kueri dan pemrosesan database. Topik ini menjelaskan cara mengonfigurasi kolom waktu kejadian untuk tabel di Hologres.
Ikhtisar
Di Hologres V0.9, properti segment_key secara default diganti dengan event_time_column. Namun, properti segment_key masih didukung di Hologres V0.9 dan versi sebelumnya.
Kolom waktu kejadian berlaku untuk skenario berikut:
Kueri dengan kondisi filter rentang, termasuk kondisi ekuivalen.
Operasi UPDATE berdasarkan kunci utama.
Kolom waktu kejadian harus ditentukan saat membuat tabel. Berikut adalah sintaks untuk mengonfigurasinya:
-- Sintaks yang didukung di Hologres V2.1 dan yang lebih baru
CREATE TABLE <table_name> (...) WITH (event_time_column = '[<columnName>[,...]]');
-- Sintaks yang didukung di semua versi Hologres
BEGIN;
CREATE TABLE <table_name> (...);
call set_table_property('<table_name>', 'event_time_column', '[<columnName> [,...]]');
COMMIT;Tabel berikut menjelaskan parameter dalam sintaks tersebut.
Parameter | Deskripsi |
table_name | Nama tabel yang ingin Anda konfigurasikan kolom waktu kejadiannya. |
columnName | Nama kolom yang ingin Anda konfigurasikan sebagai kolom waktu kejadian. |
Catatan penggunaan
Disarankan untuk mengonfigurasi kolom dengan data monotonik, seperti kolom timestamp, sebagai kolom waktu kejadian. Properti event_time_column cocok untuk kolom berkorelasi kuat dengan waktu, seperti log dan lalu lintas. Jika data dalam kolom tidak terurut setelah penggabungan file, efek penyaringan akan buruk.
Jika tabel tidak memiliki kolom dengan data monotonik, tambahkan kolom
update_timedan gunakan sebagai kolom waktu kejadian. Setiap operasi UPSERT akan menulis waktu saat ini ke kolom ini.Kueri berdasarkan kolom waktu kejadian mengikuti prinsip pencocokan paling kiri. Oleh karena itu, hindari menentukan beberapa kolom waktu kejadian untuk satu tabel. Sebagian besar kasus memerlukan hanya satu atau dua kolom waktu kejadian.
Batasan
Kolom waktu kejadian harus memenuhi batasan NOT NULL. Di Hologres V1.3.20 hingga V1.3.27, kolom dengan nilai null dapat digunakan sebagai kolom waktu kejadian. Mulai Hologres V1.3.28, kolom dengan nilai null tidak didukung karena dapat memengaruhi akurasi data. Jika diperlukan, tambahkan perintah SET berikut sebelum pernyataan CREATE TABLE:
set hg_experimental_enable_nullable_segment_key = true;Gunakan pernyataan SQL berikut untuk memeriksa apakah kolom waktu kejadian berisi nilai null:
WITH t_base AS ( SELECT * FROM hologres.hg_table_info WHERE collect_time::date = CURRENT_DATE ), t1 AS ( SELECT db_name, schema_name, table_name, jsonb_array_elements(table_meta::jsonb -> 'columns') cols FROM t_base ), t2 AS ( SELECT db_name, schema_name, table_name, cols ->> 'name' col_name FROM t1 WHERE cols -> 'nullable' = 'true'::jsonb ), t3 AS ( SELECT db_name, schema_name, table_name, regexp_replace(regexp_split_to_table(table_meta::jsonb ->> 'segment_key', ','), ':asc|:desc$', '') segment_key_col FROM t_base WHERE table_meta::jsonb -> 'segment_key' IS NOT NULL ) SELECT CURRENT_DATE, t3.db_name, t3.schema_name, t3.table_name, jsonb_build_object('nullable_segment_key_column', string_agg(t3.segment_key_col, ',')) as nullable_segment_key_column FROM t2, t3 WHERE t3.db_name = t2.db_name AND t3.schema_name = t2.schema_name AND t3.table_name = t2.table_name AND t2.col_name = t3.segment_key_col GROUP BY t3.db_name, t3.schema_name, t3.table_name;Properti event_time_column tidak dapat dimodifikasi. Jika ingin mengubahnya, buat tabel baru.
Properti event_time_column tidak dapat dikonfigurasi untuk tabel berorientasi baris.
Secara default, kolom pertama dengan tipe data TIMESTAMP atau TIMESTAMPTZ yang tidak bernilai null dalam tabel berorientasi kolom digunakan sebagai kolom waktu kejadian. Jika tidak ada, kolom pertama dengan tipe data DATE yang tidak bernilai null digunakan. Di versi sebelum Hologres V0.9, tidak ada kolom waktu kejadian yang ditentukan secara default.
Kolom dengan tipe data DECIMAL, NUMERIC, FLOAT, DOUBLE, ARRAY, JSON, JSONB, BIT, MONEY, dan tipe kompleks lainnya tidak didukung.
Cara kerjanya
Gambar berikut menunjukkan cara data dalam shard ditulis.
Data dalam shard ditulis ke tabel memori terlebih dahulu menggunakan mode append-only untuk efisiensi maksimal. Saat tabel memori penuh, Hologres secara asinkron mem-flush data ke file.
Untuk memaksimalkan efisiensi penulisan, data ditulis ke file dalam mode append-only, dan jumlah file bertambah seiring waktu. Hologres secara berkala menggabungkan file-file ini. Jika properti event_time_column dikonfigurasi, Hologres mengurutkan file berdasarkan rentang yang ditentukan oleh properti, memilih file dengan data berdekatan, dan menggabungkannya. Ini mengurangi tumpang tindih antar file dan menyaring file yang tidak diperlukan selama kueri, meningkatkan efisiensi kueri.
File diurutkan berdasarkan kolom waktu kejadian. Kueri berdasarkan kolom ini mengikuti prinsip pencocokan paling kiri. Misalnya, jika Anda menentukan kolom
a,b, dancsebagai kolom waktu kejadian, kueri koloma, b, dan catau koloma dan bdapat mengenai kolom waktu kejadian. Namun, kueri koloma dan chanya mengenai koloma. Kueri kolomb dan ctidak dapat mengenai kolom waktu kejadian.
Kolom waktu kejadian dapat mempercepat kueri data dalam skenario berikut:
Kueri dengan kondisi filter rentang, termasuk kondisi ekuivalen.
Jika kolom yang dikueri ditentukan sebagai kolom waktu kejadian, Hologres membandingkan statistik (min/maks) dari kolom dalam file berdasarkan kondisi filter rentang untuk menyaring file yang diperlukan, mempercepat proses kueri.
Operasi UPDATE berdasarkan kunci utama.
Di Hologres, operasi
UPDATEsetara dengan kombinasi operasiDELETEdan operasiINSERT. Setelah Anda mengonfigurasi kunci utama untuk sebuah tabel, jika Anda menjalankan pernyataan UPDATE atau pernyataan INSERT ON CONFLICT, Hologres menemukan nilai kolom waktu kejadian yang Anda tentukan untuk tabel tujuan berdasarkan kunci utama. Kemudian, Hologres menemukan file tempat data yang ada berada berdasarkan kolom waktu kejadian. Terakhir, Hologres menemukan data yang ada dan menandainya sebagai DELETE. Untuk informasi lebih lanjut tentang pernyataan UPDATE dan pernyataan INSERT ON CONFLICT, lihat UPDATE atau INSERT ON CONFLICT(UPSERT). Kolom waktu kejadian yang sesuai membantu menemukan dengan cepat file tempat data yang ada berada. Ini meningkatkan performa penulisan. Sejumlah besar file perlu dipindai selama kueri data dalam skenario berikut: (1) Tidak ada kolom waktu kejadian yang ditentukan untuk tabel berorientasi kolom. (2) Kolom waktu kejadian yang Anda konfigurasikan tidak sesuai. (3) Kolom waktu kejadian yang Anda konfigurasikan tidak berkorelasi kuat dengan waktu dan berisi data yang tidak terurut. Dalam hal ini, sejumlah besar operasi I/O dilakukan, dan beban CPU tinggi. Akibatnya, performa penulisan dan beban instance terpengaruh secara negatif.
Contoh
Mengonfigurasi satu kolom sebagai kolom waktu kejadian saat membuat tabel.
Sintaks yang didukung di Hologres V2.1 dan yang lebih baru:
CREATE TABLE tbl_segment_test ( a int NOT NULL, b timestamptz NOT NULL ) WITH ( event_time_column = 'b' ); INSERT INTO tbl_segment_test values (1,'2022-09-05 10:23:54+08'), (2,'2022-09-05 10:24:54+08'), (3,'2022-09-05 10:25:54+08'), (4,'2022-09-05 10:26:54+08'); EXPLAIN SELECT * FROM tbl_segment_test WHERE b > '2022-09-05 10:24:54+08';Sintaks yang didukung di semua versi Hologres:
BEGIN; CREATE TABLE tbl_segment_test ( a int NOT NULL, b timestamptz NOT NULL ); CALL set_table_property('tbl_segment_test', 'event_time_column', 'b'); COMMIT; INSERT INTO tbl_segment_test VALUES (1,'2022-09-05 10:23:54+08'), (2,'2022-09-05 10:24:54+08'), (3,'2022-09-05 10:25:54+08'), (4,'2022-09-05 10:26:54+08'); EXPLAIN SELECT * FROM tbl_segment_test WHERE b > '2022-09-05 10:24:54+08';
Periksa rencana eksekusi dengan menjalankan pernyataan EXPLAIN. Jika rencana eksekusi berisi
Segment Filter, kueri mengenai kolom waktu kejadian.
Mengonfigurasi beberapa kolom sebagai kolom waktu kejadian saat membuat tabel.
Sintaks yang didukung di Hologres V2.1 dan yang lebih baru:
CREATE TABLE tbl_segment_test_2 ( a int NOT NULL, b timestamptz NOT NULL ) WITH ( event_time_column = 'a,b' ); INSERT INTO tbl_segment_test_2 VALUES (1,'2022-09-05 10:23:54+08'), (2,'2022-09-05 10:24:54+08'), (3,'2022-09-05 10:25:54+08'), (4,'2022-09-05 10:26:54+08') ; -- Kueri tidak dapat mengenai kolom waktu kejadian. SELECT * FROM tbl_segment_test_2 WHERE b > '2022-09-05 10:24:54+08'; -- Kueri mengenai kolom waktu kejadian. SELECT * FROM tbl_segment_test_2 WHERE a = 3 and b > '2022-09-05 10:24:54+08'; SELECT * FROM tbl_segment_test_2 WHERE a > 3 and b < '2022-09-05 10:26:54+08'; SELECT * FROM tbl_segment_test_2 WHERE a > 3 and b > '2022-09-05 10:24:54+08';Sintaks yang didukung di semua versi Hologres:
BEGIN; CREATE TABLE tbl_segment_test_2 ( a int NOT NULL, b timestamptz NOT NULL ); CALL set_table_property('tbl_segment_test_2', 'event_time_column', 'a,b'); COMMIT; INSERT INTO tbl_segment_test_2 VALUES (1,'2022-09-05 10:23:54+08'), (2,'2022-09-05 10:24:54+08'), (3,'2022-09-05 10:25:54+08'), (4,'2022-09-05 10:26:54+08') ; -- Kueri tidak dapat mengenai kolom waktu kejadian. SELECT * FROM tbl_segment_test_2 WHERE b > '2022-09-05 10:24:54+08'; -- Kueri mengenai kolom waktu kejadian. SELECT * FROM tbl_segment_test_2 WHERE a = 3 and b > '2022-09-05 10:24:54+08'; SELECT * FROM tbl_segment_test_2 WHERE a > 3 and b < '2022-09-05 10:26:54+08'; SELECT * FROM tbl_segment_test_2 WHERE a > 3 and b > '2022-09-05 10:24:54+08';
Referensi
Untuk informasi lebih lanjut tentang konfigurasi properti tabel berdasarkan skenario kueri bisnis, lihat Panduan Pembuatan dan Penyetelan Tabel Spesifik Skenario.
Untuk informasi lebih lanjut tentang pernyataan DDL untuk tabel internal Hologres, lihat topik-topik berikut: