0Pricing
SQL Academy · درس

صيانة الفهارس وتضخمها

شخّص تضخم الفهارس، وأعد بناءها باستخدام REINDEX CONCURRENTLY، واحذف الفهارس غير المستخدمة بأمان

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

لماذا تتضخم الفهارس

يستخدم PostgreSQL آلية MVCC: تكتب UPDATE نسخة جديدة من الصف، وتترك النسخة القديمة مرئية للمعاملات الموجودة. لذلك توجد إدخالات فهرس لكلا النسختين. ومع مرور الوقت:

  • تراكم جداول التحديثات الكثيفة إدخالات فهرس ميتة
  • تكبر الفهارس أكثر من اللازم
  • تباطؤ عمليات البحث مع ازدياد عمق B-tree

تشخيص التضخم

استعلامات فحص التضخم غير بسيطة. ومن الأدوات الشائعة:

  • امتداد pgstattuple
  • تقارير pg_repack
  • استعلامات التضخم من check_postgres أو أدوات المراقبة
CREATE EXTENSION pgstattuple;
SELECT * FROM pgstatindex('orders_user_id_idx');

REINDEX

يعيد بناء الفهرس. ويأخذ الشكل التقليدي قفل ACCESS EXCLUSIVE — وهذا غير مناسب في بيئة الإنتاج:

REINDEX INDEX orders_user_id_idx;       -- blocks writes!

REINDEX CONCURRENTLY (PG 12+)

نسخة غير حاجبة — تستمر عمليات القراءة والكتابة أثناء إعادة البناء:

REINDEX INDEX CONCURRENTLY orders_user_id_idx;

الفهارس غير المستخدمة

يبطئ الفهرس غير المستخدم كل عملية كتابة، لكنه لا يسرّع أي عملية قراءة. اعثر عليها:

SELECT schemaname, relname, indexrelname, idx_scan, pg_size_pretty(pg_relation_size(indexrelid))
FROM pg_stat_user_indexes
WHERE idx_scan = 0
  AND indexrelname NOT LIKE '%_pkey'
ORDER BY pg_relation_size(indexrelid) DESC;

احذف الفهارس غير المستخدمة

احذفها — لكن تحقق أولًا من جميع البيئات والنوافذ الزمنية. فقد تبدو الفهارس المستخدمة للتقارير العرضية غير مستخدمة معظم الوقت.

DROP INDEX CONCURRENTLY old_unused_idx;

الفهارس المكررة

أحيانًا يُنشأ الفهرس نفسه بواسطة قيد وبواسطة CREATE INDEX يدوي. تحقق من pg_indexes بحثًا عن التكرارات واحذف الفهرس الزائد:

SELECT tablename, indexname, indexdef
FROM pg_indexes
WHERE schemaname = 'public'
ORDER BY tablename, indexname;

تضخيم الكتابة بسبب الفهارس

تحدّث كل عملية INSERT أو UPDATE أو DELETE كل فهرس ذي صلة. وجود ثلاثة فهارس على جدول كثير الاستخدام يعني تكلفة كتابة تبلغ 3×. أضف الفهارس التي تحقق فائدة فعلية فقط.

قائمة GIN المعلّقة

تجمع فهارس GIN التحديثات في قائمة معلّقة. أفرغها يدويًا أو اعتمد على autovacuum:

SELECT gin_clean_pending_list('events_data_gin');

ينظف VACUUM إدخالات الفهرس

يزيل VACUUM (المشروح في درس MVCC) إدخالات الفهرس الميتة من صفحات heap. ومن دون autovacuum، تستمر الفهارس في التضخم بلا نهاية.

مراقبة حجم الفهرس

تتبّع حجم الفهرس بمرور الوقت:

SELECT pg_size_pretty(pg_indexes_size('orders')) AS index_size,
       pg_size_pretty(pg_total_relation_size('orders')) AS total_size;

pg_repack: إعادة كتابة الجداول أثناء التشغيل

عند حدوث تضخم شديد، يعيد pg_repack كتابة الجدول والفهارس أثناء التشغيل — من دون قفل كامل للجدول. ثبّته كحزمة لنظام التشغيل وامتداد PostgreSQL.

مراجعة

تحتاج الفهارس إلى العناية.

  • التضخم الناتج عن MVCC طبيعي — تحكم فيه باستخدام VACUUM وREINDEX CONCURRENTLY
  • احذف الفهارس غير المستخدمة
  • تجنب التكرارات
  • كل فهرس جديد يبطئ عمليات الكتابة — استخدم الفهارس بوعي

تحقق سريع

أي أمر في PostgreSQL يعيد بناء الفهرس من دون حجب عمليات الكتابة؟

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

هل درس «صيانة الفهارس وتضخمها» مجاني؟

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

ماذا ستتعلم في «صيانة الفهارس وتضخمها»؟

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

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

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

كم من الوقت يستغرق درس «صيانة الفهارس وتضخمها»؟

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

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

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

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

  1. فهارس B-tree مقابل Hash مقابل GiST مقابل GIN
  2. الفهارس المركبة وترتيب الأعمدة
  3. الفهارس الجزئية وفهارس التعابير
  4. صيانة الفهارس وتضخمها
← العودة إلى SQL Academy