PolarDB for PostgreSQL (Compatible with Oracle) menggunakan PolarFileSystem (PFS) sebagai lapisan penyimpanannya. Berbeda dari sistem file standar, PFS dioptimalkan untuk pembacaan sekuensial skala besar tetapi memiliki overhead tinggi pada ekstensi halaman kecil yang sering terjadi. Untuk menyesuaikan karakteristik I/O tersebut, PolarDB memperkenalkan tiga optimisasi—read-ahead tabel heap, pre-extension tabel heap, dan pre-extension pembuatan indeks—yang semuanya diaktifkan secara default. Fitur-fitur ini secara bersamaan meningkatkan throughput pemindaian sekuensial dan vacuum hingga dua atau tiga kali lipat, menggandakan throughput pemuatan data, serta meningkatkan kecepatan pembuatan indeks sebesar 30%.
Prasyarat
Sebelum memulai, pastikan kluster Anda memenuhi persyaratan berikut:
PolarDB for PostgreSQL (Compatible with Oracle) 2.0, versi revisi 2.0.14.5.1.0 atau lebih baru
Untuk memeriksa versi revisi Anda, jalankan:
SHOW polardb_version;Atau, periksa versi tersebut di Konsol PolarDB. Jika Anda perlu melakukan upgrade, lihat Upgrade the version.
Ikhtisar
PostgreSQL membaca dan menulis data dalam halaman berukuran 8 KB. Sistem file standar menangani operasi kecil ini secara efisien, tetapi PFS memiliki dua kendala yang membuat operasi 8 KB menjadi mahal:
PFS menghasilkan overhead metadata yang tinggi per ekstensi halaman.
PFS mewajibkan ekstensi halaman merupakan kelipatan 4 MB.
Di PostgreSQL, ukuran minimum untuk ekstensi halaman harus merupakan kelipatan 8 MB, yang tidak kompatibel dengan PFS dan menyebabkan degradasi performa saat menulis tabel atau membuat indeks.
Membaca data dalam potongan 8 KB juga tidak efisien di PFS, yang bekerja paling optimal dengan pembacaan sekuensial skala besar.
Ketiga fitur berikut mengatasi kendala tersebut:
| Fitur | Alamat | Default Parameter | Nilai default | Dampak performa |
|---|---|---|---|---|
| Heap table read-ahead | Pemindaian sekuensial, vacuum, pembuatan indeks | polar_bulk_read_size | 128 KB | 2x–3x untuk vacuum dan pemindaian sekuensial; +18% untuk pembuatan indeks |
| Heap table pre-extension | Pemuatan data dan penulisan yang sering | polar_heap_bulk_extend_size | 4 MB | 2x untuk pemuatan data |
| Index creation pre-extension | Pembuatan indeks B-tree, GIN, GiST, SP-GiST, dan Bloom | polar_index_bulk_extend_size | 4 MB | +30% untuk pembuatan indeks |
Ketiga fitur tersebut diaktifkan secara default. Nilai default telah disesuaikan untuk PFS dan merepresentasikan batas performa maksimum—meningkatkannya melebihi nilai tersebut tidak memberikan peningkatan tambahan. Nonaktifkan fitur hanya jika Anda memiliki alasan operasional tertentu.
Cara kerja
Heap table read-ahead
PostgreSQL biasanya memuat halaman ke dalam kolam buffer satu per satu dalam ukuran 8 KB. Di PFS, pola baca kecil seperti ini tidak efisien. Ketika dua atau lebih halaman perlu dibaca, PolarDB mengelompokkannya menjadi satu operasi baca 128 KB, sehingga mengurangi jumlah total operasi I/O.
Proses ini berjalan dalam empat langkah:
Alokasikan N buffer dari kolam buffer.
Alokasikan wilayah memori kontigu berukuran
N × page sizemenggunakanpalloc, yang selanjutnya disebutp.Baca data berukuran
N × page sizedari tabel heap ke dalampmenggunakan PFS.Salin N halaman dari
pke dalam N buffer.
Pembacaan berikutnya untuk halaman-halaman tersebut langsung mengakses kolam buffer, sehingga menghilangkan I/O disk lebih lanjut.
Diagram berikut menunjukkan alur data:
Heap table pre-extension
Di PostgreSQL standar, ekstensi ruang tabel dilakukan dengan memperluas halaman 8 KB satu per satu. Bahkan dengan ekstensi batch, N halaman tetap memerlukan N operasi I/O. Di PFS, di mana ukuran ekstensi minimum adalah 4 MB, hal ini mengakibatkan overhead I/O yang berlebihan.
Heap table pre-extension mengatasi masalah ini dengan memperluas ruang sekaligus sebesar 4 MB menggunakan antarmuka penulisan bulk PFS. Proses ini berjalan dalam tiga langkah:
Alokasikan N buffer dari kolam buffer tanpa memicu ekstensi sistem file apa pun.
Perluas file dengan menulis halaman bernilai nol dalam satu batch menggunakan antarmuka penulisan file PFS.
Inisialisasi halaman satu per satu, identifikasi ruang yang tersedia, lalu akhiri pre-extension.
Index creation pre-extension
Index creation pre-extension mengikuti pendekatan yang sama dengan heap table pre-extension, tetapi melewati langkah alokasi buffer karena indeks dibangun di kolam buffer sebelum disimpan ke disk.
Proses ini berjalan dalam dua langkah:
Perluas file dengan menulis halaman bernilai nol dalam satu batch menggunakan antarmuka penulisan file PFS.
Tulis halaman indeks yang telah dibangun di kolam buffer ke sistem file.
Jenis indeks yang didukung: B-tree, GIN, GiST, SP-GiST, dan Bloom.
Di versi lama PolarDB for PostgreSQL (Compatible with Oracle), index creation pre-extension hanya mendukung indeks B-tree.
Konfigurasi read-ahead dan pre-extension
Heap table read-ahead
Parameter polar_bulk_read_size mengontrol heap table read-ahead. Nilai default-nya adalah 128 KB, yang merupakan nilai optimal untuk PFS. Meningkatkannya melebihi 128 KB tidak memberikan peningkatan tambahan.
Untuk menonaktifkan heap table read-ahead:
ALTER SYSTEM SET polar_bulk_read_size = 0;
SELECT pg_reload_conf();Untuk mengaktifkan kembali heap table read-ahead dengan ukuran default:
ALTER SYSTEM SET polar_bulk_read_size = '128 KB';
SELECT pg_reload_conf();Untuk memverifikasi nilai saat ini:
SHOW polar_bulk_read_size;Heap table pre-extension
Parameter polar_heap_bulk_extend_size mengontrol heap table pre-extension. Nilai default-nya adalah 4 MB, yang merupakan nilai optimal untuk PFS. Meningkatkannya melebihi 4 MB tidak memberikan peningkatan tambahan.
Di versi lama PolarDB for PostgreSQL (Compatible with Oracle), parameter setara adalah polar_bulk_extend_size.Untuk menonaktifkan heap table pre-extension:
ALTER SYSTEM SET polar_heap_bulk_extend_size = 0;
SELECT pg_reload_conf();Untuk mengaktifkan kembali heap table pre-extension dengan ukuran default:
ALTER SYSTEM SET polar_heap_bulk_extend_size = '4 MB';
SELECT pg_reload_conf();Untuk memverifikasi nilai saat ini:
SHOW polar_heap_bulk_extend_size;Index creation pre-extension
Parameter polar_index_bulk_extend_size mengontrol index creation pre-extension. Nilai default-nya adalah 4 MB, yang merupakan nilai optimal untuk PFS. Meningkatkannya melebihi 4 MB tidak memberikan peningkatan tambahan.
Di versi lama PolarDB for PostgreSQL (Compatible with Oracle), parameter setara adalah polar_index_create_bulk_extend_size. Hanya indeks B-tree yang didukung di versi-versi tersebut.Untuk menonaktifkan pembuatan indeks pra-ekspansi:
ALTER SYSTEM SET polar_index_bulk_extend_size = 0;
SELECT pg_reload_conf();Untuk mengaktifkan kembali index creation pre-extension dengan ukuran default:
ALTER SYSTEM SET polar_index_bulk_extend_size = '4 MB';
SELECT pg_reload_conf();Untuk memverifikasi nilai saat ini:
SHOW polar_index_bulk_extend_size;Tolok ukur performa
Tolok ukur berikut diukur pada kluster PolarDB for PostgreSQL (Compatible with Oracle) yang menjalankan PostgreSQL 14, dengan 8 core dan memori 32 GB, menggunakan set data pgbench berukuran 400 GB.
Heap table read-ahead
Perbandingan performa vacuum pada tabel berukuran 400 GB:

Perbandingan performa pemindaian sekuensial pada tabel berukuran 400 GB:

Kesimpulan:
Heap table read-ahead meningkatkan performa vacuum dan pemindaian sekuensial hingga dua atau tiga kali lipat.
Meningkatkan
polar_bulk_read_sizemelebihi nilai default 128 KB tidak memberikan peningkatan tambahan.
Heap table pre-extension
Perbandingan performa pemuatan data pada tabel berukuran 400 GB:

Kesimpulan:
Heap table pre-extension menggandakan performa pemuatan data.
Meningkatkan
polar_heap_bulk_extend_sizemelebihi nilai default 4 MB tidak memberikan peningkatan tambahan.
Index creation pre-extension
Perbandingan performa pembuatan indeks pada tabel berukuran 400 GB:

Kesimpulan:
Index creation pre-extension meningkatkan performa pembuatan indeks sebesar 30%.
Meningkatkan
polar_index_bulk_extend_sizemelebihi nilai default 4 MB tidak memberikan peningkatan tambahan.