All Products
Search
Document Center

Hologres:BUAT TABEL PARTISI LOGIS

Last Updated:Jun 18, 2026

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

Gunakan tabel partisi logis jika:

  • Dataset Anda besar dan berbasis time-series 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 pembuatan 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. 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 generated columns.

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

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 yang belum dipersist (per node pekerja)

Partisi yang belum dipersist 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 yang belum dipersist Dibatasi — Hologres menunggu beberapa detik, lalu mengirimkan secara otomatis
> 5.000 partisi yang belum dipersist Error: mem partition count exceed reject limit

Catatan penggunaan

  • Granularitas partisi: Hindari partisi dengan kurang dari 100 juta baris. Partisi yang terlalu 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 client 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 pada tengah malam saat menggunakan partisi harian—dapat menyebabkan pertumbuhan partisi yang tidak 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: TRUNCATE tidak menghasilkan Binlog. Untuk menonaktifkan pembuatan Binlog untuk sesi tertentu, jalankan SET hg_experimental_generate_binlog = off sebelum 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 tingkat kolom.
table_constraints Batasan tingkat 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_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_time_format Tidak ada Lihat di bawah Diperlukan hanya 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 triwulanan, 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: triwulanan dengan pembatas, contohnya 2024-1.

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. Berlaku hanya 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 tabel induk) 'hot', 'cold' Menggantikan partition_keep_hot_window tabel induk untuk partisi ini.
generate_binlog Tidak diatur (mengikuti partition_generate_binlog_window tabel induk) 'on', 'off' Menggantikan 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 tergenerasi sebagai kunci partisi

Kunci partisi ds diturunkan dari kolom c menggunakan date_trunc. Ini secara otomatis menetapkan setiap baris ke partisi harian yang benar tanpa memerlukan pemanggil untuk menghitung nilai partisi. Untuk informasi lebih lanjut, lihat Kolom tergenerasi 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 Bentrok dengan impor batch, pembaruan, atau penghapusan. Tidak bentrok dengan operasi Fixed Plan lainnya.

Pilih metode pembersihan data

Metode Kapan digunakan Jenis kunci Catatan
DELETE Menghapus baris yang sesuai kondisi tertentu secara selektif Kunci tabel Lebih lambat untuk set data besar
TRUNCATE (tingkat 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 (tingkat 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

Menulis ke tabel induk

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

-- Menulis 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');
-- Menghapus 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;

Menulis 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 akan dilewati 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 asli 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. Pisahkan 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 penggantian tingkat 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 mungkin 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 berikutnya