Hologres V3.1 dan versi yang lebih baru mendukung tabel partisi logis. Dalam 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 Hologres V3.1 dan versi yang lebih baru yang mendukung tabel partisi logis.
Tabel partisi logis hanya mendukung partisi
LIST. Anda dapat menentukan hingga dua kolom kunci partisi.Kunci partisi untuk tabel partisi logis mendukung tipe data berikut: INT, TEXT, VARCHAR, DATE, TIMESTAMP, dan TIMESTAMPTZ.
Kunci partisi untuk tabel partisi logis harus memiliki properti NOT NULL.
Kunci partisi untuk tabel partisi logis dapat berupa kolom yang dihasilkan.
Satu tabel partisi logis mendukung maksimal 5.200 partisi. Satu database mendukung maksimal 200.000 partisi logis secara keseluruhan.
Karena tabel partisi logis secara otomatis membuat partisi saat Anda menulis data, batasan dan rekomendasi berikut berlaku:
Optimalkan pekerjaan penulisan data dan gunakan Kualitas Data untuk menghindari data kotor. Misalnya, jika Anda mempartisi data berdasarkan hari, hindari data dengan stempel waktu selain pukul 00:00:00. Praktik ini mencegah ekspansi partisi yang berlebihan.
Tulis data ke partisi secara berurutan untuk menghindari penulisan ke terlalu banyak partisi secara bersamaan.
Berikut adalah batasan yang berlaku untuk tugas impor untuk satu tabel:
Saat impor batch, satu pekerjaan impor dapat mengimpor data ke maksimal 50 partisi. Jika batas ini dilampaui, pesan kesalahan
Bulkload partition count exceed limit, partition count is xxx, limit is xxxdikembalikan.Saat Anda mengimpor data menggunakan Fixed Plan, jika jumlah partisi yang ditulis secara bersamaan dalam satu tabel melebihi 30, permintaan tulis baru akan dikenai Pengendalian aliran. Permintaan tersebut akan dikomit secara otomatis setelah beberapa detik.
Saat Anda mengimpor data menggunakan Fixed Plan, jika jumlah partisi yang ditulis secara bersamaan dalam satu tabel melebihi 100, permintaan tulis baru gagal dengan pesan kesalahan
mem partition count exceed reject limit.
Mekanisme pengendalian aliran berikut berlaku di tingkat instans atau kelompok komputasi:
Jika lebih dari 50 partisi baru dibuat per menit, permintaan pembuatan partisi baru akan dikenai Pengendalian aliran. Permintaan tersebut akan dikomit secara otomatis setelah beberapa detik.
Jika lebih dari 100 partisi baru dibuat per menit, permintaan pembuatan partisi baru gagal dengan pesan kesalahan
mem partition count exceed reject limit.Untuk tabel in-memory, saat Anda menggunakan Fixed Plan, jika jumlah total partisi yang ditulis secara bersamaan mencapai 500, permintaan tulis baru akan dikenai Pengendalian aliran. Permintaan tersebut akan dikomit secara otomatis setelah beberapa detik. Jumlah total dihitung menggunakan rumus berikut: (Jumlah partisi yang ditulis dalam satu tabel × Jumlah shard / Jumlah worker). Untuk tabel yang menggunakan penyimpanan baris dan kolom sekaligus, kalikan hasilnya dengan 2. Kemudian, jumlahkan hasilnya untuk semua tabel.
Untuk tabel in-memory, saat Anda menggunakan Fixed Plan, jika jumlah total partisi yang ditulis secara bersamaan mencapai 5.000, permintaan tulis baru gagal dengan pesan kesalahan
mem partition count exceed reject limit. Jumlah total dihitung menggunakan rumus berikut: (Jumlah partisi yang ditulis dalam satu tabel × Jumlah shard / Jumlah worker). Untuk tabel yang menggunakan penyimpanan baris dan kolom sekaligus, kalikan hasilnya dengan 2. Kemudian, jumlahkan hasilnya untuk semua tabel.
Catatan
Hindari menggunakan partisi dengan volume data yang sangat kecil, misalnya kurang dari 100 juta baris. Praktik ini dapat mengurangi performa akselerasi kueri dan menghasilkan banyak file kecil. Sebagai gantinya, gunakan granularitas partisi yang lebih besar.
Jika Anda sering perlu mengganti seluruh data dalam suatu partisi menggunakan operasi seperti `TRUNCATE` atau `INSERT OVERWRITE`, gunakan tabel partisi. Tabel partisi memberikan performa yang lebih baik dan membantu menghindari operasi penghapusan skala besar.
Operasi `TRUNCATE` tidak mendukung binary logging. Anda harus menjalankan perintah
SET hg_experimental_generate_binlog = offdi tingkat sesi.Anda tidak perlu membuat partisi secara manual untuk tabel partisi logis. Partisi hanya ada jika berisi data. Saat semua data dalam suatu partisi dihapus, partisi tersebut juga dihapus secara otomatis.
CatatanHologres melakukan pembersihan data sebagai operasi asinkron. Oleh karena itu, partisi juga dihapus secara asinkron.
Untuk memodifikasi properti tabel partisi logis, gunakan sintaks REBUILD. Sistem secara otomatis membagi tugas dan mengeksekusinya secara berurutan berdasarkan partisi. Untuk melakukan operasi resharding, yang memodifikasi kelompok tabel tabel tersebut, jangan gunakan prosedur tersimpan `HG_MOVE_TABLE_TO_TABLE_GROUP`. Untuk informasi selengkapnya, lihat Operasi Kelompok Tabel dan jumlah shard.
Buat tabel partisi logis
Sintaks
Partisi dari tabel partisi logis ditentukan oleh datanya. Oleh karena itu, Anda tidak perlu membuat atau menghapus partisi secara manual.
-- Pernyataan untuk membuat tabel partisi induk 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
Parameter | Deskripsi |
schema_name | Nama skema tempat tabel berada. Jika Anda membuat tabel induk dan anak dalam skema yang sama, Anda tidak perlu menentukan nama skema. Jika Anda membuatnya di skema berbeda, Anda harus menentukan nama skema. |
table_name | Nama tabel partisi induk yang akan dibuat. |
column_name | Nama bidang yang akan dibuat dalam tabel baru. |
column_type | Tipe data dari bidang tersebut. |
column_constraints | Nama kendala kolom. |
table_constraints | Nama kendala tabel. |
partition_column | Kunci partisi tabel partisi logis. Anda dapat menetapkan satu atau dua kunci partisi. |
property_name | Nama properti tabel yang akan ditetapkan untuk tabel partisi logis. |
property_value | Nilai yang akan ditetapkan untuk properti tabel. |
Properti tabel
Tabel induk dari tabel partisi logis mendukung properti tabel berikut.
Dalam tabel partisi logis, tabel induk adalah tabel fisik dan partisinya merupakan konsep logis. Oleh karena itu, Anda tidak dapat menetapkan properti berikut untuk partisi individual.
Properti | Deskripsi |
partition_expiration_time | Durasi kedaluwarsa untuk partisi. Setelah partisi kedaluwarsa, datanya akan dibersihkan secara asinkron.
Catatan Properti ini hanya berlaku untuk satu kunci partisi bertipe data berbasis waktu. |
partition_keep_hot_window | Durasi data partisi tetap berada di penyimpanan panas. Setelah periode ini berakhir, data akan dipindahkan secara asinkron ke penyimpanan dingin. Untuk informasi selengkapnya tentang penyimpanan panas dan dingin, lihat Tiering data.
Catatan Properti ini hanya berlaku untuk satu kunci partisi bertipe data berbasis waktu. |
partition_require_filter | Menentukan apakah kondisi filter pada kunci partisi diperlukan saat Anda mengkueri tabel induk. Nilai valid:
|
binlog_level | Menentukan apakah akan mengaktifkan pencatatan biner untuk tabel induk. Untuk informasi lebih lanjut tentang fitur pencatatan biner, lihat Berlangganan log biner Hologres. Nilai valid:
|
binlog_ttl | Masa hidup data (TTL) untuk log biner, dalam detik. Nilai default adalah 2592000, yaitu 30 hari. |
partition_generate_binlog_window | Jendela waktu untuk menghasilkan log biner untuk data tabel induk. Log biner hanya dihasilkan untuk data dalam partisi yang berada dalam rentang `waktu saat ini - nilai parameter`.
Catatan Properti ini hanya berlaku untuk satu kunci partisi bertipe data berbasis waktu. |
Properti penting lainnya seperti indeks | Tabel partisi logis juga mendukung indeks seperti distribution_key dan clustering_key, serta properti penting lainnya seperti orientation dan time_to_live_in_seconds. Untuk informasi selengkapnya tentang properti, lihat CREATE TABLE. Anda dapat merujuk pada skenario yang tercantum dalam Pembuatan dan optimasi tabel berbasis skenario untuk menetapkan nilai yang sesuai untuk properti tabel terkait indeks. Tabel partisi logis tidak mendukung properti manajemen partisi dinamis milik tabel partisi fisik. Untuk informasi selengkapnya, lihat Manajemen partisi dinamis. |
Properti partisi
Partisi dalam tabel partisi logis mendukung properti berikut. Anda dapat memodifikasi properti ini menggunakan ALTER LOGICAL PARTITION TABLE.
Properti partisi | Deskripsi |
keep_alive | Menentukan apakah partisi dibersihkan secara otomatis. Nilai yang valid:
Properti ini hanya berlaku jika parameter partition_expiration_time ditetapkan untuk tabel induk. |
storage_mode | Menentukan apakah partisi mempertahankan kelas penyimpanan tertentu. Secara default, properti ini tidak ditetapkan, dan partisi dikendalikan oleh parameter partition_keep_hot_window tabel induk. Nilai yang valid:
|
generate_binlog | Menentukan apakah log biner dihasilkan untuk partisi. Secara default, properti ini tidak ditetapkan, dan partisi dikendalikan oleh parameter partition_generate_binlog_window tabel induk. Nilai yang valid:
|
Contoh
Tetapkan kolom standar `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 hari', partition_keep_hot_window = '15 hari', partition_require_filter = TRUE, binlog_level = 'replica', partition_generate_binlog_window = '3 hari' );Tetapkan kolom yang dihasilkan `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 hari', partition_keep_hot_window = '15 hari', partition_require_filter = TRUE, binlog_level = 'replica', partition_generate_binlog_window = '3 hari' );Tetapkan dua kolom 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 dalam tabel partisi logis
Kunci berikut diperoleh saat Anda mengelola data dalam tabel partisi logis:
Impor batch atau pembaruan untuk partisi tertentu, atau `TRUNCATE` untuk partisi tertentu: Kunci metadata partisi diperoleh. Manajemen data di partisi lain tidak terpengaruh.
Impor batch atau pembaruan tanpa menentukan partisi, `TRUNCATE` tanpa menentukan partisi, atau operasi `DELETE` apa pun: Kunci tabel diperoleh. Operasi manajemen data lainnya harus menunggu hingga kunci dilepaskan.
Operasi tulis, pembaruan, atau penghapusan data menggunakan Fixed Plan: Kunci baris diperoleh. Operasi ini dapat mengganggu operasi impor batch, pembaruan, atau penghapusan pada partisi atau tabel. Operasi ini tidak memengaruhi operasi tulis, pembaruan, atau penghapusan data lainnya yang menggunakan Fixed Plan.
Kelola data dalam tabel induk
Untuk tabel induk dari tabel partisi logis, operasi tulis, pembaruan, dan pembersihan data sama seperti pada tabel standar. Mesin penyimpanan Hologres secara otomatis menambahkan atau menghapus partisi berdasarkan data.
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 dari tabel induk.
-- Bersihkan data menggunakan perintah DELETE DELETE FROM public.hologres_logical_parent_2 WHERE ds = '2025-03-20'; -- Bersihkan data menggunakan perintah TRUNCATE SET hg_experimental_generate_binlog = off; TRUNCATE public.hologres_logical_parent_2;
Kelola data dalam partisi
Tabel partisi logis juga mendukung operasi manajemen data pada partisi tertentu.
Impor data ke partisi logis. Jika data yang akan diimpor tidak cocok dengan partisi yang ditentukan, data yang tidak cocok akan diabaikan.
-- Tentukan partisi dan impor data INSERT INTO public.hologres_logical_parent_1 PARTITION (ds = '2025-03-16') VALUES ('a', 1, '2025-03-16 10:00:00', '2025-03-16'); -- Jika data tidak cocok dengan partisi, data yang tidak cocok tidak ditulis, dan tidak ada kesalahan yang dilaporkan INSERT INTO public.hologres_logical_parent_1 PARTITION (ds = '2025-03-16') VALUES ('a', 3, '2025-03-16 10:00:00', '2025-03-16'), ('b', 2, '2025-03-17 11:00:00', '2025-03-17');Bersihkan data dari partisi.
Fitur routing DML otomatis kelompok komputasi tidak mendukung routing operasi `TRUNCATE` untuk partisi tertentu. Anda harus menjalankan operasi ini pada kelompok komputasi utama (Leader).
-- Bersihkan data menggunakan perintah DELETE DELETE FROM public.hologres_logical_parent_1 WHERE ds = '2025-03-16' or ds = '2025-03-17'; -- Bersihkan data menggunakan perintah 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 V3.1 dan versi yang lebih baru mendukung sintaks native `INSERT OVERWRITE`. Anda dapat melakukan operasi `INSERT OVERWRITE` pada tabel partisi logis. Untuk informasi selengkapnya, lihat INSERT OVERWRITE.
PentingPekerjaan `INSERT OVERWRITE` adalah tugas sinkron. Jika Anda menentukan beberapa partisi logis sekaligus, pekerjaan `INSERT OVERWRITE` untuk partisi-partisi tersebut diproses secara paralel. Hal ini dapat menyebabkan tekanan CPU dan memori yang tinggi. Untuk melakukan operasi `INSERT OVERWRITE` pada beberapa partisi logis, kami merekomendasikan agar Anda membagi operasi menjadi beberapa pekerjaan berdasarkan partisi dan memprosesnya secara berurutan.
Kueri tabel partisi logis
Berbeda dengan tabel partisi fisik, tabel partisi logis mendukung properti `partition_require_filter`. Jika properti ini ditetapkan ke TRUE, pernyataan pencarian harus menyertakan kondisi filter pada kunci partisi saat Anda mengkueri tabel.
Kueri tabel partisi logis dengan kondisi filter pada kunci partisi.
SELECT * FROM public.hologres_logical_parent_1 WHERE ds = '2025-03-16';Kueri tabel partisi logis tanpa kondisi filter pada kunci partisi. Ini memerlukan properti `partition_require_filter` tabel induk bernilai
FALSE.SELECT * FROM public.hologres_logical_parent_1;
Operasi lainnya
Hologres menyediakan tabel sistem dan fungsi sistem berikut untuk mengkueri metadata tabel partisi logis.
hologres.hg_list_logical_partition('<table_name>'): Menampilkan semua partisi dari tabel partisi logis.
hologres.hg_logical_partitioned_table_properties: Menampilkan semua partisi logis dan konfigurasi propertinya dalam instans saat ini.
hologres.hg_partition_file_status('<table_name>'): Mulai dari Hologres V3.1.4, Anda dapat menggunakan fungsi ini untuk mengkueri jumlah data yang disimpan dalam penyimpanan panas dan dingin untuk semua partisi dalam tabel partisi logis.
Contoh:
Lihat semua partisi logis dari sebuah tabel.
SELECT * FROM hologres.hg_list_logical_partition ('<schema_name>.<table_name>');Lihat konfigurasi properti dari semua partisi logis dari sebuah tabel.
Catatan: Kueri ini hanya menampilkan konfigurasi subpartisi yang berbeda dari tabel induk. Jika hasilnya kosong, berarti subpartisi tidak memiliki konfigurasi khusus.
SELECT
*
FROM
hologres.hg_logical_partitioned_table_properties
WHERE
table_namespace = '<schema_name>'
AND table_name = '<table_name>'
ORDER BY partition DESC;Lihat jumlah data saat ini dalam penyimpanan panas dan dingin untuk semua partisi logis dalam tabel.
SELECT * FROM hologres.hg_partition_file_status ('<schema_name>.<table_name>');
Selain tabel sistem di atas, tabel partisi logis adalah tabel fisik. Tabel ini kompatibel dengan tabel sistem Hologres lainnya dan mendukung metode kueri metadata yang sama seperti tabel standar. Contoh berikut menunjukkan cara mengkueri metadata:
Lihat pernyataan DDL dari tabel partisi logis.
SELECT hg_dump_script('<schema_name>.<table_name>');Lihat properti tabel induk dari tabel partisi logis.
SELECT * FROM hologres.hg_table_properties WHERE table_namespace = '<schema_name>' AND table_name = '<table_name>';Lihat partisi terbesar dari tabel partisi logis.
CatatanPembersihan data dan pembersihan partisi untuk tabel partisi logis adalah operasi asinkron. Untuk membersihkan data dari partisi terbesar, gunakan operasi `INSERT OVERWRITE` untuk menghapus data tersebut. Jika tidak, fungsi `MAX_PT` mungkin mengembalikan hasil yang salah.
SELECT MAX_PT('<schema_name>.<table_name>');