0Pricing
SQL Academy · درس

MVCC وأسباب التضخم

افهم التحكم في التزامن متعدد الإصدارات، وسبب تراكم الصفوف الميتة، وكيف تتسبب المعاملات الطويلة في التضخم

MVCC وأسباب التضخم درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.

ما هو MVCC؟

التحكم في التزامن متعدد الإصدارات. بدلًا من استخدام الأقفال، يحتفظ PostgreSQL بإصدارات متعددة من الصف. يرى القرّاء لقطة متسقة، بينما ينشئ الكتّاب إصدارات جديدة من دون حجب القرّاء.

كيف تعمل UPDATE

لا تغيّر UPDATE الصف في موضعه:

  1. تضع علامة على إصدار الصف القديم باعتباره "ميتًا" عند المعاملة T
  2. تكتب إصدارًا جديدًا
  3. ترى المعاملات الأخرى الإصدار الذي تسمح به لقطتها

سبب التضخم

تتراكم الإصدارات الميتة. ويكبر الجدول حتى إذا ظل عدد صفوفه ثابتًا. ومن دون التنظيف، تفحص الاستعلامات عددًا متزايدًا من الصفوف الميتة.

متى يستعيد VACUUM المساحة؟

يضع VACUUM علامة على الصفوف الميتة لتصبح قابلة لإعادة الاستخدام داخل ملف الجدول. لكنه لا يقلّص الملفات إلا إذا كانت فارغة تمامًا في نهايتها. أما VACUUM FULL فيعيد كتابة الجدول، مع قفل حصري وبطء في التنفيذ.

التنظيف التلقائي

يشغّل PostgreSQL عملية التنظيف التلقائي في الخلفية. وتبدأ العملية عندما يتجاوز عدد الصفوف الميتة حدًا معينًا:

autovacuum_vacuum_threshold = 50
autovacuum_vacuum_scale_factor = 0.2
-- vacuum when dead_rows > 50 + 0.2 * total_rows

أحمال العمل المسببة للتضخم

  • حركة UPDATE كثيفة على الجداول الصغيرة أو كثيرة الاستخدام
  • دفعات DELETE كبيرة، إذ تحتاج إلى VACUUM لتحرير المساحة
  • المعاملات طويلة الأمد تحجب VACUUM لأنها تحتفظ باللقطات
  • تراكم الصفوف الميتة في الجداول المزدحمة بسبب الجلسات الخاملة داخل المعاملة

تشخيص التضخم

توفر إضافة pgstattuple أرقامًا دقيقة:

CREATE EXTENSION pgstattuple;

SELECT * FROM pgstattuple('orders');
-- table_len, tuple_count, dead_tuple_count, free_space, etc.

SELECT * FROM pgstatindex('orders_user_id_idx');

المعاملات الطويلة تحجب VACUUM

لا يستطيع VACUUM تنظيف سوى الصفوف الأقدم من أقدم معاملة نشطة. وتعني جلسة خاملة داخل معاملة لمدة 4 ساعات وجود صفوف ميتة غير مستعادة لمدة 4 ساعات.

SELECT pid, state, xact_start, NOW() - xact_start AS duration
FROM pg_stat_activity
WHERE state IN ('active', 'idle in transaction')
ORDER BY duration DESC NULLS LAST;

الحماية من تجاوز النطاق

معرّفات المعاملات ذات طول 32 بت. وإذا عجز التنظيف التلقائي عن مواكبة العمل، فقد تواجه المجموعة مشكلة "تجاوز النطاق" وتدخل وضع الأمان، مع فرض تشغيل VACUUM. راقب ما يلي:

SELECT datname, age(datfrozenxid) FROM pg_database
ORDER BY age(datfrozenxid) DESC;

الحذف المنطقي ≠ الحذف الفعلي

يضع DELETE علامة على الصفوف باعتبارها ميتة؛ ولا تصبح المساحة قابلة للاستعادة إلا بواسطة VACUUM. ويؤدي الحذف الجماعي الذي لا يتبعه تنظيف إلى ترك مجموعات ضخمة من الصفوف الميتة.

التحديثات الساخنة

إذا حدّثت أعمدة غير مفهرسة فقط، وكانت هناك مساحة خالية في الصفحة نفسها، ينفّذ PostgreSQL تحديث HOT، أي تحديث Heap-Only Tuple، من دون تعديل الفهرس وبقدر أقل من التضخم.

تقليل التضخم

  • اجعل المعاملات قصيرة
  • تجنّب عمليات UPDATE الواسعة على الأعمدة المفهرسة (لا يمكن تفعيل HOT)
  • اضبط autovacuum بقوة على الجداول كثيرة التحديث
  • استخدم pg_repack لإعادة الكتابة دون أقفال طويلة

مراجعة

يتيح MVCC التزامن، لكن ذلك يؤدي إلى تراكم الصفوف الميتة.

  • ينظّف VACUUM الصفوف الميتة
  • يُعد Autovacuum ضرورياً — لا تعطّله
  • تمنع المعاملات الطويلة عمليات التنظيف
  • شخّص المشكلات باستخدام pgstattuple

تحقق سريع

لماذا لا تؤدي عملية UPDATE إلى تقليص الجدول حتى عند تغيير عمود واحد؟

الأسئلة الشائعة

هل درس «MVCC وأسباب التضخم» مجاني؟

نعم — نص درس «MVCC وأسباب التضخم» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.

ماذا ستتعلم في «MVCC وأسباب التضخم»؟

افهم التحكم في التزامن متعدد الإصدارات، وسبب تراكم الصفوف الميتة، وكيف تتسبب المعاملات الطويلة في التضخم تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟

لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «MVCC وأسباب التضخم»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟

نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. MVCC وأسباب التضخم
  2. VACUUM وautovacuum وvacuum_cost_delay
  3. ANALYZE وpg_statistic
  4. الفحص باستخدام الفهرس فقط وخريطة الرؤية
← العودة إلى SQL Academy