PostgreSQL 13: الفراغ المتوازي

في اليوم الآخر ، ارتكب أميت كابيلا رقعة ماساهيكو ساوادا ، والتي تسمح بالتنظيف بالتوازي. لا يزال يتم مسح الجدول نفسه من خلال عملية واحدة (رائدة) ، ولكن لتنظيف الفهارس ، يمكنه الآن بدء سير عمل الخلفية ، واحد لكل فهرس. في الوضع اليدوي ، يتيح لك هذا تسريع تنظيف الجداول الكبيرة بفهارس متعددة ؛ التنظيف التلقائي لا يستخدم هذه الميزة حتى الآن.

روابط ذات علاقة:


كما تعلم ، تتكون عملية تنظيف الطاولة من عدة مراحل.

أولاً ، يتم مسح الجدول ضوئيًا ويتم تجميع الارتباطات إلى إصدارات غير ضرورية ("ميتة") من الصفوف في الذاكرة. الذاكرة مقيدة بمعلمة maintenance_work_mem ، لذا قد لا تتناسب جميع الروابط مرة واحدة.

ثم يتم فرز جميع الفهارس بالتسلسل (كما كان من قبل) ، ويتم مسح مؤشرات العثور على نسخ ميتة من السلاسل منها.

ثم يتم فحص الجزء الذي تم عرضه بالفعل من الجدول مرة أخرى ويتم مسح النسخ الميتة من الصفوف منه بالفعل.

إذا لم يكن من الممكن في وقت من الأوقات معالجة جميع الإصدارات الميتة من السلاسل ، يتم مسح الذاكرة ويتم تكرار العملية بأكملها مرة أخرى من المكان الذي توقفنا فيه في المرة الأخيرة.

لا يزال هذا المخطط بأكمله دون تغيير ، ولكن يمكن الآن مسح المؤشرات بالتوازي. للقيام بذلك ، تبدأ عملية العملاء المتوقعين العديد من عمليات سير العمل التي تقوم بتحليل الفهارس الموجودة ومعالجتها. تتم معالجة فهرس واحد بواسطة عملية واحدة فقط. بعد مسح جميع الفهارس ، تكتمل تدفقات العمل ويستمر الميسر إلى المرحلة التالية.

على سبيل المثال ، خذ ticket_flights جدول رحلة demobase . يوجد فهرس واحد عليه ، ولكن يمكنك إنشاء زوجين آخرين.

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

فقط الفهارس التي يتجاوز حجمها قيمة المعلمة min_parallel_index_scan_size هي المتورطة في المعالجة المتوازية . مؤشراتنا مناسبة:

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)

قم بتحديث نصف الأسطر لتحميل أعمال التنظيف:

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

اذهب.

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

يمكن ملاحظة أن العملية الرائدة أطلقت عاملين ، وأخذت مؤشرًا واحدًا.

يمكن تحديد عدد عمليات العمل بشكل صريح (على أي حال ، بطبيعة الحال ، لن يتجاوز max_parallel_maintenance_workers ، والذي لا يتجاوز عمليات max_worker_processes ). يمكن استخدام إشارة صريحة ، على وجه الخصوص ، لإيقاف التزامن:

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

آمل أن يتم تطوير هذا الموضوع بشكل أكبر. يمكن مسح الجدول بالتوازي من خلال عدة عمليات (كان هذا في رقعة سافادا الأصلية ، ولكن لم يتم تضمينه في النسخة النهائية) ، ويمكن أيضًا مسح كل فهرس بالتوازي. من الضروري أيضًا تعليم التنظيف التلقائي لاستخدام التوازي.

P. S. , . . - , , .

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


All Articles