PostgreSQL 13: VACUUM paralel

Suatu hari, Amit Kapila melakukan patch Masahiko Sawada, yang memungkinkan pembersihan secara paralel. Tabel itu sendiri masih dibersihkan oleh satu proses (memimpin), tetapi untuk membersihkan indeks, sekarang dapat memulai alur kerja latar belakang, satu untuk setiap indeks. Dalam mode manual, ini memungkinkan Anda untuk mempercepat pembersihan tabel besar dengan banyak indeks; pembersihan otomatis belum menggunakan fitur ini.

Tautan yang berhubungan:


Seperti yang Anda ketahui , proses pembersihan meja terdiri dari beberapa fase.

Pertama, tabel dipindai dan tautan ke versi baris yang tidak perlu ("mati") dikumpulkan dalam memori. Memori dibatasi oleh parameter maintenance_work_mem , jadi semua tautan mungkin tidak muat sekaligus.

Kemudian semua indeks diurutkan secara berurutan (seperti sebelumnya), dan petunjuk untuk menemukan versi string yang mati dihapus dari mereka.

Kemudian bagian tabel yang sudah dilihat dipindai lagi dan versi yang mati dari baris sudah dihapus darinya.

Jika pada suatu waktu tidak mungkin untuk memproses semua versi string mati, maka memori dihapus dan seluruh proses diulangi lagi dari tempat kami berhenti terakhir kali.

Seluruh skema ini tetap tidak berubah, tetapi sekarang indeks dapat dihapus secara paralel. Untuk melakukan ini, proses awal memulai beberapa alur kerja yang mem-parsing indeks yang ada dan memprosesnya. Satu indeks diproses oleh hanya satu proses. Setelah semua indeks dihapus, alur kerja diselesaikan dan fasilitator melanjutkan ke fase berikutnya.

Misalnya, ambil ticket_flights tabel penerbangan demobase . Ada satu indeks di atasnya, tetapi Anda dapat membuat pasangan lagi.

demo=# CREATE index on ticket_flights (fare_conditions);
demo=# CREATE index on ticket_flights (amount);

Hanya indeks yang ukurannya melebihi nilai parameter min_parallel_index_scan_size yang terlibat dalam pemrosesan paralel . Indeks kami cocok:

demo=# SHOW min_parallel_index_scan_size;
 min_parallel_index_scan_size 
------------------------------
 512kB
(1 row)
demo=# SELECT pg_size_pretty(pg_relation_size(indexname::regclass))
FROM pg_indexes
WHERE tablename = 'ticket_flights';
 pg_size_pretty 
----------------
 325 MB
 187 MB
 180 MB
(3 rows)

Perbarui setengah baris untuk memuat pekerjaan pembersihan:

demo=# UPDATE ticket_flights SET amount = amount + 1 WHERE random() > 0.5;
UPDATE 4194262

Pergilah.

demo=# VACUUM VERBOSE ticket_flights;
INFO:  vacuuming "bookings.ticket_flights"
INFO:  launched 2 parallel vacuum workers for index vacuuming (planned: 2)
INFO:  scanned index "ticket_flights_fare_conditions_idx" to remove 4194262 row versions by parallel vacuum worker
DETAIL:  CPU: user: 1.84 s, system: 0.41 s, elapsed: 11.82 s
INFO:  scanned index "ticket_flights_amount_idx" to remove 4194262 row versions by parallel vacuum worker
DETAIL:  CPU: user: 2.31 s, system: 0.44 s, elapsed: 12.95 s
INFO:  scanned index "ticket_flights_pkey" to remove 4194262 row versions
...
INFO:  "ticket_flights": found 4194262 removable, 8391852 nonremovable row versions in 104885 out of 104885 pages
DETAIL:  0 dead row versions cannot be removed yet, oldest xmin: 630
There were 0 unused item identifiers.
Skipped 0 pages due to buffer pins, 0 frozen pages.
0 pages are entirely empty.
CPU: user: 9.91 s, system: 4.40 s, elapsed: 121.40 s.
VACUUM

Dapat dilihat bahwa proses kepemimpinan meluncurkan dua pekerja, dan mengambil satu indeks.

Jumlah proses kerja dapat ditentukan secara eksplisit (dalam kasus apa pun, tentu saja, itu tidak akan melebihi max_parallel_maintenance_workers , yang tidak melebihi max_worker_processes ). Indikasi eksplisit dapat, khususnya, digunakan untuk mematikan konkurensi:

demo=# VACUUM (PARALLEL 0, VERBOSE) ticket_flights;

Saya berharap bahwa topik ini akan dikembangkan lebih lanjut. Tabel dapat dipindai secara paralel oleh beberapa proses (ini di patch Savada asli, tetapi tidak termasuk dalam yang terakhir), setiap indeks juga dapat dihapus secara paralel. Juga perlu untuk mengajarkan pembersihan otomatis untuk menggunakan paralelisme.

P. S. , . . - , , .

Source: https://habr.com/ru/post/undefined/


All Articles