全部产品
Search
文档中心

Hologres:Kolom waktu kejadian (kunci segmen)

更新时间:Jul 02, 2025

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_time dan 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.分段键技术原理

  1. 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.

  2. 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.

  3. File diurutkan berdasarkan kolom waktu kejadian. Kueri berdasarkan kolom ini mengikuti prinsip pencocokan paling kiri. Misalnya, jika Anda menentukan kolom a, b, dan c sebagai kolom waktu kejadian, kueri kolom a, b, dan c atau kolom a dan b dapat mengenai kolom waktu kejadian. Namun, kueri kolom a dan c hanya mengenai kolom a. Kueri kolom b dan c tidak 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 UPDATE setara dengan kombinasi operasi DELETE dan operasi INSERT. 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