PolarDB for PostgreSQL menyertakan antarmuka penyisipan baris tunggal dan bulk insert dalam definisi Table AM-nya. Saat memasukkan banyak tuple, Anda dapat mengaktifkan antarmuka bulk insert untuk meningkatkan efisiensi penyisipan data.
Applicability
Versi PolarDB for PostgreSQL yang didukung adalah sebagai berikut:
PostgreSQL 17 (minor engine version 2.0.17.2.2.1 atau lebih baru)
PostgreSQL 16 (minor engine version 2.0.16.8.3.0 atau lebih baru)
PostgreSQL 15 (minor engine version 2.0.15.12.4.0 atau lebih baru)
PostgreSQL 14 (minor engine version 2.0.14.13.28.0 atau lebih baru)
Anda dapat melihat minor engine version di konsol atau dengan menjalankan pernyataan SHOW polardb_version;. Jika minor engine version tidak memenuhi persyaratan, upgrade minor engine version.
Background
Access Method (AM) mendefinisikan dan mengimplementasikan cara tabel dan indeks disimpan di PostgreSQL. Executor meneruskan baris data atau entri indeks ke Table AM dan Index AM. Executor tidak perlu mengetahui implementasi internal AM tersebut.
PostgreSQL 12 dan versi yang lebih baru memperkenalkan Table AM yang dapat diperluas. Saat ini hanya menyediakan dukungan bawaan untuk Heap AM. Heap AM mendukung dua antarmuka:
Antarmuka bulk insert: Memproses beberapa baris sekaligus. Hanya mendukung sintaks
COPY FROM.Antarmuka penyisipan baris tunggal: Memproses satu baris dalam satu waktu. Antarmuka ini berlaku untuk semua sintaks penyisipan data kecuali
COPY FROM.
Namun, algoritma penyisipan baris tunggal jauh lebih tidak efisien dibandingkan algoritma bulk insert saat memasukkan banyak tuple. Penyisipan data secara massal melibatkan penempatan tuple dalam batch dan memerlukan kontrol lifecycle yang lengkap.
Untuk mengatasi masalah ini, PolarDB for PostgreSQL memperluas Table AM dengan antarmuka opsional baru dan mengimplementasikannya untuk Heap AM. Antarmuka Table AM yang baru menyediakan optimasi berikut:
Mengimplementasikan kontrol lifecycle yang lengkap untuk bulk insert.
Menggunakan algoritma penyisipan yang lebih efisien dan format Write-Ahead Log (WAL) dalam Heap AM.
Akibatnya, sintaks multi-row lainnya juga dapat memanfaatkan kemampuan bulk insert melalui antarmuka Table AM ini. Baik antarmuka penyisipan baris tunggal maupun bulk insert dari Heap AM mendukung logical replication untuk tabel heap.
Usage instructions
Table AM mendukung bulk insert menggunakan sintaks berikut:
Sintaks-sintaks ini menggunakan antarmuka bulk insert ketika parameter wal_level diatur ke logical. Jika parameter diatur ke nilai lain, bulk import infrastructure digunakan untuk mengoptimalkan operasi bulk import.
How it works
Buffer layer algorithm
Single-row insert algorithm
Langkah-langkahnya adalah sebagai berikut:
Isi informasi tuple.
Hitung ruang kosong yang dibutuhkan untuk tuple tersebut.
Temukan halaman yang dapat menampung tuple tersebut.
Kunci halaman tersebut dan tempatkan tuple di dalamnya.
Tandai halaman sebagai dirty.
Buat catatan WAL untuk modifikasi halaman tersebut.
Lepaskan kunci halaman.
Bulk insert algorithm
Langkah-langkahnya adalah sebagai berikut:
Tempatkan batch tuple di memori.
Isi informasi tuple untuk batch tersebut.
Temukan halaman yang dapat menampung tuple-tuple tersebut.
Kunci halaman tersebut dan tempatkan tuple-tuple di dalamnya.
Jika halaman memiliki ruang yang cukup, teruskan penempatan tuple hingga halaman penuh atau seluruh tuple yang distage telah dimasukkan.
Tandai halaman sebagai dirty.
Buat catatan WAL untuk modifikasi halaman tersebut.
Lepaskan kunci halaman.
WAL log format
Penyisipan single-row mencatat log tipe Heap INSERT:
-[ 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 0Penyisipan massal mencatat log tipe Heap2 MULTI_INSERT. Tipe log ini dapat mencatat beberapa baris yang dimasukkan ke dalam satu halaman dalam satu operasi:
-[ 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
Difference analysis
Algoritma bulk insert secara signifikan mengurangi frekuensi penguncian halaman. Algoritma ini juga mengurangi jumlah catatan WAL yang dihasilkan dan membuat konten log lebih ringkas.
How to use
Parameter polar_enable_tableam_multi_insert mengontrol apakah antarmuka Table AM bulk insert diaktifkan. Parameter ini diaktifkan secara default:
SHOW polar_enable_tableam_multi_insert;
polar_enable_tableam_multi_insert
-----------------------------------
on
(1 row)