Hologres mendukung tabel partisi logis mulai dari versi 3.1. Pada tabel partisi logis, tabel induk merupakan tabel fisik, sedangkan tabel anak bersifat logis. Topik ini menjelaskan cara menggunakan pernyataan CREATE LOGICAL PARTITION TABLE.
Batasan
Hanya instans Hologres yang menjalankan versi 3.1 atau lebih baru yang mendukung tabel partisi logis.
Tabel partisi logis hanya mendukung partisi
LISTdan memungkinkan Anda menentukan kunci partisi yang terdiri dari maksimal dua kolom.Tipe data yang didukung untuk kunci partisi mencakup INT, TEXT, VARCHAR, DATE, TIMESTAMP, dan TIMESTAMPTZ.
Kunci partisi harus didefinisikan sebagai NOT NULL.
Kunci partisi pada tabel partisi logis mendukung generated columns.
Satu tabel partisi logis mendukung hingga 5.200 partisi. Satu database mendukung hingga 200.000 partisi logis secara total.
Saat menulis data ke tabel partisi logis, Hologres secara otomatis membuat partisi yang diperlukan. Batasan dan rekomendasi berikut berlaku:
Optimalkan pekerjaan ingesti data dan kualitas data Anda. Hindari data kotor—misalnya, hindari timestamp yang tidak jatuh tepat tengah malam saat menggunakan partisi harian. Hal ini membantu mencegah pertumbuhan partisi yang berlebihan.
Tulis data ke partisi secara berurutan. Hindari menulis ke banyak partisi secara bersamaan.
Pekerjaan impor batch untuk satu tabel memiliki batasan berikut:
Selama impor batch, satu pekerjaan mendukung hingga 50 partisi. Jika melebihi batas tersebut, Hologres akan mengembalikan error:
Bulkload partition count exceed limit, partition count is xxx, limit is xxx.Saat menggunakan Fixed Plan untuk mengimpor data, jika satu tabel menulis ke lebih dari 30 partisi secara bersamaan, permintaan penulisan partisi baru akan mengalami throttling. Hologres menunggu beberapa detik sebelum secara otomatis mengirimkan permintaan tersebut.
Saat menggunakan Fixed Plan untuk mengimpor data, jika satu tabel menulis ke lebih dari 100 partisi secara bersamaan, permintaan penulisan ke partisi baru akan gagal dengan error:
mem partition count exceed reject limit.
Untuk menghindari kelebihan beban pada node pekerja akibat terlalu banyak partisi yang belum dipersist, setiap node pekerja menerapkan batasan berikut:
Jika jumlah partisi yang belum dipersist melebihi 500, permintaan penulisan partisi baru akan mengalami throttling. Hologres menunggu beberapa detik sebelum secara otomatis mengirimkan permintaan tersebut.
Jika jumlah partisi yang belum dipersist melebihi 5.000, permintaan penulisan partisi baru akan gagal dengan error:
mem partition count exceed reject limit.Catatan: “Partisi yang belum dipersist” adalah partisi yang ditulis ke memori tetapi belum disimpan ke disk. Jumlah ini mencakup partisi pengguna × jumlah shard × jumlah indeks per tabel. Jumlah shard mencakup shard replika. Oleh karena itu, batas ini bergantung pada distribusi shard dan cara tabel didistribusikan di seluruh node dalam instans.
Catatan penting
Hindari membuat partisi dengan volume data yang sangat kecil—misalnya, kurang dari 100 juta baris. Partisi kecil mengurangi manfaat akselerasi kueri dan meningkatkan risiko pembuatan banyak file kecil. Gunakan partisi dengan granularitas lebih kasar sebagai gantinya.
Jika Anda sering mengganti seluruh data dalam suatu partisi—misalnya, menggunakan TRUNCATE atau INSERT OVERWRITE—gunakan tabel partisi. Dalam skenario ini, TRUNCATE dan INSERT OVERWRITE memberikan performa lebih baik karena menghindari operasi penghapusan skala besar.
Pernyataan TRUNCATE tidak menghasilkan binary logs (Binlog). Untuk menonaktifkan pembuatan Binlog dalam suatu sesi, jalankan:
SET hg_experimental_generate_binlog = off.Anda tidak perlu membuat atau menghapus partisi secara manual untuk tabel partisi logis. Partisi hanya ada ketika berisi data. Saat semua data dalam suatu partisi dihapus, partisi tersebut secara otomatis dihapus.
CatatanKarena Hologres membersihkan data secara asinkron, partisi juga dihapus secara asinkron.
Untuk memodifikasi properti tabel pada tabel partisi logis, gunakan sintaks REBUILD. Backend secara otomatis membagi tugas dan mengeksekusinya berdasarkan partisi. Khusus untuk operasi Resharding pada tabel partisi logis—misalnya, memodifikasi Table Group tabel—jangan gunakan prosedur tersimpan HG_MOVE_TABLE_TO_TABLE_GROUP asli. Untuk informasi selengkapnya, lihat Panduan Operasi Table Group dan Jumlah Shard.
Buat tabel partisi logis
Sintaks
Partisi yang ada untuk tabel partisi logis bergantung pada data dalam tabel tersebut. Anda tidak membuat atau menghapus partisi secara manual.
-- 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>
[, ...]
)];Parameter
Nama Parameter | Deskripsi |
schema_name | Nama skema yang berisi tabel tersebut. Abaikan parameter ini jika Anda membuat tabel induk dan anak dalam skema yang sama. Tentukan parameter ini jika Anda membuatnya lintas skema. |
table_name | Nama tabel partisi induk yang akan dibuat. |
column_name | Nama kolom yang akan dibuat dalam tabel baru. |
column_type | Tipe data kolom tersebut. |
column_constraints | Nama batasan kolom. |
table_constraints | Nama batasan tabel. |
partition_column | Kunci partisi untuk tabel partisi logis. Anda dapat menentukan satu atau dua kolom. |
property_name | Nama properti tabel yang akan diatur untuk tabel partisi logis. |
property_value | Nilai yang akan diberikan kepada properti tabel. |
Properti tabel
Tabel induk dari tabel partisi logis mendukung properti tabel berikut.
Tabel induk adalah tabel fisik, sedangkan partisi adalah konsep logis. Oleh karena itu, Anda tidak dapat mengatur properti berikut untuk partisi individual.
Property | Deskripsi |
partition_expiration_time | Waktu setelah data partisi kedaluwarsa dan dibersihkan secara asinkron.
Catatan Properti ini hanya berlaku untuk tabel dengan satu kunci partisi, dan hanya untuk kunci partisi berbasis waktu. |
partition_keep_hot_window | Durasi data partisi tetap berada di penyimpanan hot. Setelah periode ini berakhir, data partisi secara asinkron dipindahkan ke penyimpanan dingin. Untuk informasi lebih lanjut tentang penyimpanan hot dan dingin, lihat Penyimpanan Tiering Data.
Catatan Properti ini hanya berlaku untuk tabel dengan satu kunci partisi, dan hanya untuk kunci partisi berbasis waktu. |
partition_require_filter | Apakah kueri pada tabel induk memerlukan kondisi filter partisi. Nilai yang valid:
|
binlog_level | Menentukan apakah binary logging diaktifkan untuk tabel induk. Untuk informasi lebih lanjut tentang fitur binary logging, lihat Berlangganan Binary Logging Hologres. Nilai default: none. Nilai yang valid:
|
binlog_ttl | Waktu hidup (TTL) untuk data Binlog, dalam detik. Default adalah 2592000 (30 hari). |
partition_generate_binlog_window | Jendela waktu di mana data menghasilkan Binlog. Hanya data dalam partisi yang dibuat dalam rentang “waktu saat ini dikurangi nilai ini” yang menghasilkan Binlog.
Catatan Properti ini hanya berlaku untuk tabel dengan satu kunci partisi, dan hanya untuk kunci partisi berbasis waktu. |
Properti penting lainnya, seperti indeks | Tabel partisi logis mendukung indeks seperti distribution_key dan clustering_key, serta properti penting lainnya seperti orientation dan time_to_live_in_seconds. Untuk detail tentang properti, lihat CREATE TABLE. Anda dapat merujuk ke Panduan Optimasi Pembuatan Tabel Berbasis Skenario untuk mengatur nilai yang sesuai untuk properti tabel terkait indeks. Tabel partisi logis tidak mendukung properti manajemen partisi dinamis dari tabel partisi fisik asli. Untuk informasi lebih lanjut, lihat Manajemen Partisi Dinamis. |
Properti partisi
Partisi dalam tabel partisi logis mendukung properti berikut. Anda dapat memodifikasi properti tersebut menggunakan ALTER LOGICAL PARTITION TABLE.
Properti Partisi | Deskripsi |
keep_alive | Apakah partisi dibersihkan secara otomatis. Nilai yang valid:
Properti ini hanya berlaku jika tabel induk telah mengatur partition_expiration_time. |
storage_mode | Apakah partisi menggunakan kelas penyimpanan tertentu. Secara default, properti ini tidak diatur. Saat tidak diatur, partisi mengikuti pengaturan partition_keep_hot_window tabel induk. Nilai yang valid:
|
generate_binlog | Apakah partisi menghasilkan Binlog. Secara default, properti ini tidak diatur. Saat tidak diatur, partisi mengikuti pengaturan partition_generate_binlog_window tabel induk. Nilai yang valid:
|
Contoh
Gunakan kolom reguler ds 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' );Gunakan kolom generated ds sebagai kunci partisi.
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' );Gunakan 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 );
Manajemen data untuk tabel partisi logis
Saat mengelola data dalam tabel partisi logis, kunci berikut berlaku:
Impor batch atau pembaruan untuk partisi tertentu, atau TRUNCATE untuk partisi tertentu: Kunci partisi. Partisi lain tidak terpengaruh.
Impor batch atau pembaruan tanpa menentukan partisi, TRUNCATE tanpa menentukan partisi, atau DELETE apa pun: Kunci tabel. Operasi manajemen data lainnya menunggu hingga kunci dilepas.
Penulisan data, pembaruan, atau penghapusan menggunakan Fixed Plan: Kunci baris. Operasi ini bertentangan dengan operasi impor batch, pembaruan, atau penghapusan pada partisi atau tabel. Operasi ini tidak bertentangan dengan operasi Fixed Plan lainnya.
Manajemen data untuk tabel induk
Operasi penulisan, pembaruan, dan pembersihan data untuk tabel induk bekerja persis seperti pada tabel standar. Mesin penyimpanan Hologres secara otomatis membuat atau menghapus partisi berdasarkan data Anda.
Tulis data ke tabel induk.
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');Bersihkan data dalam tabel induk.
-- Bersihkan menggunakan DELETE DELETE FROM public.hologres_logical_parent_2 WHERE ds = '2025-03-20'; -- Bersihkan menggunakan TRUNCATE SET hg_experimental_generate_binlog = off; TRUNCATE public.hologres_logical_parent_2;
Manajemen data untuk partisi
Anda juga dapat mengelola data untuk partisi tertentu dalam tabel partisi logis.
Impor data ke partisi logis. Jika data masuk tidak sesuai dengan partisi yang ditentukan, Hologres melewati baris yang tidak cocok tanpa error.
-- 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'); -- Lewati baris yang tidak cocok secara diam-diam 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.
Routing otomatis untuk TRUNCATE pada partisi tertentu tidak didukung dalam compute group DML. Gunakan compute group leader untuk menjalankan TRUNCATE.
-- Bersihkan menggunakan DELETE DELETE FROM public.hologres_logical_parent_1 WHERE ds = '2025-03-16' or ds = '2025-03-17'; -- Bersihkan menggunakan TRUNCATE SET hg_experimental_generate_binlog = off; TRUNCATE public.hologres_logical_parent_1 PARTITION (ds = '2025-03-16') PARTITION (ds = '2025-03-17');Timpa partisi menggunakan INSERT OVERWRITE.
Hologres versi 3.1 dan yang lebih baru mendukung sintaks INSERT OVERWRITE native, yang dapat digunakan untuk melakukan operasi INSERT OVERWRITE pada tabel partisi logis. Untuk informasi selengkapnya, lihat INSERT OVERWRITE.
PentingINSERT OVERWRITE adalah operasi sinkron. Jika Anda menentukan beberapa partisi logis, Hologres memprosesnya secara paralel. Hal ini meningkatkan penggunaan CPU dan memori. Untuk menimpa beberapa partisi, pisahkan operasi menjadi tugas terpisah dan jalankan secara berurutan.
Kueri tabel partisi logis
Berbeda dengan tabel partisi fisik, tabel partisi logis memungkinkan Anda mengonfigurasi properti partition_require_filter. Jika properti ini diatur ke TRUE, kueri harus menyertakan kondisi filter partisi.
Kueri tabel partisi logis dengan kondisi filter partisi.
SELECT * FROM public.hologres_logical_parent_1 WHERE ds = '2025-03-16';Kueri pada tabel partisi logis tanpa kondisi filter partisi memerlukan properti partition_require_filter pada tabel induk diatur ke
FALSE.SELECT * FROM public.hologres_logical_parent_1;
Operasi lainnya
Hologres menyediakan tabel sistem dan fungsi berikut untuk mengkueri metadata tabel partisi logis.
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 dingin serta jumlah file untuk semua partisi dalam tabel partisi logis. Didukung di Hologres versi 3.1.4 dan lebih baru.
Contoh:
Tentukan apakah suatu tabel adalah 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 logis untuk suatu tabel.
SELECT * FROM hologres.hg_list_logical_partition ('<schema_name>.<table_name>');Daftar semua konfigurasi properti partisi logis untuk suatu tabel.
Catatan: Kueri ini hanya menampilkan konfigurasi yang berbeda antara partisi anak dan tabel induk. Hasil kosong berarti tidak ada konfigurasi khusus untuk partisi anak.
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 dingin saat ini serta jumlah file untuk semua partisi logis dalam suatu tabel.
SELECT * FROM hologres.hg_partition_file_status ('<schema_name>.<table_name>');
Selain tabel sistem yang telah dijelaskan sebelumnya, partisi logis—sebagai tabel fisik—juga kompatibel dengan tabel sistem Hologres lainnya dan mendukung metode kueri metadata yang sama seperti tabel standar. Contoh:
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 untuk tabel partisi logis.
CatatanKarena pembersihan data dan partisi dilakukan secara asinkron, max_pt mungkin mengembalikan hasil yang salah jika partisi terbesar telah dikosongkan. Untuk menghindari hal ini, gunakan INSERT OVERWRITE untuk menghapus data alih-alih metode lainnya.
SELECT MAX_PT('<schema_name>.<table_name>');Periksa apakah jumlah partisi melebihi batas.
Panggil prosedur tersimpan
check_logical_partition_count()untuk memeriksa apakah terdapat tabel partisi logis dalam instans saat ini 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();