全部产品
Search
文档中心

Hologres:Kolom Tergenerasi (Beta)

更新时间:Nov 10, 2025

Kolom tergenerasi adalah kolom khusus yang dihitung berdasarkan kolom lain. Kolom ini terbagi menjadi dua jenis: kolom tergenerasi yang disimpan dan kolom tergenerasi virtual. Mulai Hologres V3.1, kolom tergenerasi yang disimpan didukung, yang secara otomatis dihitung saat data ditulis atau diperbarui serta memerlukan ruang penyimpanan. Kolom tergenerasi virtual belum didukung. Topik ini menjelaskan cara menggunakan kolom tergenerasi yang disimpan di Hologres.

Skenario

  • Perhitungan otomatis bidang yang diperlukan: Menghilangkan kebutuhan untuk memproses logika perhitungan secara manual.

  • Konsistensi data: Mencegah ketidaksesuaian akibat kesalahan manusia atau masalah logika kode.

  • Optimasi kinerja kueri: Untuk skenario kueri frekuensi tinggi, membaca kolom tergenerasi yang disimpan setara dengan membaca kolom biasa.

  • Penyederhanaan logika bisnis: Mengurangi kompleksitas SQL untuk operasi transformasi data umum yang tetap.

Penggunaan kolom tergenerasi yang tepat sesuai kebutuhan bisnis Anda dapat meningkatkan efisiensi pengembangan secara signifikan dan memastikan keandalan data.

Sintaksis

Gunakan klausa GENERATED ALWAYS AS untuk mendeklarasikan kolom tergenerasi, serta kata kunci STORED untuk menentukan kolom tergenerasi yang disimpan.

  • Buat tabel yang berisi kolom tergenerasi.

    CREATE TABLE generated_col_t (
        [...,]
        col1 INT,
        col2 INT GENERATED ALWAYS AS (col1 + 1) STORED
    );
  • Buat tabel partisi logis yang berisi kolom tergenerasi, dan gunakan kolom tergenerasi sebagai kunci partisi.

    CREATE TABLE generated_col_logical_part (
        a TEXT,
        b INT,
        ts TIMESTAMP NOT NULL,
        d TIMESTAMP GENERATED ALWAYS AS (date_trunc('day', ts)) STORED NOT NULL
    )
    LOGICAL PARTITION BY LIST(d);

Perhatian

  • CREATE TABLE

    • Saat mendefinisikan kolom tergenerasi, hanya fungsi IMMUTABLE atau ekspresi yang didukung. Fungsi non-IMMUTABLE seperti CURRENT_DATE dan RANDOM tidak didukung.

    • Saat mendefinisikan kolom tergenerasi, ekspresi tidak dapat merujuk ke kolom tergenerasi lainnya. Anda juga tidak dapat mendefinisikan kata kunci default untuk kolom tergenerasi.

    • Saat membuat tabel partisi, kunci partisi dari tabel partisi logis dapat diatur sebagai kolom tergenerasi, tetapi kunci partisi dari tabel partisi fisik tidak dapat diatur sebagai kolom tergenerasi. Kolom biasa dalam tabel partisi dapat diatur sebagai kolom tergenerasi.

    • Saat membuat tabel asing menggunakan CREATE FOREIGN TABLE, kolom tergenerasi tidak didukung.

    • Kolom tergenerasi dapat diatur sebagai berbagai indeks Hologres, termasuk kunci utama, kunci distribusi, kunci segmen, indeks terkluster, indeks bitmap, dan kolom berkode kamus.

  • ALTER TABLE

    • Anda tidak dapat menambahkan kolom sebagai kolom tergenerasi.

    • Anda dapat menghapus kolom tergenerasi. Namun, sebelum kolom tergenerasi dihapus, penghapusan kolom yang dirujuknya tidak didukung.

    • Anda tidak dapat mengubah tipe data kolom tergenerasi atau tipe data kolom yang dirujuknya. Disarankan menggunakan fitur REBUILD untuk mencapai tujuan ini. Untuk informasi lebih lanjut, lihat REBUILD (Beta).

    • Anda dapat mengganti nama kolom tergenerasi.

  • DML/DQL

    • Saat menulis atau memperbarui data dalam tabel yang berisi kolom tergenerasi, Anda dapat mengabaikan kolom tergenerasi atau menggunakan kata kunci default untuk mereka. Anda tidak dapat menulis nilai langsung ke kolom tergenerasi.

    • Saat memperbarui data, jika kolom tergenerasi atau kolom yang dirujuknya adalah kunci distribusi, pembaruan kolom tersebut tidak didukung.

    • Saat memperbarui data menggunakan rencana tetap, jika kunci utama adalah kolom tergenerasi, pembaruan kolom yang dirujuk oleh kolom tergenerasi tidak didukung.

    • Saat melakukan pembaruan kolom parsial menggunakan rencana tetap, jika kolom tergenerasi merujuk beberapa kolom biasa, pembaruan hanya beberapa dari kolom tersebut tidak didukung.

    • Operasi lain pada tabel dengan kolom tergenerasi semuanya didukung, termasuk operasi baca dan tulis melalui mesin HQE, operasi baca dan tulis melalui rencana tetap, serta operasi seperti Copy.

  • Operasi lainnya

    • Saat menggunakan CREATE TABLE LIKE, tabel sumber dapat berisi kolom tergenerasi. Untuk mempertahankan properti kolom tergenerasi, Anda harus mengaktifkan parameter hg_experimental_enable_create_table_like_properties.

    • Saat menggunakan CREATE TABLE AS, tabel asli dengan kolom tergenerasi tidak didukung.

    • Untuk memodifikasi parameter tabel dengan kolom tergenerasi, gunakan sintaksis REBUILD (termasuk migrasi grup tabel). Untuk informasi lebih lanjut, lihat REBUILD (Beta). Penggunaan sintaksis HG_MOVE_TABLE_TO_TABLE_GROUP untuk migrasi grup tabel tidak didukung.

    • Untuk melakukan operasi INSERT OVERWRITE pada tabel yang berisi kolom tergenerasi, Anda harus menggunakan sintaksis INSERT OVERWRITE asli, yang didukung di Hologres V3.1 dan versi selanjutnya. Sintaksis hg_insert_overwrite asli tidak didukung. Untuk informasi lebih lanjut, lihat INSERT OVERWRITE.

Contoh

  1. Buat tabel dengan kolom tergenerasi.

    CREATE TABLE generated_col_t (
        id INT PRIMARY KEY,
        col1 INT,
        col2 INT GENERATED ALWAYS AS (col1 + 1) STORED
    );
  2. Impor data.

    • Anda dapat mengimpor data ke semua kolom non-tergenerasi. Contoh:

      INSERT INTO generated_col_t VALUES (1, 1);
      INSERT INTO generated_col_t(id, col1) VALUES (2, 2);

      Kueri SELECT * FROM generated_col_t; mengembalikan hasil berikut.

      id	col1	col2
      1	1	2
      2	2	3
    • Anda dapat menggunakan kata kunci default untuk kolom tergenerasi saat mengimpor data. Contohnya:

      INSERT INTO generated_col_t VALUES (3, 3, default);
      INSERT INTO generated_col_t(id, col1, col2) VALUES (4, 4, default);

      Kueri SELECT * FROM generated_col_t; mengembalikan hasil berikut.

      id	col1	col2
      4	4	5
      2	2	3
      3	3	4
      1	1	2
    • Tidak didukung: Impor data langsung ke kolom tergenerasi. Contoh:

      INSERT INTO generated_col_t VALUES (5, 5, 6);
      INSERT INTO generated_col_t(id, col1, col2) VALUES (6, 6, 7);

      Hasil berikut dikembalikan.

      a1 - 副本

  3. Perbarui data.

    • Anda dapat memperbarui kolom non-tergenerasi. Contoh:

      UPDATE generated_col_t SET col1 = 2 WHERE id = 1;

      Kueri SELECT * FROM generated_col_t; mengembalikan hasil berikut.

      id	col1	col2
      2	2	3
      3	3	4
      4	4	5
      1	2	3     -- Baris ini telah berubah 
    • Anda dapat menggunakan kata kunci default untuk kolom tergenerasi saat memperbarui data. Contohnya:

      UPDATE generated_col_t SET col1 = 3, col2 = default WHERE id = 2;

      Kueri SELECT * FROM generated_col_t; mengembalikan hasil berikut.

      id	col1	col2
      3	3	4
      2	3	4    -- Baris ini telah berubah
      4	4	5
      1	2	3
    • Tidak didukung: Perbarui langsung kolom tergenerasi. Contoh:

      UPDATE generated_col_t SET col2 = 4 WHERE id = 3;

      Hasil berikut dikembalikan.

      777

Anda dapat menggunakan kueri SQL berikut untuk memeriksa apakah suatu fungsi IMMUTABLE untuk tipe parameter tertentu. Sebagai contoh, fungsi TO_CHAR adalah IMMUTABLE hanya ketika inputnya bertipe TIMESTAMP WITH TIME ZONE. Oleh karena itu, saat menggunakan fungsi ini dalam kolom tergenerasi, Anda harus memastikan bahwa tipe parameternya cocok.

SELECT n.nspname AS "Schema",
  p.proname AS "Name",
  pg_catalog.pg_get_function_result(p.oid) AS "Result data type",
  pg_catalog.pg_get_function_arguments(p.oid) AS "Argument data types",
 CASE p.prokind
  WHEN 'a' THEN 'agg'
  WHEN 'w' THEN 'window'
  WHEN 'p' THEN 'proc'
  ELSE 'func'
 END AS "Type",
 CASE
  WHEN p.provolatile = 'i' THEN 'immutable'
  WHEN p.provolatile = 's' THEN 'stable'
  WHEN p.provolatile = 'v' THEN 'volatile'
 END AS "Volatility",
 CASE
  WHEN p.proparallel = 'r' THEN 'restricted'
  WHEN p.proparallel = 's' THEN 'safe'
  WHEN p.proparallel = 'u' THEN 'unsafe'
 END AS "Parallel",
 pg_catalog.pg_get_userbyid(p.proowner) AS "Owner",
 CASE WHEN prosecdef THEN 'definer' ELSE 'invoker' END AS "Security",
 pg_catalog.array_to_string(p.proacl, E'\n') AS "Access privileges",
 l.lanname AS "Language",
 p.prosrc AS "Source code",
 pg_catalog.obj_description(p.oid, 'pg_proc') AS "Description"
FROM pg_catalog.pg_proc p
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
     LEFT JOIN pg_catalog.pg_language l ON l.oid = p.prolang
-- Target function
WHERE p.proname OPERATOR(pg_catalog.~) '^(TO_CHAR)$' COLLATE pg_catalog.default
  AND pg_catalog.pg_function_is_visible(p.oid)
ORDER BY 1, 2, 4;