PolarDB for PostgreSQL menyediakan dua jenis antarmuka metode akses tabel (AM): antarmuka penyisipan satu baris dan antarmuka penyisipan massal. Untuk meningkatkan efisiensi penyisipan sejumlah besar tupel, Anda dapat mengaktifkan antarmuka penyisipan massal.
Prasyarat
Kluster PolarDB for PostgreSQL Anda harus menjalankan salah satu versi mesin database berikut:
PolarDB for PostgreSQL 16 dengan versi revisi 2.0.16.8.3.0 atau lebih baru.
PolarDB for PostgreSQL 15 dengan versi revisi 2.0.15.12.4.0 atau lebih baru.
PolarDB for PostgreSQL 14 dengan versi revisi 2.0.14.13.28.0 atau lebih baru.
Anda dapat memeriksa versi revisi kluster Anda di konsol PolarDB atau dengan mengeksekusi pernyataan SHOW polardb_version;. Jika versi revisi tidak memenuhi persyaratan, perbarui.
Informasi latar belakang
Dalam PostgreSQL, sebuah AM mendefinisikan dan mengimplementasikan mekanisme penyimpanan untuk tabel atau indeks. Eksekutor hanya perlu meneruskan baris data atau baris indeks ke table AM dan index AM, tanpa perlu memperhatikan implementasi dari AM tersebut.
Mulai PostgreSQL 12, diperkenalkan AM tabel yang dapat diperluas. Saat ini, hanya heap AM bawaan yang didukung. Heap AM mendukung dua definisi antarmuka berikut:
Antarmuka penyisipan massal: Memproses beberapa baris data sekaligus dan hanya mendukung sintaks
<u>COPY FROM</u>.Antarmuka penyisipan satu baris: Memproses satu baris data pada satu waktu dan berlaku untuk semua sintaks yang melibatkan penyisipan data tabel, kecuali sintaks
<u>COPY FROM</u>.
Saat menyisipkan sejumlah besar tupel, efisiensi algoritma penyisipan satu baris secara signifikan lebih rendah dibandingkan dengan penyisipan massal. Namun, penyisipan massal melibatkan penyimpanan sementara tupel secara massal dan memerlukan penanganan seluruh siklus hidup tupel tersebut.
Untuk mengatasi masalah ini, PolarDB for PostgreSQL memperluas antarmuka AM tabel opsional baru dan mengimplementasikan antarmuka ini untuk heap AM. Antarmuka baru ini memberikan optimasi berikut:
Menyediakan manajemen ujung ke ujung untuk penyisipan massal.
Menggunakan algoritma penyisipan yang lebih efisien dan log tulis-depan (WAL) untuk heap AM.
Akibatnya, sintaks lain yang mungkin menyisipkan beberapa baris data juga dapat menggunakan kemampuan penyisipan batch melalui set antarmuka AM tabel ini. Baik antarmuka penyisipan satu baris maupun antarmuka penyisipan massal dari heap AM mendukung replikasi logis untuk tabel heap.
Catatan penggunaan
Saat ini, sintaks berikut mendukung penggunaan antarmuka AM tabel penyisipan massal:
Apakah sintaks-sintaks ini dapat menggunakan antarmuka AM penyisipan massal tergantung pada nilai parameter wal_level. Saat nilainya adalah logical, sintaks-sintaks ini dapat menggunakan antarmuka penyisipan massal secara default. Saat nilainya bukan logical, Anda dapat menggunakan infrastruktur impor massal untuk mengoptimalkan operasi impor massal.
Cara kerjanya
Algoritma lapisan buffer
Algoritma penyisipan satu baris
Untuk melakukan penyisipan satu baris, ikuti langkah-langkah berikut:
Buat tupel yang akan disisipkan.
Tentukan jumlah ruang yang diperlukan untuk menyimpan tupel pada halaman disk.
Temukan halaman yang memiliki cukup ruang kosong untuk menampung tupel.
Kunci halaman dan tempatkan tupel di halaman tersebut.
Tandai halaman sebagai kotor.
Hasilkan entri log WAL untuk menangkap modifikasi halaman.
Lepaskan kunci pada halaman.
Algoritma penyisipan massal
Untuk melakukan penyisipan massal, ikuti langkah-langkah berikut:
Simpan sementara sekelompok tupel di memori.
Buat informasi tupel secara massal.
Temukan halaman yang memiliki cukup ruang kosong untuk menampung tupel-tupel tersebut.
Kunci halaman dan tempatkan tupel-tupel di halaman tersebut.
Jika masih ada ruang yang cukup di halaman, lanjutkan menyisipkan tupel sampai halaman kehabisan ruang atau semua tupel yang disimpan sementara telah diproses.
Tandai halaman sebagai kotor.
Hasilkan entri log WAL untuk menangkap modifikasi halaman.
Lepaskan kunci pada halaman.
Format log WAL
Log tipe Heap INSERT untuk penyisipan satu baris.
-[ RECORD 1 ]----+-------------------------------------------- start_lsn | 0/40BE24E0 end_lsn | 0/40BE2520 prev_lsn | 0/40BE24B8 xid | 792 resource_manager | Heap record_type | INSERT record_length | 61 main_data_length | 3 fpi_length | 0 description | off: 8, flags: 0x00 block_ref | blkref #0: rel 1663/5/16412 fork main blk 0Log Heap2 MULTI_INSERT untuk penyisipan baris massal. Tipe log ini dapat mencatat beberapa baris data yang disisipkan pada halaman sekaligus.
-[ RECORD 1 ]----+------------------------------------------------------------------ start_lsn | 0/40BE2548 end_lsn | 0/40BE2610 prev_lsn | 0/40BE2520 xid | 793 resource_manager | Heap2 record_type | MULTI_INSERT record_length | 194 main_data_length | 20 fpi_length | 0 description | ntuples: 8, flags: 0x02, offsets: [9, 10, 11, 12, 13, 14, 15, 16] block_ref | blkref #0: rel 1663/5/16412 fork main blk 0
Analisis perbedaan
Algoritma penyisipan massal dapat secara signifikan mengurangi frekuensi penguncian halaman, mengurangi jumlah catatan WAL yang dihasilkan, dan mengoptimalkan kepadatan konten log.
Penggunaan
Parameter polar_enable_tableam_multi_insert menentukan apakah akan mengaktifkan antarmuka AM tabel penyisipan massal, yang diaktifkan secara default:
SHOW polar_enable_tableam_multi_insert;
polar_enable_tableam_multi_insert
-----------------------------------
on
(1 row)