All Products
Search
Document Center

Hologres:BUAT TABEL PARTISI LOGIS

Last Updated:Feb 15, 2026

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 LIST dan 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.

    Catatan

    Karena 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

Catatan

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.

Catatan

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.

  • Secara default, tidak ada waktu kedaluwarsa yang ditetapkan. Data tidak pernah dibersihkan secara otomatis.

  • Anda dapat mengatur nilai seperti '30 day' atau '12 month'. Kami merekomendasikan menggunakan satuan waktu yang sama dengan kunci partisi Anda.

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.

  • Secara default, semua data tetap berada di hot. Tidak ada pemindahan otomatis ke penyimpanan dingin.

  • Anda dapat mengatur nilai seperti '30 day' atau '12 month'. Kami merekomendasikan menggunakan satuan waktu yang sama dengan kunci partisi Anda.

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:

  • TRUE: Kondisi filter partisi wajib. Kueri tanpa kondisi tersebut akan gagal.

  • FALSE (default): Kondisi filter partisi opsional. Anda dapat mengkueri tabel induk secara langsung.

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:

  • 'none' (default): Binlog dinonaktifkan.

  • 'replica': Binlog diaktifkan.

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.

  • Secara default, tidak ada jendela waktu yang ditetapkan. Semua data dalam tabel induk menghasilkan Binlog.

  • Anda dapat mengatur nilai seperti '3 day' atau '12 hour'. Kami merekomendasikan menggunakan satuan waktu yang sama dengan kunci partisi Anda.

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:

  • TRUE: Partisi tidak pernah dibersihkan secara otomatis. Mengabaikan pengaturan partition_expiration_time tabel induk.

  • FALSE (default): Partisi mengikuti pengaturan partition_expiration_time tabel induk dan dibersihkan saat kedaluwarsa.

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:

  • 'hot': Partisi tetap berada di penyimpanan hot. Mengabaikan pengaturan partition_keep_hot_window tabel induk.

  • 'cold': Partisi tetap berada di penyimpanan dingin. Mengabaikan pengaturan partition_keep_hot_window tabel induk.

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:

  • 'on': Partisi menghasilkan Binlog. Mengabaikan pengaturan partition_generate_binlog_window tabel induk.

  • 'off': Partisi tidak menghasilkan Binlog. Mengabaikan pengaturan partition_generate_binlog_window tabel induk.

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.

    Penting

    INSERT 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.

    Catatan

    Karena 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();

Referensi