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
LISTyang didukung.RANGEdanHASHtidak didukung. -
Kunci partisi dapat mencakup satu atau dua kolom.
-
Tipe data kunci partisi yang didukung:
INT,TEXT,VARCHAR,DATE,TIMESTAMP, danTIMESTAMPTZ. -
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 = offsebelum 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
|
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
|
partition_time_format |
Tidak ada | Lihat di bawah | Diperlukan hanya ketika kunci partisi bertipe TEXT. Didukung sejak Hologres V4.2. Nilai valid:
|
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.
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();