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 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.
Topik
Ikhtisar ekstensi pg_partman PostgreSQL
Anda dapat menggunakan ekstensi pg_partman
PostgreSQL untuk mengotomatiskan 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.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_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. -
Batasan pemeriksaan
ck_valid_operation
guna menerapkan nilai untuk kolom tabeloperation
. -
Dua kunci asing, yang salah satunya (
fk_orga_membership)
) menunjuk ke tabel eksternalorganization
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_parent
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_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 peningkatan 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
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_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 penjelasan langkah demi langkah untuk contoh sebelumnya:
-
Modifikasi grup parameter yang terkait dengan instans DB Anda dan tambahkan
pg_cron
ke nilai parametershared_preload_libraries
. Untuk menerapkan perubahan, instans DB harus dimulai ulang. Untuk informasi selengkapnya, lihat Memodifikasi parameter dalam grup parameter DB di Amazon RDS Aurora. -
Jalankan perintah
CREATE EXTENSION pg_cron;
menggunakan akun yang memiliki izinrds_superuser
. Tindakan 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 berikut:-
infinite_time_partitions = true,
– Mengonfigurasi tabel untuk dapat secara otomatis membuat partisi baru tanpa batas. -
retention = '3 months',
– Mengonfigurasi tabel agar memiliki retensi maksimum tiga bulan. -
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.
-
-
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
.