PolarDB for PostgreSQL menyediakan infrastruktur impor massal.
Cakupan
Fitur ini tersedia pada kluster PolarDB for PostgreSQL Anda jika menjalankan salah satu versi mesin minor berikut:
PostgreSQL 18 dengan versi mesin minor 2.0.18.0.1.0 atau yang lebih baru
PostgreSQL 17 dengan versi mesin minor 2.0.17.2.1.0 atau yang lebih baru
PostgreSQL 16 dengan versi mesin minor 2.0.16.6.2.0 atau lebih baru
PostgreSQL 15 dengan versi mesin minor 2.0.15.12.4.0 atau lebih baru
PostgreSQL 14 dengan versi mesin minor 2.0.14.13.28.0 atau lebih baru
Anda dapat memeriksa versi mesin minor kluster Anda di Konsol PolarDB atau dengan mengeksekusi pernyataan
SHOW polardb_version;.Jika kluster Anda menjalankan versi mesin minor yang lebih lama, gunakan salah satu solusi berikut berdasarkan engine database Anda:
PostgreSQL 15 dan yang lebih baru: Upgrade versi mesin minor.
PostgreSQL 14 dan yang lebih lama: gunakan create or refresh materialized views for bulk writes.
Latar Belakang
Saat melakukan impor massal data ke objek baru dalam transaksi yang belum dikomit, objek tersebut tidak terlihat oleh proses lain karena isolasi transaksi. PolarDB for PostgreSQL memanfaatkan karakteristik ini untuk menerapkan optimisasi terarah di berbagai lapisan proses impor massal data.
PolarDB for PostgreSQL menyediakan infrastruktur impor massal tujuan umum untuk objek yang hanya terlihat dalam proses saat ini. Infrastruktur ini secara signifikan meningkatkan performa impor massal dengan melewati manajemen buffer, mengonstruksi halaman secara massal, memperluas halaman penyimpanan secara massal, mencatat catatan Write-Ahead Logging (WAL) secara massal, serta mengubah jalur sinkron menjadi operasi asinkron.
Catatan penggunaan
Sintaks berikut menggunakan infrastruktur ini:
CREATE INDEXREINDEXVACUUM FULLALTER TABLE SET TABLESPACECREATE MATERIALIZED VIEWREFRESH MATERIALIZED VIEW- Catatan
Penggunaan infrastruktur impor massal oleh pernyataan CREATE TABLE AS atau SELECT INTO bergantung pada nilai parameter
wal_level. Jika parameter ini diatur ke nilai yang lebih rendah darilogical, pernyataan tersebut menggunakan impor massal secara default. Jika parameter ini diatur kelogical, pernyataan tersebut menggunakan antarmuka bulk insert dari infrastruktur Multi-Insert Table AM secara default.
Cara kerjanya
Melewati manajemen buffer
Karena data yang diimpor tidak perlu terlihat oleh proses lain sebelum transaksi dikomit, data tersebut dapat diproses langsung di memori privat proses selama konstruksi halaman. Hal ini menghindari alokasi halaman dari Buffer Pool memori bersama. Dengan melewati manajemen buffer, persaingan resource lock dapat dihindari dan efisiensi konstruksi halaman meningkat secara signifikan.
Perluasan halaman secara massal
Mekanisme impor massal tradisional biasanya menulis data halaman demi halaman. Setiap kali sebuah halaman penuh, ekstensi satu halaman diminta melalui lapisan manajemen penyimpanan. Karena latensi tinggi pada penyimpanan cloud, operasi ekstensi halaman demi halaman ini menyebabkan overhead I/O wait yang signifikan pada jalur utama. PolarDB for PostgreSQL melakukan pra-agregasi beberapa halaman data di memori privat proses. Ketika data yang terakumulasi mencapai ambang batas, sistem melakukan ekstensi halaman massal melalui lapisan manajemen penyimpanan. Pendekatan ini secara efektif mendistribusikan latensi ekstensi halaman tunggal.
Pencatatan log WAL secara massal
Pada mekanisme impor massal tradisional, operasi impor tabel heap maupun indeks biasanya mencatat data baris demi baris. Artinya, catatan WAL terpisah dihasilkan untuk setiap baris. Selama konstruksi halaman di memori privat, suatu proses menggabungkan beberapa baris menjadi satu halaman dan melakukan pra-agregasi beberapa halaman untuk persistensi. Oleh karena itu, PolarDB for PostgreSQL menggunakan catatan WAL bertipe XLOG_FPI untuk mencatat halaman-halaman tersebut secara massal setelah dikonstruksi. Jenis catatan WAL ini berisi seluruh data halaman, bukan perubahan inkremental pada halaman tersebut. Dibandingkan metode pencatatan baris demi baris tradisional, pendekatan ini lebih ringkas dan secara efektif mengurangi overhead metadata WAL.
Mengubah jalur utama menjadi asinkron
Ketika suatu transaksi dikomit, halaman yang dikonstruksi di memori privat harus menjadi terlihat oleh proses lain. Secara teori, hal ini memerlukan jaminan bahwa semua halaman yang dikonstruksi telah dipersistensikan sebelum transaksi dikomit, tetapi hal ini akan secara signifikan meningkatkan latensi jalur utama. Untuk mengatasi hal ini, PolarDB for PostgreSQL segera menyalin halaman ke Buffer Pool dan menandainya sebagai halaman kotor setelah konstruksi halaman massal selesai. Hal ini memungkinkan komit untuk segera mengembalikan respons. Proses pembersihan halaman kotor paralel di latar belakang kemudian menulis halaman tersebut ke penyimpanan secara asinkron. Mekanisme ini memanfaatkan kemampuan pembersihan halaman kotor ber-throughput tinggi dari PolarDB dan memungkinkan pemrosesan paralel antara konstruksi halaman dan pembersihan latar belakang.
Mekanisme ini juga menjamin konsistensi data jika terjadi crash sistem. Karena catatan WAL tipe FPI telah dicatat, pemulihan data yang telah dikomit tetap terjamin.
Penggunaan
Parameter polar_bulk_write_maxpages mengontrol jumlah maksimum halaman yang akan diagregasi di memori privat proses. Ketika jumlah halaman yang telah diagregasi mencapai nilai ini, sistem akan memicu ekstensi halaman massal, pencatatan WAL massal, serta penyalinan halaman ke Buffer Pool untuk pembersihan. Nilai default telah dioptimalkan dan biasanya tidak perlu diubah.
SHOW polar_bulk_write_maxpages;
polar_bulk_write_maxpages
---------------------------
1MB
(1 row)