All Products
Search
Document Center

PolarDB:Read-ahead dan pre-extension

Last Updated:Jul 02, 2025

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)

Catatan

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

    Catatan

    PostgreSQL 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

    Catatan

    Di 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:

    1. Minta N buffer dari buffer pool.

    2. Gunakan palloc untuk meminta ruang di memori yang berukuran N × Ukuran halaman dan namai ruang tersebut sebagai p.

    3. Gunakan PFS untuk membaca data berukuran N × Ukuran halaman dari tabel heap dan salin data tersebut ke p.

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

    1. Minta N buffer dari buffer pool tanpa memicu ekstensi halaman sistem file.

    2. Lakukan ekstensi halaman batch dengan menggunakan antarmuka tulis file PFS dan tulis semua halaman nol.

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

    1. Lakukan ekstensi halaman batch dengan menggunakan antarmuka tulis file PFS dan tulis semua halaman nol.

    2. Tulis halaman indeks yang dibangun di buffer pool ke sistem file.

Penggunaan

  • Heap table read-ahead

    Parameter polar_bulk_read_size terkait dengan heap table read-ahead. Heap table read-ahead diaktifkan secara default. Nilai default parameter ini adalah 128 KB.

    Catatan

    Kami 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_size terkait dengan heap table pre-extension. Heap table pre-extension diaktifkan secara default. Nilai default parameter ini adalah 4 MB.

    Catatan

    Kami merekomendasikan agar Anda tidak mengubah nilai parameter ini. 4 MB adalah nilai optimal untuk PFS.

    Di PostgreSQL 11, parameter polar_bulk_extend_size digunakan.

    • 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_size terkait dengan index creation pre-extension. Index creation pre-extension diaktifkan secara default. Nilai default parameter ini adalah 4 MB.

    Catatan

    Kami merekomendasikan agar Anda tidak mengubah nilai parameter ini. 4 MB adalah nilai optimal untuk PFS.

    Di PostgreSQL 11, parameter polar_index_create_bulk_extend_size digunakan.

    • 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: vacuum性能对比

    • Perbandingan performa untuk sequential scan pada tabel 400 GB: seqscan性能对比

    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.