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)
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.
CatatanPostgreSQL 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
CatatanPostgreSQL 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:
-
Meminta N buffer di Buffer Pool.
-
Menggunakan
pallocuntuk meminta ruang memori dengan ukuranN*page_sizedi memori. Ruang ini disebutp. -
Menggunakan PFS untuk membaca data secara bulk sebesar
N * page_sizedari heap table dan menyalinnya kep. -
Menyalin isi N halaman di
psatu 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:
-
Meminta N buffer dari Buffer Pool tanpa memicu ekstensi halaman sistem file.
-
Menjalankan ekstensi halaman secara bulk melalui antarmuka penulisan file PFS, dan menulis halaman bernilai nol.
-
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:
-
Saat menulis halaman indeks, lakukan ekstensi halaman secara bulk melalui antarmuka penulisan file PFS, dan tulis halaman bernilai nol.
-
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.CatatanKami 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:

-
Perbandingan performa SeqScan pada tabel 400 GB adalah sebagai berikut:

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:

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:

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