All Products
Search
Document Center

PolarDB:Read-ahead dan pre-extension

Last Updated:Apr 21, 2026

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:

FiturAlamatDefault ParameterNilai defaultDampak performa
Heap table read-aheadPemindaian sekuensial, vacuum, pembuatan indekspolar_bulk_read_size128 KB2x–3x untuk vacuum dan pemindaian sekuensial; +18% untuk pembuatan indeks
Heap table pre-extensionPemuatan data dan penulisan yang seringpolar_heap_bulk_extend_size4 MB2x untuk pemuatan data
Index creation pre-extensionPembuatan indeks B-tree, GIN, GiST, SP-GiST, dan Bloompolar_index_bulk_extend_size4 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:

  1. Alokasikan N buffer dari kolam buffer.

  2. Alokasikan wilayah memori kontigu berukuran N × page size menggunakan palloc, yang selanjutnya disebut p.

  3. Baca data berukuran N × page size dari tabel heap ke dalam p menggunakan PFS.

  4. Salin N halaman dari p ke 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:

image

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:

  1. Alokasikan N buffer dari kolam buffer tanpa memicu ekstensi sistem file apa pun.

  2. Perluas file dengan menulis halaman bernilai nol dalam satu batch menggunakan antarmuka penulisan file PFS.

  3. 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:

  1. Perluas file dengan menulis halaman bernilai nol dalam satu batch menggunakan antarmuka penulisan file PFS.

  2. 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:

vacuum性能对比

Perbandingan performa pemindaian sekuensial pada tabel berukuran 400 GB:

seqscan性能对比

Kesimpulan:

  • Heap table read-ahead meningkatkan performa vacuum dan pemindaian sekuensial hingga dua atau tiga kali lipat.

  • Meningkatkan polar_bulk_read_size melebihi 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_size melebihi 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_size melebihi nilai default 4 MB tidak memberikan peningkatan tambahan.