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_partman
Partisi tabel PostgreSQL menyediakan kerangka kerja untuk penanganan input data dan laporan performa tinggi. Gunakan partisi untuk basis data yang memerlukan input yang sangat cepat berupa data dalam jumlah besar. Partisi juga menyediakan kueri tabel besar yang lebih cepat. Partisi membantu menjaga data tanpa memengaruhi instans basis data karena membutuhkan lebih sedikit sumber daya I/O.
Dengan partisi, Anda dapat membagi data menjadi potongan-potongan berukuran kustom untuk diproses. Misalnya, Anda dapat mempartisi data deret waktu selama berbagai rentang seperti per jam, harian, mingguan, bulanan, triwulanan, tahunan, kustom, atau kombinasinya. Untuk contoh data deret waktu, jika Anda mempartisi tabel per jam, setiap partisi berisi data satu jam. Jika Anda mempartisi tabel deret waktu per hari, partisi akan menyimpan data senilai satu 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.
Dimulai dengan versi 10, PostgreSQL menggunakan partisi deklaratif untuk mengimplementasikan partisi tabel. Ini juga dikenal sebagai partisi PostgreSQL native. Sebelum PostgreSQL versi 10, Anda menggunakan pemicu untuk mengimplementasikan partisi.
Partisi tabel PostgreSQL dilengkapi dengan 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
-
Kendala pemeriksaan
-
Referensi
-
-
Membuat indeks untuk tabel lengkap atau setiap partisi tertentu.
Anda tidak dapat mengubah skema untuk partisi individual. Namun, Anda dapat mengubah tabel induk (seperti menambahkan kolom baru), yang bertambah ke partisi.
Topik
Ikhtisar ekstensi PostgreSQL pg_partman
Anda dapat menggunakan ekstensi PostgreSQL pg_partman
untuk mengotomatisasi pembuatan dan pemeliharaan partisi tabel. Untuk informasi umum selengkapnya, lihat Manajer Partisi PGpg_partman
.
catatan
Ekstensi pg_partman
didukung pada RDS for PostgreSQL versi 12.6 dan yang lebih tinggi.
Alih-alih membuat setiap partisi secara manual, Anda 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, Anda mendaftarkannya dengan pg_partman
dengan memanggil fungsi create_parent
. Melakukan hal 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_partman
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_partman, 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
dancreated_at
, yang harus memiliki kolom yang digunakan untuk memandu partisi. -
Kendala pemeriksaan
ck_valid_operation
guna menerapkan nilai untuk kolom tabeloperation
. -
Dua kunci asing, di mana satu kunci (
fk_orga_membership)
menunjuk ke tabel eksternalorganization
dan kunci lainnya (fk_parent_event_id
) adalah kunci asing referensi mandiri. -
Dua indeks, di mana satu induk (
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_parent
Setelah Anda mengaktifkan ekstensi pg_partman
, gunakan fungsi create_parent
untuk mengonfigurasi partisi dalam skema pemeliharaan partisi. Contoh berikut menggunakan contoh tabel events
yang dibuat di Mengaktifkan ekstensi pg_partman. Panggil fungsi create_parent
seperti berikut.
SELECT partman.create_parent( p_parent_table => 'data_mart.events', p_control => 'created_at', p_type => 'native', p_interval=> 'daily', 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'native'
atau'partman'
. Anda biasanya menggunakan jenisnative
untuk perbaikan performa dan fleksibilitas. Jenispartman
bergantung pada warisan. -
p_interval
– Interval waktu atau rentang bilangan bulat untuk setiap partisi. Contoh nilainya termasukdaily
, per jam, dan sebagainya. -
p_premake
– Jumlah partisi yang akan dibuat terlebih dahulu untuk mendukung sisipan baru.
Untuk keterangan lengkap tentang fungsi create_parent
, lihat Fungsi Pembuatanpg_partman
.
Mengonfigurasi pemeliharaan partisi menggunakan fungsi run_maintenance_proc
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
ekstensi pg_partman
dan ekstensi 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_partman 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 penjelasan langkah demi langkah tentang contoh sebelumnya:
-
Ubah grup parameter yang terkait dengan instans DB Anda dan tambahkan
pg_cron
ke nilai parametershared_preload_libraries
. Perubahan ini mengharuskan instans DB dimulai ulang agar dapat diterapkan. Untuk informasi selengkapnya, lihat Memodifikasi parameter dalam grup parameter DB di Aurora. -
Jalankan perintah
CREATE EXTENSION pg_cron;
menggunakan akun yang memiliki izinrds_superuser
. Langkah ini akan mengaktifkan ekstensipg_cron
. Untuk informasi selengkapnya, lihat Menjadwalkan pemeliharaan dengan ekstensi pg_cron PostgreSQL. -
Jalankan perintah
UPDATE partman.part_config
guna menyesuaikan pengaturanpg_partman
untuk tabeldata_mart.events
. -
Jalankan perintah
SET
. . . Untuk mengonfigurasi tabeldata_mart.events
, dengan klausul ini:-
infinite_time_partitions = true,
– Mengonfigurasi tabel untuk dapat membuat partisi baru secara otomatis tanpa batas. -
retention = '3 months',
– Mengonfigurasi tabel agar memiliki retensi maksimum tiga bulan. -
retention_keep_table=true
– Mengonfigurasi tabel sehingga ketika periode retensi sudah habis, tabel tidak akan dihapus secara otomatis. Sebaliknya, partisi yang lebih lama dari periode retensi hanya dilepaskan dari tabel induk.
-
-
Jalankan perintah
SELECT cron.schedule
. . . untuk membuat panggilan fungsipg_cron
. Panggilan ini menetapkan frekuensi penjadwal menjalankan prosedur pemeliharaanpg_partman
,partman.run_maintenance_proc
. Untuk contoh ini, prosedur berjalan setiap jam.
Untuk keterangan lengkap tentang fungsi run_maintenance_proc
, lihat Fungsi Pemeliharaanpg_partman
.