

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Mengelola partisi PostgreSQL dengan ekstensi pg\$1partman
<a name="PostgreSQL_Partitions"></a>

Partisi tabel PostgreSQL menyediakan kerangka kerja untuk penanganan input data dan laporan performa tinggi. Gunakan partisi untuk basis data yang memerlukan input data dalam jumlah besar dengan cepat. Partisi juga menyediakan kueri tabel besar yang lebih cepat. Partisi membantu memelihara data tanpa memengaruhi instans basis data karena sumber daya I/O yang diperlukan lebih sedikit.

Dengan partisi, Anda dapat membagi data menjadi beberapa bagian berukuran kustom untuk diproses. Misalnya, Anda dapat membagi data deret waktu ke dalam berbagai rentang seperti per jam, harian, mingguan, bulanan, triwulanan, tahunan, kustom, atau kombinasinya. Untuk contoh data deret waktu, jika Anda membagi tabel berdasarkan jam, setiap partisi akan berisi data per satu jam. Jika Anda membagi tabel deret waktu berdasarkan hari, partisi akan berisi data per hari, dan seterusnya. Kunci partisi mengontrol ukuran partisi. 

Saat Anda menggunakan perintah SQL `INSERT` atau `UPDATE` pada tabel yang dipartisi, mesin basis data merutekan data ke partisi yang sesuai. Partisi tabel PostgreSQL yang menyimpan data adalah tabel turunan dari tabel utama. 

Selama pembacaan kueri basis data, pengoptimal PostgreSQL memeriksa klausul `WHERE` pada kueri dan, jika memungkinkan, mengarahkan pemindaian basis data hanya untuk partisi yang relevan.

Mulai versi 10, PostgreSQL menggunakan partisi deklaratif untuk mengimplementasikan partisi tabel. Ini juga dikenal sebagai partisi PostgreSQL asli. Sebelum PostgreSQL versi 10, Anda menggunakan pemicu untuk mengimplementasikan partisi. 

Partisi tabel PostgreSQL menyediakan fitur berikut:
+ Pembuatan partisi baru setiap saat.
+ Rentang partisi bervariasi.
+ Partisi yang dapat dilepas dan dapat dipasang kembali menggunakan pernyataan bahasa definisi data (DDL).

  Sebagai contoh, partisi yang dapat dilepas berguna untuk menghapus data historis dari partisi utama, tetapi menyimpan data historis untuk analisis.
+ Partisi baru mewarisi properti tabel basis data induk, termasuk yang berikut ini:
  + Indeks
  + Kunci primer, yang harus berisi kolom kunci partisi
  + Kunci asing
  + Batasan pemeriksaan
  + Referensi
+ Membuat indeks untuk seluruh tabel atau partisi tertentu.

Anda tidak dapat mengubah skema partisi individual. Namun, Anda dapat mengubah tabel induk (seperti menambahkan kolom baru), yang disebarkan ke partisi. 

**Topics**
+ [

## Ikhtisar ekstensi pg\$1partman PostgreSQL
](#PostgreSQL_Partitions.pg_partman)
+ [

## Mengaktifkan ekstensi pg\$1partman
](#PostgreSQL_Partitions.enable)
+ [

## Mengonfigurasi partisi menggunakan fungsi create\$1parent
](#PostgreSQL_Partitions.create_parent)
+ [

## Mengonfigurasi pemeliharaan partisi menggunakan fungsi run\$1maintenance\$1proc
](#PostgreSQL_Partitions.run_maintenance_proc)

## Ikhtisar ekstensi pg\$1partman PostgreSQL
<a name="PostgreSQL_Partitions.pg_partman"></a>

Anda dapat menggunakan ekstensi `pg_partman` PostgreSQL untuk mengotomatiskan pembuatan dan pemeliharaan partisi tabel. Untuk informasi umum selengkapnya, lihat [PG Partition Manager](https://github.com/pgpartman/pg_partman) dalam dokumentasi `pg_partman`.

**catatan**  
Ekstensi `pg_partman` didukung pada RDS for PostgreSQL versi 12.5 dan yang lebih tinggi.

Alih-alih membuat setiap partisi secara manual, Anda dapat mengonfigurasi `pg_partman` dengan pengaturan berikut: 
+ Tabel yang akan dipartisi
+ Jenis partisi
+ Kunci partisi
+ Granularitas partisi
+ Opsi pra-pembuatan dan manajemen partisi

Setelah membuat tabel yang dipartisi PostgreSQL, daftarkan dengan `pg_partman` dengan memanggil fungsi `create_parent`. Tindakan ini akan membuat partisi yang diperlukan berdasarkan parameter yang Anda teruskan ke fungsi.

Ekstensi `pg_partman` juga menyediakan fungsi `run_maintenance_proc`, yang dapat Anda panggil sesuai jadwal untuk secara otomatis mengelola partisi. Untuk memastikan bahwa partisi yang tepat dibuat sesuai kebutuhan, jadwalkan fungsi ini untuk berjalan secara berkala (seperti per jam). Anda juga dapat memastikan bahwa partisi secara otomatis dibatalkan.

## Mengaktifkan ekstensi pg\$1partman
<a name="PostgreSQL_Partitions.enable"></a>

Jika Anda memiliki beberapa basis data di dalam instans DB PostgreSQL yang partisinya ingin Anda kelola, aktifkan ekstensi `pg_partman` secara terpisah untuk setiap basis data. Untuk mengaktifkan ekstensi `pg_partman` untuk basis data tertentu, buat skema pemeliharaan partisi, kemudian buat ekstensi `pg_partman` seperti berikut.

```
CREATE SCHEMA partman;
CREATE EXTENSION pg_partman WITH SCHEMA partman;
```

**catatan**  
Untuk membuat ekstensi `pg_partman`, pastikan Anda memiliki hak istimewa `rds_superuser`. 

Jika Anda menerima kesalahan seperti berikut, berikan hak istimewa `rds_superuser` untuk akun tersebut atau gunakan akun pengguna super Anda. 

```
ERROR: permission denied to create extension "pg_partman"
HINT: Must be superuser to create this extension.
```

Untuk memberikan hak istimewa `rds_superuser`, hubungkan dengan akun pengguna super Anda dan jalankan perintah berikut.

```
GRANT rds_superuser TO user-or-role;
```

Untuk contoh yang menunjukkan penggunaan ekstensi pg\$1partman, kita gunakan contoh tabel dan partisi basis data berikut. Basis data ini menggunakan tabel yang dipartisi berdasarkan stempel waktu. Skema `data_mart` berisi tabel bernama `events` dengan kolom bernama `created_at`. Pengaturan berikut disertakan dalam tabel `events`:
+  Kunci primer `event_id` dan `created_at`, yang harus memiliki kolom yang digunakan untuk memandu partisi.
+ Batasan pemeriksaan `ck_valid_operation` guna menerapkan nilai untuk kolom tabel `operation`.
+ Dua kunci asing, yang salah satunya (`fk_orga_membership)` menunjuk ke tabel eksternal `organization` dan kunci lainnya (`fk_parent_event_id`) adalah kunci asing referensi mandiri. 
+ Dua indeks, yang salah satunya (`idx_org_id`) untuk kunci asing dan indeks lainnya (`idx_event_type`) untuk jenis peristiwa.

Pernyataan DDL berikut membuat objek ini, yang secara otomatis disertakan pada setiap partisi.

```
CREATE SCHEMA data_mart;
CREATE TABLE data_mart.organization ( org_id BIGSERIAL,
        org_name TEXT,
        CONSTRAINT pk_organization PRIMARY KEY (org_id)  
    );

CREATE TABLE data_mart.events(
        event_id        BIGSERIAL, 
        operation       CHAR(1), 
        value           FLOAT(24), 
        parent_event_id BIGINT, 
        event_type      VARCHAR(25), 
        org_id          BIGSERIAL, 
        created_at      timestamp, 
        CONSTRAINT pk_data_mart_event PRIMARY KEY (event_id, created_at), 
        CONSTRAINT ck_valid_operation CHECK (operation = 'C' OR operation = 'D'), 
        CONSTRAINT fk_orga_membership 
            FOREIGN KEY(org_id) 
            REFERENCES data_mart.organization (org_id),
        CONSTRAINT fk_parent_event_id 
            FOREIGN KEY(parent_event_id, created_at) 
            REFERENCES data_mart.events (event_id,created_at)
    ) PARTITION BY RANGE (created_at);

CREATE INDEX idx_org_id     ON  data_mart.events(org_id);
CREATE INDEX idx_event_type ON  data_mart.events(event_type);
```



## Mengonfigurasi partisi menggunakan fungsi create\$1parent
<a name="PostgreSQL_Partitions.create_parent"></a>

Setelah mengaktifkan ekstensi `pg_partman`, gunakan fungsi `create_parent` untuk mengonfigurasi partisi di dalam skema pemeliharaan partisi. Contoh berikut menggunakan contoh tabel `events` yang dibuat di [Mengaktifkan ekstensi pg\$1partmanMengonfigurasi pemeliharaan partisi menggunakan fungsi run\$1maintenance\$1proc](#PostgreSQL_Partitions.enable). Panggil fungsi `create_parent` seperti berikut.

```
SELECT partman.create_parent( 
 p_parent_table => 'data_mart.events',
 p_control      => 'created_at',
 p_type         => 'range',
 p_interval     => '1 day',
 p_premake      => 30);
```

Parameternya adalah sebagai berikut:
+ `p_parent_table` – Tabel induk yang dipartisi. Tabel ini harus sudah ada dan sepenuhnya memenuhi syarat, termasuk skemanya. 
+ `p_control` – Kolom yang menjadi dasar pembuatan partisi. Jenis data harus bilangan bulat atau berbasis waktu.
+ `p_type` – Jenisnya adalah `'range'` atau `'list'`.
+ `p_interval` – Interval waktu atau rentang bilangan bulat untuk setiap partisi. Contoh nilai meliputi `1 day``1 hour`,, dan sebagainya.
+ `p_premake` – Jumlah partisi yang akan dibuat terlebih dahulu untuk mendukung sisipan baru.

Untuk keterangan lengkap tentang fungsi `create_parent`, lihat [Creation Functions](https://github.com/pgpartman/pg_partman/blob/master/doc/pg_partman.md#user-content-creation-functions) dalam dokumentasi `pg_partman`.

## Mengonfigurasi pemeliharaan partisi menggunakan fungsi run\$1maintenance\$1proc
<a name="PostgreSQL_Partitions.run_maintenance_proc"></a>

Anda dapat menjalankan operasi pemeliharaan partisi untuk secara otomatis membuat partisi baru, melepaskan partisi, atau menghapus partisi lama. Pemeliharaan partisi bergantung pada fungsi `run_maintenance_proc` pada ekstensi `pg_partman` dan `pg_cron`, yang memulai penjadwal internal. Penjadwal `pg_cron` secara otomatis mengeksekusi pernyataan, fungsi, dan prosedur SQL yang ditetapkan dalam basis data Anda. 

Contoh berikut menggunakan contoh tabel `events` yang dibuat di [Mengaktifkan ekstensi pg\$1partmanMengonfigurasi pemeliharaan partisi menggunakan fungsi run\$1maintenance\$1proc](#PostgreSQL_Partitions.enable) untuk mengatur operasi pemeliharaan partisi agar berjalan secara otomatis. Sebagai prasyarat, tambahkan `pg_cron` ke parameter `shared_preload_libraries` dalam grup parameter instans DB.

```
CREATE EXTENSION pg_cron;

UPDATE partman.part_config 
SET infinite_time_partitions = true,
    retention = '3 months', 
    retention_keep_table=true 
WHERE parent_table = 'data_mart.events';
SELECT cron.schedule('@hourly', $$CALL partman.run_maintenance_proc()$$);
```

Berikut ini, Anda dapat menemukan step-by-step penjelasan dari contoh sebelumnya: 

1. Modifikasi grup parameter yang terkait dengan instans DB Anda dan tambahkan `pg_cron` ke nilai parameter `shared_preload_libraries`. Untuk menerapkan perubahan, instans DB harus dimulai ulang. Untuk informasi selengkapnya, lihat [](USER_WorkingWithParamGroups.Modifying.md). 

1. Jalankan perintah `CREATE EXTENSION pg_cron;` menggunakan akun yang memiliki izin `rds_superuser`. Tindakan ini akan mengaktifkan ekstensi `pg_cron`. Untuk informasi selengkapnya, lihat [Menjadwalkan pemeliharaan dengan ekstensi pg\$1cron PostgreSQL](PostgreSQL_pg_cron.md).

1. Jalankan perintah `UPDATE partman.part_config` guna menyesuaikan pengaturan `pg_partman` untuk tabel `data_mart.events`. 

1. Jalankan perintah `SET` . . . untuk mengonfigurasi tabel `data_mart.events` dengan klausul berikut:

   1. `infinite_time_partitions = true,` – Mengonfigurasi tabel untuk dapat secara otomatis membuat partisi baru tanpa batas.

   1. `retention = '3 months',` – Mengonfigurasi tabel agar memiliki retensi maksimum tiga bulan. 

   1. `retention_keep_table=true `– Mengonfigurasi tabel agar ketika periode retensi sudah habis, tabel tidak akan dihapus secara otomatis. Sebaliknya, partisi yang lebih lama dari periode retensi hanya dilepaskan dari tabel induk.

1. Jalankan perintah `SELECT cron.schedule` . . . untuk membuat panggilan fungsi `pg_cron`. Panggilan ini menetapkan frekuensi penjadwal menjalankan prosedur pemeliharaan `pg_partman`, `partman.run_maintenance_proc`. Untuk contoh ini, prosedur berjalan setiap jam. 

Untuk keterangan lengkap tentang fungsi `run_maintenance_proc`, lihat [Maintenance Functions](https://github.com/pgpartman/pg_partman/blob/master/doc/pg_partman.md#maintenance-functions) dalam dokumentasi `pg_partman`. 