Topik ini menjelaskan heap table read-ahead, heap table pre-extension, dan index creation pre-extension.
Prasyarat
Kluster PolarDB for PostgreSQL Anda harus menggunakan salah satu mesin berikut:
PostgreSQL 16 (versi revisi 2.0.16.6.2.0 atau lebih baru)
PostgreSQL 15 (versi revisi 2.0.15.12.4.0 atau lebih baru)
PostgreSQL 14 (versi revisi 2.0.14.5.1.0 atau lebih baru)
PostgreSQL 11 (versi revisi 2.0.11.2.0.0 atau lebih baru)
Anda dapat memeriksa versi revisi kluster Anda di konsol PolarDB atau dengan mengeksekusi pernyataan SHOW polardb_version;. Tingkatkan versi jika diperlukan menggunakan langkah ini.
Informasi latar belakang
PolarDB for PostgreSQL menggunakan PolarFileSystem (PFS) sebagai sistem file-nya. Tidak seperti sistem file mandiri seperti ext4, PFS membutuhkan overhead tinggi untuk pembaruan metadata selama ekstensi halaman. Di PFS, ukuran minimum untuk ekstensi halaman adalah kelipatan dari 4 MB. Namun, di PostgreSQL, ukuran minimum untuk ekstensi halaman adalah kelipatan dari 8 MB. Hal ini tidak cocok untuk PFS dan menyebabkan penurunan performa dalam penulisan tabel atau pembuatan indeks. PFS lebih efisien dalam I/O untuk membaca halaman besar.
Berdasarkan karakteristik tersebut, PolarDB for PostgreSQL menyediakan fitur heap table read-ahead, heap table pre-extension, dan index creation pre-extension, sehingga PolarDB for PostgreSQL dapat memberikan performa yang lebih baik pada PFS.
Ikhtisar
Heap table read-ahead
Saat PostgreSQL membaca tabel heap, ia membaca halaman dari sistem file ke memory buffer pool dalam unit 8 KB. PFS tidak efisien untuk operasi I/O dengan jumlah data kecil. Oleh karena itu, PolarDB for PostgreSQL menggunakan heap table read-ahead untuk beradaptasi dengan PFS.
Saat dua halaman atau lebih akan dibaca, batch read-ahead dipicu, dan 128 KB data dibaca dalam setiap I/O ke buffer pool. Batch read-ahead melipatgandakan performa sequential scan dan vacuum, serta meningkatkan performa pembuatan indeks sebesar 18%.
CatatanPostgreSQL 17 tidak mendukung heap table read-ahead.
Heap table pre-extension
Di PostgreSQL, halaman 8 KB diterapkan dan diperluas satu per satu selama ekstensi tablespace. Bahkan jika PostgreSQL mendukung ekstensi halaman secara batch, N operasi I/O diperlukan dalam tugas memperluas N halaman. Hal ini tidak sesuai untuk PFS yang menggunakan ukuran ekstensi halaman minimum 4 MB. Oleh karena itu, PolarDB for PostgreSQL menggunakan heap table pre-extension.
Dalam ekstensi tabel heap, I/O memperluas halaman 4 MB setiap kali. Dalam skenario di mana tabel sering ditulis (misalnya, saat data dimuat), performa dapat dilipatgandakan.
Index creation pre-extension
Index creation pre-extension mirip dengan heap table pre-extension. Index creation pre-extension mengoptimalkan proses pembuatan indeks terutama untuk PFS. Dalam index creation pre-extension, I/O memperluas halaman 4 MB setiap kali. Ini dapat meningkatkan performa pembuatan indeks hingga 30%.
Index creation pre-extension mendukung jenis indeks berikut:
B-Tree
GIN
GiST
SP-Gist
Bloom
CatatanDi PostgreSQL 11, index creation pre-extension hanya mendukung B-tree indexes. Jenis indeks lainnya tidak didukung.
Cara kerjanya
Heap table read-ahead
Heap table read-ahead diimplementasikan dalam empat langkah:
Minta N buffer dari buffer pool.
Gunakan
pallocuntuk meminta ruang di memori yang berukuranN × Ukuran halamandan namai ruang tersebut sebagaip.Gunakan PFS untuk membaca data berukuran
N × Ukuran halamandari tabel heap dan salin data tersebut kep.Salin N halaman di
pke N buffer yang Anda minta dari buffer pool.
Operasi baca berikutnya langsung mengenai buffer. Gambar berikut menunjukkan aliran data:
Heap table pre-extension
Heap table pre-extension diimplementasikan dalam tiga langkah:
Minta N buffer dari buffer pool tanpa memicu ekstensi halaman sistem file.
Lakukan ekstensi halaman batch dengan menggunakan antarmuka tulis file PFS dan tulis semua halaman nol.
Inisialisasi halaman satu per satu, identifikasi ruang yang tersedia dari halaman, dan hentikan proses pre-extension.
Index creation pre-extension
Index creation pre-extension diimplementasikan mirip dengan heap table pre-extension, tetapi tidak perlu meminta buffer. Langkah-langkahnya adalah sebagai berikut:
Lakukan ekstensi halaman batch dengan menggunakan antarmuka tulis file PFS dan tulis semua halaman nol.
Tulis halaman indeks yang dibangun di buffer pool ke sistem file.
Penggunaan
Heap table read-ahead
Parameter
polar_bulk_read_sizeterkait dengan heap table read-ahead. Heap table read-ahead diaktifkan secara default. Nilai default parameter ini adalah 128 KB.CatatanKami merekomendasikan agar Anda tidak mengubah nilai parameter ini. 128 KB adalah nilai optimal untuk PFS.
Nonaktifkan heap table read-ahead.
ALTER SYSTEM SET polar_bulk_read_size = 0; SELECT pg_reload_conf();Aktifkan 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
Parameter
polar_heap_bulk_extend_sizeterkait dengan heap table pre-extension. Heap table pre-extension diaktifkan secara default. Nilai default parameter ini adalah 4 MB.CatatanKami merekomendasikan agar Anda tidak mengubah nilai parameter ini. 4 MB adalah nilai optimal untuk PFS.
Di PostgreSQL 11, parameter
polar_bulk_extend_sizedigunakan.Nonaktifkan heap table pre-extension.
ALTER SYSTEM SET polar_heap_bulk_extend_size = 0; SELECT pg_reload_conf();Aktifkan 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
Parameter
polar_index_bulk_extend_sizeterkait dengan index creation pre-extension. Index creation pre-extension diaktifkan secara default. Nilai default parameter ini adalah 4 MB.CatatanKami merekomendasikan agar Anda tidak mengubah nilai parameter ini. 4 MB adalah nilai optimal untuk PFS.
Di PostgreSQL 11, parameter
polar_index_create_bulk_extend_sizedigunakan.Nonaktifkan index creation pre-extension.
ALTER SYSTEM SET polar_index_bulk_extend_size = 0; SELECT pg_reload_conf();Aktifkan 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 hasil peningkatan performa dari heap table read-ahead, heap table pre-extension, dan index creation pre-extension, pengujian performa dilakukan pada kluster PolarDB for PostgreSQL yang menjalankan PostgreSQL 14.
Spesifikasi kluster: 8 core dan 32 GB memori.
Lingkungan pengujian: 400 GB pgbench.
Heap table read-ahead
Perbandingan performa untuk vacuum pada tabel 400 GB:

Perbandingan performa untuk sequential scan pada tabel 400 GB:

Kesimpulan:
Heap table read-ahead melipatgandakan atau tripelkan performa untuk vacuum dan sequential scan.
Saat ukuran read-ahead melebihi nilai default 128 KB, tidak ada peningkatan performa signifikan yang terjadi.
Heap table pre-extension
Perbandingan performa untuk pemuatan data pada tabel 400 GB:

Kesimpulan:
Heap table pre-extension melipatgandakan performa untuk pemuatan data.
Saat ukuran pre-extension melebihi nilai default 4 MB, tidak ada peningkatan performa signifikan yang terjadi.
Index creation pre-extension
Perbandingan performa untuk pembuatan indeks pada tabel 400 GB:

Kesimpulan:
Index creation pre-extension meningkatkan performa untuk pembuatan indeks sebesar 30%.
Saat ukuran pre-extension melebihi nilai default 4 MB, tidak ada peningkatan performa signifikan yang terjadi.