Untuk dataset berukuran besar yang sering menjalankan operasi UPDATE berdasarkan primary key atau kueri dengan kondisi range filter, pertimbangkan untuk menetapkan event time column (segment key). Sistem mengurutkan file data berdasarkan rentang event time column sebelum menggabungkannya, sehingga mengurangi tumpang tindih antarfile. Hal ini memungkinkan mesin kueri memangkas lebih banyak file dan meningkatkan efisiensi kueri. Konfigurasi event_time_column yang tepat dapat meningkatkan kecepatan kueri dan kinerja secara keseluruhan. Topik ini menjelaskan cara menetapkan properti event_time_column untuk tabel di Hologres.
Kolom event time
Properti event_time_column sebelumnya dikenal sebagai segment key. Mulai Hologres V0.9 dan versi selanjutnya, nama properti bawaannya adalah event_time_column, sedangkan segment key tetap dipertahankan demi kompatibilitas mundur.
Event time column terutama digunakan dalam skenario berikut:
-
Kueri yang mencakup
range filteratauequality condition. -
Operasi
UPDATEberdasarkanprimary key.
Untuk menetapkan properti event_time_column, Anda harus menentukannya saat membuat tabel. Gunakan sintaks berikut:
-- Sintaks yang didukung di Hologres V2.1 dan versi selanjutnya
CREATE TABLE <table_name> (...) WITH (event_time_column = '[<columnName>[,...]]');
-- Sintaks yang didukung di semua versi
BEGIN;
CREATE TABLE <table_name> (...);
call set_table_property('<table_name>', 'event_time_column', '[<columnName> [,...]]');
COMMIT;
Parameter:
|
Parameter |
Deskripsi |
|
table_name |
Nama tabel. |
|
columnName |
Kolom yang akan digunakan sebagai |
Rekomendasi
-
Event time columnpaling cocok untuk kolom dengan nilai yang bersifat monoton naik atau turun, seperti kolom timestamp. Kolom ini ideal untuk data berbasis waktu, misalnya log dan data traffic, karena konfigurasi yang tepat dapat meningkatkan kinerja secara signifikan. Jikaevent time columnsama sekali tidak terurut, file hasil penggabungan tidak akan memiliki rentang nilai yang berbeda, sehingga manfaat pemangkasan file menjadi hilang. -
Jika tabel tidak memiliki kolom yang jelas bersifat monoton naik atau turun, pertimbangkan untuk menambahkan kolom seperti
update_timedan menulis waktu saat ini ke kolom tersebut untuk setiap operasiUPSERT. -
Event time columnmengikutileftmost matching principle. Menetapkan beberapa kolom dapat membatasi pola kueri yang dipercepat. Oleh karena itu, kami merekomendasikan untuk menentukan tidak lebih dari dua kolom dalam kebanyakan kasus.
Batasan
-
Event time columnharus berupa satu kolom atau kombinasi kolom yang didefinisikan sebagaiNOT NULL. Anda boleh menghilangkan propertievent_time_column, tetapi tidak boleh menetapkannya ke kolom yang mengizinkan nilai null. Di Hologres V1.3.20 hingga V1.3.27, kolom nullable sempat didukung untuk propertievent_time_column. Mulai Hologres V1.3.28, dukungan ini dihentikan karenaevent time columnyang nullable dapat mengompromikan integritas data. Jika Anda memiliki kebutuhan bisnis yang kuat untuk menetapkan kolom nullable sebagaievent time column, Anda dapat menambahkan pernyataan berikut sebelum pernyataan SQL Anda:set hg_experimental_enable_nullable_segment_key = true;Anda dapat menggunakan pernyataan SQL berikut untuk memeriksa apakah database saat ini berisi
event time column(atausegment key) yang nullable: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; -
Anda tidak dapat mengubah properti
event_time_columnsetelah tabel dibuat. Untuk mengubahnya, Anda harus membuat ulang tabel tersebut. -
Anda tidak dapat menetapkan
event time columnuntukrow-oriented table. -
Untuk
column-oriented table, jika Anda tidak secara eksplisit menetapkanevent time column, Hologres secara bawaan menggunakan kolom pertama bertipe dataTIMESTAMPatauTIMESTAMPTZyang didefinisikan sebagaiNOT NULLsebagaievent time column. Jika tidak ada kolom semacam itu, kolom pertama bertipe dataDATEyang didefinisikan sebagaiNOT NULLakan digunakan. Di versi sebelum Hologres V0.9, tidak adaevent time columnbawaan yang ditetapkan. -
Anda tidak dapat menggunakan tipe data kompleks seperti
DECIMAL,NUMERIC,FLOAT,DOUBLE,ARRAY,JSON,JSONB,BIT,MONEY, atau tipe data kompleks lainnya untukevent time column.
Cara kerja
Gambar berikut menunjukkan proses penulisan data dalam satu shard:
-
Dalam satu
shard, data pertama kali ditulis kein-memory tabledalam mode append-only untuk memaksimalkan kinerja penulisan.In-memory tablememiliki ukuran tetap. Saatin-memory tablepenuh, sistem secara asinkron menyimpan datanya ke file. -
Untuk mengoptimalkan kinerja penulisan, data ditulis dalam mode append-only, yang menyebabkan jumlah file meningkat seiring waktu. Sistem secara berkala menggabungkan file-file ini di latar belakang. Jika Anda menetapkan
event time column(atausegment key), sistem mengurutkan file berdasarkan rentangevent time column, lalu menggabungkan file-file dengan rentang yang berdekatan. Proses ini mengurangi tumpang tindih antarfile, sehingga pengoptimal kueri dapat memangkas lebih banyak file dan meningkatkan efisiensi kueri. -
File diurutkan berdasarkan
event time column. Oleh karena itu,event time columnjuga mengikutileftmost matching principle. Misalnya, jika Anda menetapkan koloma,b, dancsebagaievent time column, kueri dapat memperoleh manfaat dari pengaturan ini jika kondisi filter-nya berada padaa,b,cataua,b. Jika kondisi filter berada padaa,c, hanya kolomayang mendapat manfaat. Jika kondisi filter berada padab,c, kueri tidak dapat memperoleh manfaat darievent time column.
Seperti dijelaskan, event time column dapat mempercepat skenario berikut:
-
Kueri yang mencakup
range filteratauequality condition.Jika kolom yang dikueri ditetapkan sebagai
event time column, Hologres membandingkan kondisi rentang dalam kueri dengan statistik tingkat file (min/maks) kolom tersebut. Hal ini memungkinkan Hologres untuk dengan cepat memangkas file yang tidak relevan dan mempercepat kueri. -
Operasi
UPDATEberdasarkanprimary key.Perintah
UPDATEdi Hologres diimplementasikan sebagai kombinasi perintahDELETEdanINSERT. Dalam skenario yang melibatkan UPDATE berbasis primary key atau INSERT ON CONFLICT (UPSERT), primary key pertama-tama digunakan untuk menemukan segment key dari data lama di tabel target. Segment key ini kemudian digunakan untuk menemukan file yang berisi data lama, lalu data tersebut akhirnya ditandai sebagaiDELETE. Jika segment key dikonfigurasi dengan tepat, file yang berisi data lama dapat ditemukan dengan cepat, sehingga meningkatkan kinerja penulisan. Sebaliknya, jika tabel berorientasi kolom tidak memiliki segment key yang dikonfigurasi, segment key dikonfigurasi dengan bidang yang tidak sesuai, atau bidang segment key tidak memiliki korelasi kuat dengan waktu selama penulisan data (misalnya, data sebagian besar tidak terurut), sejumlah besar file harus dipindai untuk menemukan data lama. Proses ini tidak hanya menyebabkan banyak operasi I/O, tetapi juga menghabiskan sumber daya CPU yang signifikan, yang berdampak negatif pada kinerja penulisan dan beban seluruh instans.
Contoh
-
Buat satu
event time columnsaat membuat tabel.-
Sintaks yang didukung di Hologres V2.1 dan versi selanjutnya:
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:
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';
Anda dapat memeriksa
execution plandengan menjalankan pernyataanEXPLAIN. JikaSegment Filtermuncul dalam rencana tersebut, berarti kueri menggunakanevent time column. Rencana berikut mencakupSegment Filter, yang menunjukkan bahwaevent time columnaktif.QUERY PLAN Gather (cost=0.00..1.10 rows=1 width=12) -> Exchange (Gather Exchange) (cost=0.00..1.10 rows=1 width=12) -> Decode (cost=0.00..1.10 rows=1 width=12) -> Index Scan using holo_index:[1] on tbl_segment_test (cost=0.00..1.00 rows=1 width=12) Segment Filter: (b > '2022-09-05 10:24:54+08'::timestamp with time zone) Optimizer: HQO version 1.3.0 -
-
Buat beberapa
event time columnsaat membuat tabel.-
Sintaks yang didukung di Hologres V2.1 dan versi selanjutnya:
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 mengenai event time column. SELECT * FROM tbl_segment_test_2 WHERE b > '2022-09-05 10:24:54+08'; -- Kueri mengenai event time column. 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:
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 mengenai event time column. SELECT * FROM tbl_segment_test_2 WHERE b > '2022-09-05 10:24:54+08'; -- Kueri mengenai event time column. 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';
-
Topik terkait
-
Untuk panduan memilih properti tabel yang tepat sesuai pola kueri Anda, lihat Panduan pembuatan dan penyetelan tabel berdasarkan skenario.
-
Untuk pernyataan DDL terkait tabel internal Hologres, lihat: