الفهارس المتزامنة (CREATE INDEX CONCURRENTLY)
أنشئ فهارس دون حجب عمليات الكتابة باستخدام CREATE INDEX CONCURRENTLY، واستعد من عمليات الإنشاء المتوقفة
الفهارس المتزامنة (CREATE INDEX CONCURRENTLY) درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.
مشكلة CREATE INDEX
يستحوذ CREATE INDEX العادي على قفل SHARE، فيمنع عمليات الكتابة، دون عمليات القراءة، طوال فترة الإنشاء. وفي جدول يحتوي على مليار صف، يعني ذلك توقفًا عن الكتابة لعدة دقائق.
CONCURRENTLY: الحل
ينشئ CREATE INDEX CONCURRENTLY الفهرس دون منع عمليات الكتابة:
CREATE INDEX CONCURRENTLY idx_orders_user_id ON orders(user_id);آلية العمل
يجري مسحين للجدول:
- المرور الأول: إنشاء الفهرس من الصفوف الحالية
- المرور الثاني: التقاط أي صفوف تغيّرت أثناء المرور الأول
بالإضافة إلى انتظار قصير لأي معاملة متزامنة بدأت قبل الإنشاء.
لا يمكن تشغيله داخل معاملة
ينفّذ CONCURRENTLY عملية تثبيت مرتين، ولذلك لا يمكن وضعه داخل كتلة BEGIN/COMMIT صريحة:
BEGIN;
CREATE INDEX CONCURRENTLY ...; -- ERROR
COMMIT;بطيء، لكنه يعمل عبر الإنترنت
يستغرق CONCURRENTLY وقتًا أطول من CREATE INDEX العادي، بسبب المسحين وانتظار الأقفال. أما الفائدة فهي عدم حدوث أي توقف.
التعافي من الفشل
إذا فشل CONCURRENTLY، بسبب مقاطعته أو حدوث خطأ في النظام، يُترك الفهرس في حالة INVALID:
SELECT relname FROM pg_class
WHERE relkind = 'i' AND NOT pg_index.indisvalid;
-- Fix: drop and re-create:
DROP INDEX CONCURRENTLY my_idx;
CREATE INDEX CONCURRENTLY my_idx ON ...;REINDEX CONCURRENTLY
إعادة إنشاء الفهرس دون حجب العمليات، منذ PG 12:
REINDEX INDEX CONCURRENTLY orders_user_id_idx;
REINDEX TABLE CONCURRENTLY orders;DROP INDEX CONCURRENTLY
لا يحجب العمليات أيضًا:
DROP INDEX CONCURRENTLY old_idx;الفهارس الفريدة
يمكن أيضًا إنشاء الفهارس UNIQUE باستخدام CONCURRENTLY. وهذا مفيد لإضافة قيود UNIQUE عبر الإنترنت:
CREATE UNIQUE INDEX CONCURRENTLY users_email_uidx ON users(email);
ALTER TABLE users ADD CONSTRAINT users_email_unique UNIQUE USING INDEX users_email_uidx;فهارس المفاتيح الخارجية
النمط القياسي عند إضافة مفتاح خارجي إلى جدول كبير:
-- 1. Build the index online:
CREATE INDEX CONCURRENTLY orders_user_id_idx ON orders(user_id);
-- 2. Add the FK with NOT VALID (instant):
ALTER TABLE orders ADD CONSTRAINT orders_user_fk
FOREIGN KEY (user_id) REFERENCES users(id) NOT VALID;
-- 3. Validate in the background:
ALTER TABLE orders VALIDATE CONSTRAINT orders_user_fk;تكلفة إنشاء الفهرس المتزامن
مسحان كاملان للجدول بالإضافة إلى حفظ السجلات الإدارية. يستهلك ذلك وحدة المعالجة المركزية وعمليات الإدخال والإخراج. شغّلوا العملية خلال ساعات انخفاض حركة المرور متى أمكن.
مراقبة التقدم
يعرض PG 12 والإصدارات الأحدث معلومات التقدم في pg_stat_progress_create_index:
SELECT phase,
blocks_done, blocks_total,
tuples_done, tuples_total
FROM pg_stat_progress_create_index;مراجعة
يُعد CONCURRENTLY الأسلوب الملائم لبيئة الإنتاج لإدارة الفهارس.
- لا تمنع CREATE/DROP/REINDEX CONCURRENTLY عمليات الكتابة
- لا يمكن وضعها داخل معاملة
- يؤدي الفشل إلى ترك فهارس INVALID، لذا يجب تنظيفها
- يمكن المراقبة باستخدام pg_stat_progress_create_index
تحقق سريع
لماذا لا يمكن تشغيل CREATE INDEX CONCURRENTLY داخل كتلة BEGIN/COMMIT صريحة؟
الأسئلة الشائعة
هل درس «الفهارس المتزامنة (CREATE INDEX CONCURRENTLY)» مجاني؟
نعم — نص درس «الفهارس المتزامنة (CREATE INDEX CONCURRENTLY)» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.
ماذا ستتعلم في «الفهارس المتزامنة (CREATE INDEX CONCURRENTLY)»؟
أنشئ فهارس دون حجب عمليات الكتابة باستخدام CREATE INDEX CONCURRENTLY، واستعد من عمليات الإنشاء المتوقفة تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟
لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «الفهارس المتزامنة (CREATE INDEX CONCURRENTLY)»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟
نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الترحيلات الفورية: لماذا تقفل ALTER TABLE الجداول
- الفهارس المتزامنة (CREATE INDEX CONCURRENTLY)
- إعادة تسمية الأعمدة دون توقف
- الأدوات: Flyway وLiquibase وSqitch