Menyesuaikan WAL dan Checkpoint untuk Pemasukan Data
Sesuaikan pengaturan WAL dan tabel tanpa pencatatan untuk mempertahankan laju penulisan tinggi tanpa hambatan I/O.
Menyesuaikan WAL dan Checkpoint untuk Pemasukan Data adalah pelajaran PostgreSQL Performance & Query Optimization gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar PostgreSQL Performance & Query Optimization, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus PostgreSQL Performance & Query Optimization mencakup 4 pelajaran total.
Mengapa WAL Penting untuk Penyerapan Data
Setiap perubahan yang Anda lakukan dengan COMMIT di PostgreSQL pertama-tama ditulis ke Write-Ahead Log (WAL) sebelum file data diperbarui. Ini menjamin ketahanan data dan pemulihan setelah kerusakan, tetapi selama pemuatan massal yang berat, WAL menjadi sumber I/O utama.
- Setiap
INSERTatauCOPYmenghasilkan catatan WAL. - Secara berkala, sebuah checkpoint menulis halaman yang berubah dari buffer bersama ke disk.
- Jika checkpoint terlalu sering dijalankan, Anda menanggung I/O ganda dan mengalami jeda.
Menyetel WAL dan perilaku checkpoint adalah kunci untuk mempertahankan laju penulisan tinggi tanpa lonjakan I/O.
Memeriksa Pengaturan WAL Saat Ini
Sebelum mengubah apa pun, lihat konfigurasi yang sedang digunakan server Anda. Parameter yang relevan berada di pg_settings dan dapat ditanyakan dengan SHOW.
Parameter terpenting yang berkaitan dengan penyerapan data adalah max_wal_size, checkpoint_timeout, checkpoint_completion_target, dan wal_compression.
SELECT name, setting, unit
FROM pg_settings
WHERE name IN (
'max_wal_size',
'min_wal_size',
'checkpoint_timeout',
'checkpoint_completion_target',
'wal_compression'
);Menaikkan max_wal_size
Sebuah checkpoint dipicu ketika checkpoint_timeout berakhir atau volume WAL mencapai max_wal_size. Selama pemuatan besar, nilai bawaan (sering kali 1 GB) terus-menerus tercapai sehingga checkpoint dipaksa berulang kali.
- Menaikkan
max_wal_sizememungkinkan WAL terakumulasi lebih lama di antara checkpoint. - Checkpoint yang lebih jarang berarti halaman yang berubah dapat digabungkan dan ditulis satu kali, bukan berulang kali.
Untuk periode penyerapan data, nilai seperti 8–32 GB umum digunakan.
ALTER SYSTEM SET max_wal_size = '16GB';
SELECT pg_reload_conf();Menyebarkan I/O Checkpoint
checkpoint_completion_target mengatur seberapa banyak interval yang digunakan PostgreSQL untuk menyebarkan penulisan checkpoint. Nilai 0.9 berarti penulisan disebarkan selama 90% waktu hingga checkpoint berikutnya, sehingga menghindari lonjakan I/O yang tajam.
Jika digabungkan dengan checkpoint_timeout yang lebih panjang, pengaturan ini mengubah lonjakan checkpoint menjadi aliran penulisan yang mulus dan berkelanjutan.
ALTER SYSTEM SET checkpoint_timeout = '30min';
ALTER SYSTEM SET checkpoint_completion_target = 0.9;
SELECT pg_reload_conf();Mengompresi Catatan WAL
Ketika citra halaman penuh ditulis setelah checkpoint (saat halaman pertama kali diubah), ukuran WAL membengkak. wal_compression mengompresi citra halaman penuh tersebut, dengan menukar sedikit CPU untuk mengurangi volume WAL dan I/O disk secara signifikan.
- Pada PostgreSQL modern, Anda dapat memilih algoritmanya, misalnya
lz4atauzstd. - WAL yang lebih sedikit juga berarti replikasi lebih cepat dan lebih sedikit checkpoint akibat pemicu ukuran.
ALTER SYSTEM SET wal_compression = 'lz4';
SELECT pg_reload_conf();Tabel Unlogged: Lewati WAL Sepenuhnya
Tabel unlogged sama sekali tidak menulis WAL. Untuk tabel staging dalam pipeline ETL, hal ini dapat meningkatkan throughput secara drastis karena melewati biaya penulisan terbesar.
- Data tetap ditulis ke disk, tetapi tidak dicatat secara tahan lama.
- Kompromi: tabel akan dipangkas secara otomatis setelah terjadi kerusakan dan tidak direplikasi ke server siaga.
Sempurna untuk data staging yang dapat dibangun ulang; jangan pernah digunakan untuk sistem pencatatan utama.
CREATE UNLOGGED TABLE staging_events (
id bigint,
payload jsonb,
loaded_at timestamptz DEFAULT now()
);Pola dari Staging ke Final
Rancangan ETL yang tangguh memuat baris mentah ke tabel staging unlogged yang cepat, mengubahnya, lalu memindahkan hasil yang sudah dibersihkan ke tabel final yang tahan lama.
COPYmassal masuk ke tabel unlogged dengan kecepatan penuh.INSERT ... SELECTfinal hanya menulis WAL satu kali, untuk data yang sudah divalidasi.
Anda mendapatkan kecepatan di tempat ketahanan data tidak penting, dan keamanan di tempat ketahanan data diperlukan.
INSERT INTO events (id, payload, loaded_at)
SELECT id, payload, loaded_at
FROM staging_events
WHERE payload IS NOT NULL;
TRUNCATE staging_events;Mempromosikan Tabel Unlogged
Jika tabel staging perlu menjadi tahan lama setelah pemuatan selesai, Anda dapat mengonversinya langsung tanpa menyalin baris. Menetapkannya sebagai LOGGED menulis ulang tabel dan mulai mencatatnya ke WAL.
- Konversi itu sendiri menghasilkan WAL untuk seluruh tabel, jadi lakukan satu kali di akhir.
- Kembali ke
UNLOGGEDsebelum pemuatan berikutnya kembali menghindari WAL per baris.
ALTER TABLE staging_events SET LOGGED;COPY Mengungguli INSERT Baris demi Baris
Bahkan dengan WAL yang sudah disetel, cara Anda memuat data tetap penting. COPY mengelompokkan baris ke dalam jauh lebih sedikit catatan WAL yang lebih besar daripada ribuan pernyataan INSERT individual, serta menghindari beban tambahan penguraian dan perencanaan per pernyataan.
Gabungkan COPY dengan tabel staging unlogged untuk mencapai laju penyerapan berkelanjutan tertinggi.
COPY staging_events (id, payload)
FROM '/data/events.csv'
WITH (FORMAT csv, HEADER true);Memantau Tekanan Checkpoint
Untuk mengetahui apakah penyetelan Anda berhasil, pantau statistik checkpoint. Sinyal utamanya adalah rasio checkpoint requested (dipicu ukuran) terhadap checkpoint timed (dipicu waktu).
- Banyak checkpoint
requestedberartimax_wal_sizemasih terlalu kecil untuk pemuatan Anda. - Jika sebagian besar adalah checkpoint
timed, volume WAL masih berada dengan nyaman dalam batas yang ditetapkan.
Pada versi yang lebih baru, penghitung ini berada di pg_stat_checkpointer; versi lama menggunakan pg_stat_bgwriter.
SELECT num_timed, num_requested,
buffers_written, write_time, sync_time
FROM pg_stat_checkpointer;Mengatur Ulang Setelah Pemuatan
Pengaturan penyerapan data yang agresif sangat baik selama periode pemuatan, tetapi setelahnya memperlama pemulihan dan memboroskan disk. Setelah kumpulan data selesai diproses, kembalikan nilai yang lebih konservatif dan paksa checkpoint bersih agar pemulihan setelah kerusakan berikutnya berlangsung cepat.
- Turunkan
max_wal_sizedancheckpoint_timeoutkembali ke nilai kondisi normal. - Jalankan
CHECKPOINTmanual untuk segera menulis semuanya.
ALTER SYSTEM SET max_wal_size = '2GB';
ALTER SYSTEM SET checkpoint_timeout = '5min';
SELECT pg_reload_conf();
CHECKPOINT;Pemeriksaan Cepat
Anda memuat 200 juta baris secara massal ke tabel staging yang dapat dibangun ulang, yang nantinya akan divalidasi dan disalin ke tabel tahan lama. Pilihan mana yang paling langsung mengurangi volume penulisan WAL selama pemuatan?
Ringkasan
Untuk mempertahankan laju penulisan tinggi tanpa jeda I/O:
- Naikkan max_wal_size dan checkpoint_timeout agar checkpoint lebih jarang dijalankan, lalu atur checkpoint_completion_target mendekati 0.9 untuk menyebarkan penulisan.
- Aktifkan wal_compression untuk memperkecil citra halaman penuh.
- Gunakan tabel staging UNLOGGED untuk melewati WAL pada data yang dapat dibangun ulang, lalu pindahkan baris yang sudah divalidasi ke tabel tahan lama.
- Utamakan COPY daripada penyisipan baris demi baris.
- Pantau
pg_stat_checkpointeruntuk checkpoint requested dan timed, lalu kembalikan nilai konservatif setelah pemuatan.
Belajar SQL dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 22
- Pelajaran
- 88
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Menyesuaikan WAL dan Checkpoint untuk Pemasukan Data” gratis?
Ya — teks lengkap “Menyesuaikan WAL dan Checkpoint untuk Pemasukan Data” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus PostgreSQL Performance & Query Optimization, upgrade ke CoddyKit PRO. Kursus PostgreSQL Performance & Query Optimization mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Menyesuaikan WAL dan Checkpoint untuk Pemasukan Data”?
Sesuaikan pengaturan WAL dan tabel tanpa pencatatan untuk mempertahankan laju penulisan tinggi tanpa hambatan I/O. Kamu berlatih PostgreSQL Performance & Query Optimization dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai PostgreSQL Performance & Query Optimization?
Tidak diperlukan pengalaman sebelumnya. PostgreSQL Performance & Query Optimization di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Menyesuaikan WAL dan Checkpoint untuk Pemasukan Data” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran PostgreSQL Performance & Query Optimization ini?
Ya. Setiap pelajaran PostgreSQL Performance & Query Optimization menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Throughput COPY vs INSERT Multi-Baris
- Menunda Indeks dan Batasan selama Pemuatan
- Menyesuaikan WAL dan Checkpoint untuk Pemasukan Data
- Upsert Berskala Besar dengan ON CONFLICT