All Products
Search
Document Center

Hologres:BUAT TABEL PARTISI LOGIS

Last Updated:Sep 02, 2026

Tabel partisi logis menyediakan manajemen siklus hidup partisi otomatis: Hologres membuat partisi saat data tiba dan menghapusnya ketika partisi menjadi kosong. Tabel induk merupakan tabel fisik, sedangkan setiap partisi adalah konsep logis, bukan objek fisik terpisah.

Gunakan tabel partisi logis jika:

  • Dataset Anda besar dan berbasis deret waktu atau kategori (misalnya, log harian, aliran event, atau data penyewa).

  • Anda ingin Hologres mengelola pembuatan dan pembersihan partisi secara otomatis tanpa overhead DDL.

  • Anda memerlukan kedaluwarsa per partisi, tiering hot/cold, atau generasi Binlog selektif.

Pilih tabel partisi fisik jika Anda sering mengganti seluruh partisi dengan TRUNCATE atau INSERT OVERWRITE—operasi tersebut lebih cepat pada partisi fisik karena menghindari penghapusan skala besar.

Tabel partisi logis memerlukan Hologres 3.1 atau yang lebih baru.

Batasan

  • Hanya partisi LIST yang didukung. Partisi RANGE dan HASH tidak didukung.

  • Kunci partisi dapat mencakup satu atau dua kolom.

  • Tipe data kunci partisi yang didukung: INT, TEXT, VARCHAR, DATE, TIMESTAMP, dan TIMESTAMPTZ.

  • Kunci partisi harus NOT NULL.

  • Kunci partisi tabel partisi logis mendukung kolom terhasil.

  • Satu tabel partisi logis mendukung hingga 5.200 partisi. Satu database mendukung hingga 200.000 partisi logis secara total.

Batas impor batch

Skenario Ambang Batas Perilaku
Satu pekerjaan impor batch > 50 partisi Error: Bulkload partition count exceed limit, partition count is xxx, limit is xxx
Penulisan konkuren Fixed Plan (per tabel) > 30 partisi Dibatasi — Hologres menunggu beberapa detik, lalu mengirimkan secara otomatis
Penulisan konkuren Fixed Plan (per tabel) > 100 partisi Error: mem partition count exceed reject limit

Batas partisi belum dipersistensi (per node pekerja)

Partisi belum dipersistensi adalah partisi yang ditulis ke memori tetapi belum disimpan ke disk. Jumlahnya dihitung sebagai: partisi pengguna × jumlah shard × jumlah indeks per tabel. Jumlah shard mencakup shard replika.

Ambang Batas Perilaku
> 500 partisi belum dipersistensi Dibatasi — Hologres menunggu beberapa detik, lalu mengirimkan secara otomatis
> 5.000 partisi belum dipersistensi Error: mem partition count exceed reject limit

Catatan penggunaan

  • Granularitas partisi: Hindari partisi dengan kurang dari 100 juta baris. Partisi bergranularitas halus mengurangi manfaat akselerasi kueri dan meningkatkan risiko akumulasi file kecil. Misalnya, partisi berdasarkan hari masuk akal untuk beban kerja volume tinggi; partisi berdasarkan ID klien atau interval sub-jam biasanya terlalu halus.

  • Pola penulisan: Tulis data ke partisi secara berurutan. Hindari menulis ke banyak partisi secara bersamaan.

  • Kualitas data: Pastikan data masuk bersih. Data kotor—seperti timestamp yang tidak tepat tengah malam saat menggunakan partisi harian—dapat menyebabkan pertumbuhan partisi tak terduga.

  • Siklus hidup partisi: Jangan membuat atau menghapus partisi secara manual. Partisi hanya ada saat berisi data. Ketika semua data dalam partisi dihapus, Hologres menghapus partisi tersebut secara asinkron.

  • TRUNCATE dan Binlog: Perintah TRUNCATE tidak menghasilkan binlog. Untuk menonaktifkan pembuatan binlog pada sesi tertentu, jalankan SET hg_experimental_generate_binlog = off sebelum menjalankan TRUNCATE.

  • Perubahan properti tabel: Untuk mengubah properti tabel pada tabel partisi logis, gunakan sintaks REBUILD. Backend secara otomatis membagi tugas dan mengeksekusinya secara berurutan per partisi. Untuk operasi resharding (misalnya, memindahkan tabel ke Table Group berbeda), jangan gunakan prosedur tersimpan HG_MOVE_TABLE_TO_TABLE_GROUP. Lihat Panduan Operasi Table Group dan Jumlah Shard untuk pendekatan yang benar.

Buat tabel partisi logis

Sintaks

-- Buat tabel induk partisi logis
CREATE TABLE [IF NOT EXISTS] [<schema_name>.]<table_name> ([
  {
   <column_name> <column_type> [ <column_constraints>, [...]]
   | <table_constraints>
   [, ...]
  }
])
LOGICAL PARTITION BY LIST(<partition_column_1> [, <partition_column_2>])
[WITH(
  <property_name> = <property_value>
 [, ...]
)];
Partisi dibuat dan dihapus secara otomatis berdasarkan data. Jangan membuat atau menghapus partisi secara manual.

Parameter

Parameter Deskripsi
schema_name Schema yang berisi tabel. Abaikan jika tabel induk dan anak berada dalam schema yang sama.
table_name Nama tabel partisi induk.
column_name Nama kolom.
column_type Tipe data kolom.
column_constraints Batasan level kolom.
table_constraints Batasan level tabel.
partition_column Kunci partisi. Tentukan satu atau dua kolom.
property_name Nama properti tabel.
property_value Nilai yang diberikan untuk properti tabel.

Properti tabel

Properti ini diatur pada tabel induk dan berlaku untuk semua partisi. Karena tabel induk adalah tabel fisik dan partisi adalah konsep logis, Anda tidak dapat mengatur properti ini langsung pada partisi individual.

Properti Bawaan Nilai valid Catatan
partition_time_format Tidak ada Lihat Catatan Hanya diperlukan ketika kunci partisi bertipe TEXT. Didukung sejak Hologres V4.2. Nilai valid:
  • YYYYMMDDHH24: granularitas per jam, contohnya 2024112221.

  • YYYYMMDD: granularitas harian, contohnya 20241122.

  • YYYYMM: granularitas bulanan, contohnya 202411.

  • YYYYQ: granularitas kuartalan, contohnya 20241, 20242, 20243, 20244.

  • YYYY: granularitas tahunan, contohnya 2023, 2024.

  • YYYY-MM-DD-HH24: per jam dengan pembatas, contohnya 2024-11-22-21.

  • YYYY-MM-DD: harian dengan pembatas, contohnya 2024-11-22.

  • YYYY-MM: bulanan dengan pembatas, contohnya 2024-11.

  • YYYY-Q: kuartalan dengan pembatas, contohnya 2024-1.

Catatan

Atur properti ini sebelum partition_expiration_time dan partition_keep_hot_window dalam klausa WITH.

partition_expiration_time Tidak ada (tidak ada pembersihan otomatis) '30 day', '12 month', dll. Gunakan satuan waktu yang sama dengan kunci partisi Anda.
Catatan
  • Hanya kunci partisi kolom tunggal yang didukung.

  • Untuk kunci partisi bertipe waktu (DATE, TIMESTAMP, TIMESTAMPTZ), tidak diperlukan konfigurasi partition_time_format.

  • Hologres V4.2 dan yang lebih baru mendukung kunci partisi TEXT. Atur partition_time_format untuk menentukan cara nilai TEXT mengkodekan waktu.

partition_keep_hot_window Semua data tetap hot '30 day', '12 month', dll. Data di luar jendela ini dipindahkan ke penyimpanan dingin secara asinkron. Lihat Penyimpanan tiering data.
Catatan
  • Hanya kunci partisi kolom tunggal yang didukung.

  • Untuk kunci partisi bertipe waktu (DATE, TIMESTAMP, TIMESTAMPTZ), tidak diperlukan konfigurasi partition_time_format.

  • Hologres V4.2 dan yang lebih baru mendukung kunci partisi TEXT. Atur partition_time_format untuk menentukan cara nilai TEXT mengkodekan waktu.

partition_require_filter FALSE TRUE, FALSE Jika TRUE, kueri pada tabel induk harus menyertakan kondisi filter partisi. Kueri tanpa filter tersebut akan gagal.
binlog_level 'none' 'none', 'replica' Mengaktifkan atau menonaktifkan Binlog untuk tabel induk. Lihat Berlangganan binary logging Hologres.
binlog_ttl 2592000 (30 hari, dalam detik) Integer (detik) Waktu hidup (TTL) untuk data Binlog.
partition_generate_binlog_window Tidak ada (semua data menghasilkan Binlog) '3 day', '12 hour', dll. Hanya data dalam partisi yang dibuat dalam jendela tersebut yang menghasilkan Binlog. Hanya berlaku untuk tabel dengan kunci partisi tunggal berbasis waktu.
Properti lain (indeks, orientation, dll.) — — Tabel partisi logis mendukung distribution_key, clustering_key, orientation, time_to_live_in_seconds, dan properti standar lainnya. Lihat CREATE TABLE dan Panduan optimasi pembuatan tabel berbasis skenario. Properti manajemen partisi dinamis dari tabel partisi fisik tidak didukung. Lihat Manajemen partisi dinamis.

Properti partisi

Properti ini berlaku untuk partisi individual. Ubah properti tersebut dengan ALTER LOGICAL PARTITION TABLE.

Properti Bawaan Nilai valid Perilaku
keep_alive FALSE TRUE, FALSE Jika TRUE, partisi tidak pernah dibersihkan secara otomatis, bahkan jika partition_expiration_time diatur pada tabel induk.
storage_mode Tidak diatur (mengikuti partition_keep_hot_window induk) 'hot', 'cold' Mengesampingkan partition_keep_hot_window tabel induk untuk partisi ini.
generate_binlog Tidak diatur (mengikuti partition_generate_binlog_window tabel induk) 'on', 'off' Mengesampingkan partition_generate_binlog_window tabel induk untuk partisi ini.

Contoh

Contoh 1: Kolom reguler sebagai kunci partisi

CREATE TABLE public.hologres_logical_parent_1 (
    a TEXT,
    b INT,
    c TIMESTAMP,
    ds DATE NOT NULL,
    PRIMARY KEY (b, ds))
LOGICAL PARTITION BY LIST (ds)
WITH (
    orientation = 'column',
    distribution_key = 'b',
    partition_expiration_time = '30 day',
    partition_keep_hot_window = '15 day',
    partition_require_filter = TRUE,
    binlog_level = 'replica',
    partition_generate_binlog_window = '3 day'
);

Contoh 2: Kolom terhasil sebagai kunci partisi

Kunci partisi ds diturunkan dari kolom c menggunakan date_trunc. Ini secara otomatis menetapkan setiap baris ke partisi harian yang sesuai tanpa memerlukan pemanggil untuk menghitung nilai partisi. Untuk informasi lebih lanjut, lihat Kolom terhasil Hologres.

CREATE TABLE public.hologres_logical_parent_2 (
    a TEXT,
    b INT,
    c TIMESTAMP,
    ds TIMESTAMP GENERATED ALWAYS AS (date_trunc('day', c)) STORED NOT NULL,
    PRIMARY KEY (b, ds))
LOGICAL PARTITION BY LIST (ds)
WITH (
    orientation = 'column',
    distribution_key = 'b',
    partition_expiration_time = '30 day',
    partition_keep_hot_window = '15 day',
    partition_require_filter = TRUE,
    binlog_level = 'replica',
    partition_generate_binlog_window = '3 day'
);

Contoh 3: Dua kolom sebagai kunci partisi

CREATE TABLE public.hologres_logical_parent_3 (
    a TEXT,
    b INT,
    yy TEXT NOT NULL,
    mm TEXT NOT NULL)
LOGICAL PARTITION BY LIST (yy, mm)
WITH (
    orientation = 'column',
    distribution_key = 'b',
    partition_require_filter = TRUE
);

Kelola data

Granularitas penguncian

Operasi Jenis kunci Catatan
Impor batch atau pembaruan untuk partisi tertentu; INSERT OVERWRITE; TRUNCATE untuk partisi tertentu Kunci partisi Saat dieksekusi menggunakan sumber daya instans lokal atau kelompok komputasi: kunci partisi. Partisi lain tidak terpengaruh. Saat dieksekusi menggunakan sumber daya Serverless: kunci tabel sebelum V4.2; kunci partisi mulai V4.2.
Impor batch atau pembaruan tanpa menentukan partisi; TRUNCATE tanpa menentukan partisi; DELETE apa pun Kunci tabel Operasi manajemen data lainnya menunggu hingga kunci dilepas.
Penulisan, pembaruan, atau penghapusan Fixed Plan Kunci baris Bertentangan dengan impor batch, pembaruan, atau penghapusan. Tidak bertentangan dengan operasi Fixed Plan lainnya.

Pilih metode pembersihan data

Metode Kapan digunakan Jenis kunci Catatan
DELETE Menghapus baris yang sesuai kondisi tertentu Kunci tabel Lebih lambat untuk set data besar
TRUNCATE (level partisi) Menghapus semua data dalam satu atau beberapa partisi tertentu Kunci partisi Lebih cepat daripada DELETE; tidak menghasilkan Binlog; tidak didukung dalam DML kelompok komputasi — gunakan kelompok komputasi leader
TRUNCATE (level tabel) Menghapus semua data dalam tabel induk Kunci tabel Tercepat untuk pembersihan penuh; tidak menghasilkan Binlog
INSERT OVERWRITE Mengganti semua data dalam partisi dengan data baru Kunci partisi (per partisi) Sinkron; jika beberapa partisi ditentukan, diproses secara paralel — bagi menjadi tugas berurutan untuk mengurangi penggunaan CPU dan memori

Tulis ke tabel induk

Operasi penulisan, pembaruan, dan pembersihan data bekerja sama seperti pada tabel standar. Hologres secara otomatis membuat atau menghapus partisi berdasarkan data.

-- Tulis data; Hologres membuat partisi secara otomatis
INSERT INTO public.hologres_logical_parent_2
VALUES
    ('a', 1, '2025-03-16 10:00:00'),
    ('b', 2, '2025-03-17 11:00:00'),
    ('c', 3, '2025-03-18 12:00:00'),
    ('d', 4, '2025-03-19 13:00:00'),
    ('e', 5, '2025-03-20 14:00:00');
-- Hapus baris (kunci tabel)
DELETE FROM public.hologres_logical_parent_2 WHERE ds = '2025-03-20';
-- Truncate seluruh tabel induk (tidak menghasilkan Binlog)
SET hg_experimental_generate_binlog = off;
TRUNCATE public.hologres_logical_parent_2;

Tulis ke partisi tertentu

-- Impor ke partisi tertentu
INSERT INTO public.hologres_logical_parent_1
PARTITION (ds = '2025-03-16')
VALUES
    ('a', 1, '2025-03-16 10:00:00', '2025-03-16');
-- Baris yang tidak sesuai partisi yang ditentukan diabaikan diam-diam (tanpa error)
INSERT INTO public.hologres_logical_parent_1
PARTITION (ds = '2025-03-16')
VALUES
    ('a', 1, '2025-03-16 10:00:00', '2025-03-16'),
    ('b', 2, '2025-03-17 11:00:00', '2025-03-17');

Bersihkan data partisi

-- Hapus baris dari partisi tertentu (kunci tabel)
DELETE FROM public.hologres_logical_parent_1 WHERE ds = '2025-03-16' or ds = '2025-03-17';
-- Truncate partisi tertentu (kunci partisi, tidak menghasilkan Binlog)
-- Tidak didukung dalam DML kelompok komputasi; jalankan di kelompok komputasi leader.
SET hg_experimental_generate_binlog = off;
TRUNCATE public.hologres_logical_parent_1 PARTITION (ds = '2025-03-16') PARTITION (ds = '2025-03-17');

Ganti isi partisi

Hologres 3.1 dan yang lebih baru mendukung sintaks INSERT OVERWRITE native untuk tabel partisi logis. Lihat INSERT OVERWRITE.

Penting

INSERT OVERWRITE bersifat sinkron. Jika Anda menentukan beberapa partisi logis, Hologres memprosesnya secara paralel, yang meningkatkan penggunaan CPU dan memori. Bagi operasi ganti isi multi-partisi menjadi tugas berurutan.

Kueri tabel partisi logis

-- Kueri dengan kondisi filter partisi
SELECT * FROM public.hologres_logical_parent_1 WHERE ds = '2025-03-16';
-- Kueri tanpa kondisi filter partisi
-- Memerlukan partition_require_filter = FALSE pada tabel induk
SELECT * FROM public.hologres_logical_parent_1;

Jika partition_require_filter diatur ke TRUE, kueri tanpa kondisi filter partisi akan gagal.

Lihat metadata

Hologres menyediakan tabel sistem dan fungsi untuk mengkueri metadata tabel partisi logis.

Objek Tujuan
hologres.hg_table_properties Lihat properti tabel
hologres.hg_list_logical_partition('<table_name>') Daftar semua partisi dalam tabel partisi logis
hologres.hg_logical_partitioned_table_properties Daftar semua partisi logis dan propertinya dalam instans saat ini
hologres.hg_partition_file_status('<table_name>') Kueri ukuran penyimpanan hot dan cold serta jumlah file untuk semua partisi (Hologres 3.1.4 dan yang lebih baru)

Periksa apakah tabel merupakan tabel partisi logis:

SELECT *
FROM hologres.hg_table_properties
WHERE
    table_name = '<table_name>'
    AND property_key = 'is_logical_partitioned_table'
    AND property_value = 'true';

Daftar semua partisi:

SELECT * FROM hologres.hg_list_logical_partition('<schema_name>.<table_name>');

Daftar konfigurasi properti partisi:

Kueri ini hanya mengembalikan konfigurasi yang berbeda antara partisi anak dan tabel induk. Hasil kosong berarti tidak ada pengesampingan level partisi yang diatur.

SELECT *
FROM hologres.hg_logical_partitioned_table_properties
WHERE
    table_namespace = '<schema_name>'
    AND table_name = '<table_name>'
ORDER BY partition DESC;

Lihat ukuran penyimpanan hot dan cold:

SELECT * FROM hologres.hg_partition_file_status('<schema_name>.<table_name>');

Partisi logis juga kompatibel dengan tabel sistem Hologres standar.

Lihat DDL untuk tabel partisi logis:

SELECT hg_dump_script('<schema_name>.<table_name>');

Lihat properti tabel induk:

SELECT *
FROM hologres.hg_table_properties
WHERE
    table_namespace = '<schema_name>'
    AND table_name = '<table_name>';

Lihat partisi terbesar:

Karena pembersihan data dan pembersihan partisi bersifat asinkron, MAX_PT dapat mengembalikan hasil salah jika partisi terbesar telah dikosongkan. Gunakan INSERT OVERWRITE untuk menghapus data guna menghindari masalah ini.
SELECT MAX_PT('<schema_name>.<table_name>');

Periksa apakah ada tabel partisi yang melebihi batas partisi:

CREATE OR REPLACE PROCEDURE check_logical_partition_count()
LANGUAGE 'plpgsql'
AS $$
DECLARE
    table_max_partition_count bigint;
    table_partition_count bigint;
    exceeded_logical_partition_limit boolean;
    row_record record;
BEGIN
    SELECT substring(result FROM '^[^:]*: (\d+)')::INTEGER INTO table_max_partition_count
        FROM hg_admin_command('get_global_flag', 'flag=table_max_partition_count') AS result;

    RAISE NOTICE 'table_max_partition_count=%', table_max_partition_count;

    FOR row_record IN
        SELECT table_namespace, table_name
            FROM hologres.hg_table_properties
            WHERE property_key = 'is_logical_partitioned_table' AND (property_value = 'true' OR property_value = 't')
    LOOP
        SELECT count(*) INTO table_partition_count
            FROM hologres.hg_list_logical_partition(quote_ident(row_record.table_namespace) || '.' || quote_ident(row_record.table_name));
        IF table_partition_count > table_max_partition_count THEN
            RAISE NOTICE 'table %.% partition count exceeds limit (% > %)', row_record.table_namespace, row_record.table_name, table_partition_count, table_max_partition_count;
        END IF;
    END LOOP;
END;
$$;

CALL check_logical_partition_count();

Langkah selanjutnya