Topik ini memberikan gambaran umum mengenai fitur dan manfaat tabel partisi dalam kluster PolarDB for PostgreSQL.
Pendahuluan
Dalam kluster PolarDB for PostgreSQL, Anda dapat membagi secara fisik sebuah tabel atau indeks menjadi bagian-bagian yang lebih kecil, yang disebut partisi, untuk memudahkan pengelolaan. Setiap partisi merupakan objek yang memiliki nama dan properti penyimpanannya sendiri. Bagi administrator basis data, partisi-partisi tersebut dapat dikelola secara kolektif maupun terpisah, sehingga memberikan fleksibilitas yang lebih besar dalam pekerjaan mereka. Bagi aplikasi, tabel partisi tidak berbeda dari tabel non-partisi. Anda tidak perlu memodifikasi pernyataan SQL atau perintah DML saat melakukan kueri terhadap tabel partisi.
Partisi dari sebuah tabel partisi harus memiliki properti logis yang sama, seperti nama kolom, tipe data, dan batasan, tetapi dapat memiliki properti fisik yang berbeda, seperti status kompresi, pengaturan penyimpanan fisik, dan ruang tabel.
Partisi memberikan manfaat bagi berbagai jenis aplikasi, terutama yang melibatkan volume data yang sangat besar. Untuk basis data pemrosesan transaksi online (OLTP), partisi meningkatkan kemudahan pengelolaan dan ketersediaan. Untuk basis data pemrosesan analitik online (OLAP), manfaat utamanya terletak pada performa dan kemudahan pengelolaan.
Skenario
Anda dapat mempartisi sebuah tabel untuk meningkatkan performa basis data ketika tabel tersebut sangat besar, misalnya melebihi kapasitas memori fisik server basis data. Sebagai contoh, pertimbangkan penggunaan partisi ketika ukuran tabel melebihi 2 TB.
Anda dapat menggunakan tabel partisi ketika sebuah tabel besar menyimpan data historis dan data baru ditambahkan ke partisi terbaru. Misalnya, sebuah tabel besar mungkin menyimpan data historis selama 12 bulan. Data untuk bulan berjalan disimpan dalam partisi terpisah yang dapat diperbarui, sedangkan data untuk bulan-bulan sebelumnya disimpan dalam partisi lain yang bersifat read-only.
Manfaat
Performa lebih tinggi
Partisi dapat secara signifikan meningkatkan performa kueri, terutama ketika baris-baris yang paling sering diakses dapat dibatasi hanya pada satu atau beberapa partisi saja. Partisi menggantikan level atas struktur pohon indeks. Ketika sebuah kueri melibatkan satu atau beberapa partisi tertentu, sistem basis data dapat melakukan pemindaian sekuensial hanya pada partisi-partisi tersebut alih-alih bergantung pada indeks. Hal ini meningkatkan performa dan kemudahan pengelolaan karena sistem memproses chunk data yang berurutan, bukan catatan-catatan yang tersebar di seluruh tabel.
Pengelolaan lebih mudah
Sebagai objek mandiri, partisi dapat dikelola secara individual maupun kolektif, dan operasi DDL dapat dilakukan pada partisi-partisi tersebut, bukan pada seluruh tabel atau indeks. Oleh karena itu, Anda dapat memecah tugas-tugas yang membutuhkan banyak sumber daya, seperti membangun ulang indeks atau tabel. Anda dapat menghapus satu partisi dalam satu waktu. Ketika terjadi masalah, Anda hanya perlu memindahkan partisi yang relevan, bukan seluruh tabel. Anda juga dapat melakukan operasi batch terhadap catatan data dengan partisi sebagai satuannya. Sebagai contoh, ketika ingin menghapus data dari sebuah tabel, Anda cukup menggunakan DROP TABLE untuk menghapus partisi yang relevan atau menggunakan ALTER TABLE DETACH PARTITION untuk melepaskan partisi dari tabel induk. Operasi VACUUM tidak diperlukan untuk membebaskan ruang penyimpanan setelah operasi-operasi tersebut, yang merupakan keunggulan tambahan dibandingkan penghapusan batch.
Konflik sumber daya berkurang
Pada beberapa basis data OLTP, partisi dapat mengurangi konflik sumber daya, misalnya ketika pernyataan DML dieksekusi pada beberapa partisi sekaligus.
Ketersediaan lebih tinggi
Ketika sebuah partisi tidak tersedia, sisa tabel partisi tetap dapat diakses. Pengoptimal kueri secara otomatis mengeluarkan partisi yang tidak tersedia dari rencana kueri untuk menghindari dampak terhadap kueri.
Biaya penyimpanan lebih rendah
Partisi yang jarang diakses dapat di-dump ke media penyimpanan yang lebih lambat dan lebih murah untuk mengurangi biaya.
Perlu diperhatikan bahwa manfaat-manfaat di atas hanya berlaku jika tabel partisi berukuran besar. Kami menyarankan Anda untuk mempartisi sebuah tabel ketika ukurannya mencapai kapasitas memori fisik server basis data Anda.
Cara kerja
Partisi menambahkan kompleksitas pada struktur, tetapi hal ini transparan bagi pengguna. Bagian ini menjelaskan karakteristik dan mekanisme partisi. Memahami informasi ini dapat membantu Anda menggunakan tabel partisi secara efektif.
Contoh 1
CREATE TABLE measurement (
city_id int not null,
logdate date not null,
peaktemp int,
unitsales int
) PARTITION BY RANGE (logdate);
CREATE TABLE measurement_y2006m02 PARTITION OF measurement
FOR VALUES FROM ('2006-02-01') TO ('2006-03-01');
CREATE TABLE measurement_y2006m03 PARTITION OF measurement
FOR VALUES FROM ('2006-03-01') TO ('2006-04-01');
...
CREATE TABLE measurement_y2007m11 PARTITION OF measurement
FOR VALUES FROM ('2007-11-01') TO ('2007-12-01');
CREATE TABLE measurement_y2007m12 PARTITION OF measurement
FOR VALUES FROM ('2007-12-01') TO ('2008-01-01')
TABLESPACE fasttablespace;
CREATE TABLE measurement_y2008m01 PARTITION OF measurement
FOR VALUES FROM ('2008-01-01') TO ('2008-02-01')
WITH (parallel_workers = 4)
TABLESPACE fasttablespace;Kunci partisi
Kunci partisi adalah satu kolom atau kombinasi beberapa kolom yang menentukan partisi tempat setiap baris didistribusikan. PolarDB for PostgreSQL secara otomatis mengarahkan operasi seperti penyisipan, pembaruan, atau penghapusan ke partisi yang relevan berdasarkan kunci partisi tersebut.
Pada Contoh 1, logdate adalah kunci partisi dari tabel partisi bernama measurement. Batas-batas partisi dari tabel measurement ditentukan oleh nilai-nilai logdate.
Metode partisi
PolarDB for PostgreSQL mendukung berbagai metode partisi.
Partisi rentang
Partisi rentang mempartisi sebuah tabel berdasarkan rentang nilai kunci partisi, seperti rentang tanggal atau rentang pengenal bisnis Anda. Batas setiap rentang bersifat inklusif pada ujung bawah dan eksklusif pada ujung atas. Sebagai contoh, jika rentang nilai partisi pertama adalah dari 1 hingga 10, dan rentang nilai partisi kedua adalah dari 10 hingga 20, maka nilai 10 termasuk dalam partisi kedua, bukan partisi pertama. Tabel
measurementpada Contoh 1 merupakan tabel terpartisi rentang.Partisi rentang interval adalah metode partisi yang dikembangkan dari partisi rentang. Untuk informasi lebih lanjut, lihat Partisi rentang interval.
Partisi daftar
Contoh 2
CREATE TABLE department(deptno INT4 Primary Key,dname VARCHAR(50), location VARCHAR(100)) PARTITION BY LIST (deptno); CREATE TABLE department_p1 partition of department for values in (10, 20); CREATE TABLE department_p1 partition of department for values in (30, 40);Partisi daftar mempartisi sebuah tabel berdasarkan daftar nilai diskrit. Tabel
departmentpada Contoh 2 merupakan tabel terpartisi daftar. Dua partisi dari tabel tersebut secara eksplisit didefinisikan untuk hanya berisi nilai-nilai tertentu dari kunci partisi. Sebagai contoh, partisidepartment_p1hanya menyimpan baris-baris di mana nilaideptnoadalah10atau20, dan partisidepartment_p2hanya menyimpan baris-baris di mana nilaideptnoadalah30atau40.Partisi hash
Pada partisi hash, Anda menggunakan fungsi hash untuk menghitung nilai hash dari kunci partisi. Kemudian, Anda membagi nilai hash tersebut dengan modulus tertentu dan menetapkan baris ke partisi berdasarkan sisa pembagian tersebut.
Contoh 3
create table idxpart (i int) partition by hash (i); create table idxpart0 partition of idxpart for values with (modulus 2, remainder 0); create table idxpart1 partition of idxpart for values with (modulus 2, remainder 1);Pada contoh ini, tabel
idxpartdipartisi secara hash. Partisiidxpart0hanya menyimpan baris-baris di mana nilai hash dariidibagi 2 menghasilkan sisa 0. Partisiidxpart1hanya menyimpan baris-baris di mana nilai hash dariidibagi 2 menghasilkan sisa 1.
Partisi multi-level
Partisi multi-level mengacu pada praktik mempartisi sebuah tabel yang sudah dipartisi sebelumnya.
PolarDB for PostgreSQL mendukung jumlah level partisi yang tidak terbatas, tetapi kami menyarankan agar Anda tidak membuat lebih dari tiga level. Level partisi yang berlebihan dapat mengurangi kemudahan pengelolaan partisi dan berdampak negatif terhadap performa kueri.
Anda dapat menggunakan metode partisi yang berbeda pada level partisi yang berbeda. Sebagai contoh, Anda dapat menggunakan partisi rentang untuk level pertama, partisi hash untuk level kedua, dan partisi daftar untuk level ketiga.
Contoh 4
CREATE TABLE measurement (
city_id int not null,
logdate date not null,
peaktemp int,
unitsales int
) PARTITION BY RANGE (logdate);
CREATE TABLE measurement_y2006m03 PARTITION OF measurement
FOR VALUES FROM ('2006-03-01') TO ('2006-04-01') PARTITION BY Hash (city_id);
CREATE TABLE measurement_y2006m03_hash1 PARTITION OF measurement_y2006m03
for values with (modulus 2, remainder 0) PARTITION BY List (peaktemp);
CREATE TABLE measurement_y2006m03_hash1_l1 PARTITION OF measurement_y2006m03_hash1 for values in (10, 20);Sintaks
Untuk informasi mengenai pernyataan-pernyataan untuk mengelola partisi, seperti membuat, menambahkan, menggabungkan, memisahkan, dan menghapus partisi, lihat Daftar perintah untuk tabel partisi.