All Products
Search
Document Center

PolarDB:Read-ahead dan pre-extension

Last Updated:Aug 21, 2026

Topik ini menjelaskan ikhtisar, prinsip, dan penggunaan heap table read-ahead, heap table pre-extension, serta index creation pre-extension.

Prasyarat

Versi PolarDB for PostgreSQL yang didukung adalah sebagai berikut:

  • PostgreSQL 18 (kernel minor version 2.0.18.0.1.0 dan yang lebih baru)

  • PostgreSQL 17 (kernel minor version 2.0.17.2.1.0 dan yang lebih baru)

  • PostgreSQL 16 (kernel minor version 2.0.16.6.2.0 dan yang lebih baru)

  • PostgreSQL 15 (kernel minor version 2.0.15.12.4.0 dan yang lebih baru)

  • PostgreSQL 14 (kernel minor version 2.0.14.5.1.0 dan yang lebih baru)

  • PostgreSQL 11 (kernel minor version 2.0.11.2.0.0 dan yang lebih baru)

Catatan

Anda dapat melihat kernel minor version di Konsol, atau gunakan pernyataan SHOW polardb_version; untuk melihatnya. Jika persyaratan kernel minor version tidak terpenuhi, upgrade kernel minor version.

Informasi latar belakang

PolarDB for PostgreSQL menggunakan PolarFS (selanjutnya disebut PFS) sebagai sistem file pada lapisan dasar. Berbeda dengan sistem file standalone seperti ext4, PFS memiliki overhead pembaruan metadata yang besar selama proses ekstensi halaman. Selain itu, granularitas minimum ekstensi halaman PFS adalah 4 MB, sedangkan granularitas ekstensi halaman PostgreSQL sebesar 8 KB tidak sesuai dengan PFS dan menyebabkan degradasi performa saat menulis tabel atau membuat indeks. Di sisi lain, PFS memiliki efisiensi I/O yang lebih tinggi ketika membaca blok halaman dalam jumlah besar.

Untuk menyesuaikan dengan karakteristik tersebut, PolarDB for PostgreSQL menghadirkan fitur heap table read-ahead, heap table pre-extension, dan index creation pre-extension, sehingga PolarDB for PostgreSQL yang berjalan di atas PFS dapat mencapai performa lebih baik.

Ikhtisar

  • Heap table read-ahead

    Saat PostgreSQL membaca heap table, halaman dibaca dari sistem file ke kolam buffer memori (Buffer Pool) dalam satuan halaman 8 KB. PFS tidak terlalu efisien untuk operasi I/O volume kecil seperti ini. Oleh karena itu, PolarDB for PostgreSQL merancang bulk read-ahead untuk heap table agar sesuai dengan PFS.

    Ketika jumlah halaman yang akan dibaca lebih dari 1, bulk read-ahead dipicu, dan data sebesar 128 KB dibaca ke dalam buffer pool dalam satu operasi I/O. Read-ahead dapat meningkatkan performa hingga kira-kira dua kali lipat dalam skenario Sequential Scan dan Vacuum, serta memberikan peningkatan performa sebesar 18% dalam skenario pembuatan indeks.

    Catatan

    PostgreSQL 17 saat ini tidak mendukung bulk reading heap table.

  • Heap table pre-extension

    Di PostgreSQL, selama ekstensi ruang tabel, halaman 8 KB diminta dan diperluas satu per satu. Bahkan dengan dukungan bulk page extension dari PostgreSQL, satu ekstensi N-halaman tetap melibatkan N operasi I/O. Jenis ekstensi halaman ini tidak sesuai dengan karakteristik PFS yang memiliki granularitas minimum ekstensi halaman sebesar 4 MB. Oleh karena itu, PolarDB for PostgreSQL merancang bulk pre-extension untuk heap table.

    Selama ekstensi heap table, halaman sebesar 4 MB diperluas dalam satu operasi I/O. Dalam skenario penulisan tabel yang sering (seperti pemuatan data), hal ini dapat meningkatkan performa hingga dua kali lipat.

  • Index creation pre-extension

    Index creation pre-extension mirip dengan heap table pre-extension. Fitur ini dirancang khusus untuk mengoptimalkan proses pembuatan indeks pada PFS. Selama ekstensi halaman dalam pembuatan indeks, halaman sebesar 4 MB diperluas dalam satu operasi I/O. Desain ini dapat memberikan peningkatan performa sebesar 30% selama pembuatan indeks.

    Index creation pre-extension saat ini mendukung jenis indeks berikut:

    • B-Tree

    • GIN

    • GiST

    • SP-Gist

    • Bloom

    Catatan

    PostgreSQL 11 Index creation pre-extension hanya mendukung indeks B-Tree.

Prinsip

  • Heap table read-ahead

    Langkah-langkah implementasi heap table read-ahead terutama dibagi menjadi empat langkah berikut:

    1. Meminta N buffer di Buffer Pool.

    2. Menggunakan palloc untuk meminta ruang memori dengan ukuran N*page_size di memori. Ruang ini disebut p.

    3. Menggunakan PFS untuk membaca data secara bulk sebesar N * page_size dari heap table dan menyalinnya ke p.

    4. Menyalin isi N halaman di p satu per satu ke N buffer yang diminta dari Buffer Pool.

    Operasi baca berikutnya langsung mengenai buffer tersebut. Diagram alur data adalah sebagai berikut:

  • Heap table pre-extension

    Langkah-langkah implementasi pre-extension terutama dibagi menjadi tiga langkah berikut:

    1. Meminta N buffer dari Buffer Pool tanpa memicu ekstensi halaman sistem file.

    2. Menjalankan ekstensi halaman secara bulk melalui antarmuka penulisan file PFS, dan menulis halaman bernilai nol.

    3. Menginisialisasi halaman yang diminta satu per satu, menandai ruang yang tersedia pada halaman, dan menyelesaikan pre-extension.

  • Index creation pre-extension

    Langkah-langkah implementasi index creation pre-extension mirip dengan pre-extension, tetapi tidak melibatkan permintaan buffer. Langkah-langkahnya adalah sebagai berikut:

    1. Saat menulis halaman indeks, lakukan ekstensi halaman secara bulk melalui antarmuka penulisan file PFS, dan tulis halaman bernilai nol.

    2. Tuliskan halaman indeks yang telah dibuat di Buffer Pool ke dalam sistem file.

Panduan penggunaan

  • Heap table read-ahead

    Nama parameter heap table read-ahead adalah polar_bulk_read_size. Fitur ini diaktifkan secara default, dengan ukuran default 128 KB.

    Catatan

    Kami tidak menyarankan Anda mengubah parameter ini sendiri. Nilai 128 KB merupakan nilai optimal untuk PFS, dan penyesuaian manual tidak memberikan peningkatan performa.

    • Nonaktifkan fitur heap table read-ahead.

      ALTER SYSTEM SET polar_bulk_read_size = 0;
      SELECT pg_reload_conf();
    • Aktifkan fitur heap table read-ahead dan atur ukuran read-ahead menjadi 128 KB.

      ALTER SYSTEM SET polar_bulk_read_size = '128 KB';
      SELECT pg_reload_conf();
  • Heap table pre-extension

    Nama parameter heap table pre-extension adalah polar_heap_bulk_extend_size. Fitur ini diaktifkan secara default, dengan ukuran pre-extension default sebesar 4 MB.

    Catatan
    • Kami tidak menyarankan Anda mengubah nilai parameter ini sendiri. Nilai 4 MB merupakan nilai optimal untuk PFS.

    • Pada PostgreSQL 11, nama parameternya adalah polar_bulk_extend_size.

    • Nonaktifkan fitur heap table pre-extension.

      ALTER SYSTEM SET polar_heap_bulk_extend_size = 0;
      SELECT pg_reload_conf();
    • Aktifkan fitur heap table pre-extension dan atur ukuran pre-extension menjadi 4 MB.

      ALTER SYSTEM SET polar_heap_bulk_extend_size = '4 MB';
      SELECT pg_reload_conf();
  • Index creation pre-extension

    Nama parameter index creation pre-extension adalah polar_index_bulk_extend_size. Fitur ini diaktifkan secara default. Ukuran index creation pre-extension default adalah 4 MB.

    Catatan
    • Kami tidak menyarankan Anda mengubah nilai parameter ini sendiri. Nilai 4 MB merupakan nilai optimal untuk PFS.

    • Pada PostgreSQL 11, nama parameternya adalah polar_index_create_bulk_extend_size.

    • Nonaktifkan fitur index creation pre-extension.

      ALTER SYSTEM SET polar_index_bulk_extend_size = 0;
      SELECT pg_reload_conf();
    • Aktifkan fitur index creation pre-extension dan atur ukuran pre-extension menjadi 4 MB.

      ALTER SYSTEM SET polar_index_bulk_extend_size = '4 MB';
      SELECT pg_reload_conf();

Perbandingan performa

Untuk menunjukkan peningkatan performa dari heap table read-ahead, heap table pre-extension, dan index creation pre-extension, pengujian dilakukan pada kluster PolarDB for PostgreSQL versi PostgreSQL 14.

  • Spesifikasi: 8 core dan memori 32 GB.

  • Skema pengujian: pengujian pgbench 400 GB.

  • Heap table read-ahead

    • Perbandingan performa Vacuum pada tabel 400 GB adalah sebagai berikut:Vacuum performance comparison

    • Perbandingan performa SeqScan pada tabel 400 GB adalah sebagai berikut:SeqScan performance comparison

    Kesimpulan:

    • Heap table read-ahead meningkatkan performa 1 hingga 2 kali lipat dalam skenario Vacuum dan SeqScan.

    • Menambah ukuran heap table read-ahead melebihi nilai default 128 KB tidak memberikan peningkatan performa yang signifikan.

  • Heap table pre-extension

    Perbandingan performa pemuatan data pada tabel 400 GB adalah sebagai berikut:Data loading performance comparison

    Kesimpulan:

    • Heap table pre-extension meningkatkan performa hingga dua kali lipat dalam skenario pemuatan data.

    • Menambah ukuran heap table pre-extension melebihi nilai default 4 MB tidak memberikan peningkatan performa yang signifikan.

  • Index creation pre-extension

    Perbandingan performa pembuatan indeks pada tabel 400 GB adalah sebagai berikut:Index creation performance comparison

    Kesimpulan:

    • Index creation pre-extension dapat memberikan peningkatan performa sebesar 30% dalam skenario pembuatan indeks.

    • Menambah ukuran index creation pre-extension melebihi nilai default 4 MB tidak memberikan peningkatan performa yang signifikan.