0Pricing
SQL Interview Prep · درس

Seq Scan مقابل Index Scan مقابل Index-Only

سبب اختيار المخطِّط لكل منها وما يخبرك به ذلك عن استعلامك

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

ثلاث طرق لقراءة جدول

عندما يحتاج المخطط إلى صفوف من جدول، فإنه يختار إحدى طرق الوصول الثلاث، ويتوقع منك المحاورون ذكرها جميعًا:

  • Seq Scan، قراءة كل صف في الجدول من البداية إلى النهاية.
  • Index Scan، اجتياز فهرس للعثور على الصفوف المطابقة، ثم جلب كل صف منها من الجدول.
  • Index-Only Scan، الإجابة بالكامل من الفهرس دون الوصول إلى الجدول على الإطلاق.

إن معرفة سبب اختيار المخطط لكل طريقة هي جوهر هذا الدرس، وهي سؤال مضمون للمرشحين ذوي الخبرة.

ما الذي يفعله الفحص التسلسلي

يقرأ Seq Scan صفحات الجدول واحدة تلو الأخرى، ويطبّق أي مرشح على كل صف. ولا يُستشار أي فهرس.

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

المثال: افحص orders واحتفظ بالصفوف التي يكون فيها amount > 100. إذا تجاوزت قيمة معظم الطلبات 100، فسيكون الفحص التسلسلي هو الاختيار الصحيح.

EXPLAIN SELECT * FROM orders WHERE amount > 100;

Seq Scan on orders  (cost=0.00..18334.00 rows=900000 width=64)
  Filter: (amount > 100)

ما الذي يفعله فحص الفهرس

يستخدم Index Scan بنية B-tree للانتقال مباشرةً إلى المفاتيح المطابقة، ثم يقرأ الصفوف المقابلة من heap الجدول.

ويكون فعالًا جدًا عندما يكون المرشح انتقائيًا ويعيد جزءًا صغيرًا من الجدول. فالبحث عن 5 صفوف عبر فهرس أفضل من قراءة 10 ملايين صف.

تذكر الخطة اسم الفهرس الذي استخدمته. وتتطلب كل مطابقة عملية بحث واحدة في الفهرس بالإضافة إلى جلب واحد من heap، أي قراءة عشوائية، ولذلك يفقد فحص الفهرس ميزته عندما يعيد عددًا كبيرًا جدًا من الصفوف.

EXPLAIN SELECT * FROM orders WHERE customer_id = 42;

Index Scan using idx_orders_customer on orders
  (cost=0.42..38.50 rows=12 width=64)
  Index Cond: (customer_id = 42)

الانتقائية هي التي تحدد الاختيار

المفهوم الأساسي الذي يقود كل ذلك هو الانتقائية: نسبة الصفوف التي يحتفظ بها الشرط.

  • الانتقائية المرتفعة، أي تطابق عدد قليل من الصفوف مثل المعرّف الفريد، تفضّل Index Scan.
  • الانتقائية المنخفضة، أي تطابق عدد كبير من الصفوف مثل status IS NOT NULL، تفضّل Seq Scan.

وتقول قاعدة تقريبية شائعة إنه عندما يعيد الاستعلام أكثر من نحو 5 إلى 10 بالمئة من الجدول، يفضّل المخطط غالبًا الفحص التسلسلي، لأن عمليات الجلب العشوائي من heap عبر الفهرس تصبح أغلى من قراءة كل شيء بالترتيب.

الفحص باستخدام الفهرس فقط

يُعد Index-Only Scan الأسرع بين الطرق الثلاث. فإذا كان كل عمود يحتاج إليه الاستعلام موجودًا بالفعل في الفهرس، فلن يصل المحرك إلى heap الجدول على الإطلاق.

يختار الاستعلام في المثال customer_id فقط ويطبّق التصفية عليه، كما أن الفهرس مبني على customer_id. وبما أن جميع البيانات المطلوبة موجودة في الفهرس، يعرض Postgres العملية باسم Index Only Scan.

يؤدي ذلك إلى تجنب قراءات heap العشوائية التي تبطئ فحص الفهرس العادي، وهو مكسب كبير في الجداول العريضة.

EXPLAIN SELECT customer_id FROM orders WHERE customer_id = 42;

Index Only Scan using idx_orders_customer on orders
  (cost=0.42..8.44 rows=12 width=4)
  Index Cond: (customer_id = 42)

تفصيل خريطة الرؤية

يحب المحاورون هذا التفصيل. فلا يزال على الفحص باستخدام الفهرس فقط تأكيد أن كل صف مرئي لمعاملتك، وفقًا لـ MVCC، ولا يخزن الفهرس وحده معلومات الرؤية.

يستخدم Postgres خريطة الرؤية: فإذا كانت الصفحة معلّمة بأنها مرئية بالكامل، يتجاوز heap، وإلا فعليه جلب صف heap على أي حال. وتعرض الخطة Heap Fetches: N.

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

Index Only Scan using idx_orders_customer on orders
  (actual time=0.01..0.03 rows=12 loops=1)
  Heap Fetches: 0

Bitmap Scans: الحل الوسط

تظهر أحيانًا طريقة رابعة، هي Bitmap Heap Scan. ويختارها المخطط عندما يطابق الشرط عددًا من الصفوف أكبر مما يناسب فحص الفهرس العادي، لكنه يطابق عددًا أقل من عدد صفوف الجدول الكامل.

ينشئ المخطط أولًا خريطة نقطية لمواضع الصفوف المطابقة من الفهرس، عبر Bitmap Index Scan، ثم يجلب صفحات heap وفق الترتيب الفعلي بدلًا من الترتيب العشوائي. وتكون عمليات الجلب المرتبة أرخص بكثير من القراءات المتناثرة في فحص الفهرس العادي.

Bitmap Heap Scan on orders  (cost=12.0..520.0 rows=8000)
  Recheck Cond: (status = 'pending')
  ->  Bitmap Index Scan on idx_orders_status
        (cost=0..12 rows=8000)
        Index Cond: (status = 'pending')

لماذا تجاهل المخطط فهارسك

سؤال شائع في المقابلات: أضفت فهرسًا، لكن الخطة ما زالت تنفذ Seq Scan، لماذا؟ من الأسباب الشائعة:

  • الشرط غير انتقائي، لذا يكون الفحص أرخص فعلًا.
  • تُطبَّق دالة على العمود: لا يمكن لـ WHERE lower(email) = ... استخدام فهرس عادي على email.
  • اختلاف النوع يفرض تحويلًا ضمنيًا يمنع استخدام الفهرس.
  • الإحصاءات قديمة؛ شغّل ANALYZE.
  • الجدول صغير جدًا؛ ففحص بضع صفحات أفضل من التكلفة الإضافية للفهرس.

تشخيص عملي

لنفترض أن orders يحتوي على فهرس في created_at، لكن هذا الاستعلام لا يزال ينفذ فحصًا تسلسليًا:

المشكلة هي DATE(created_at). فوضع العمود داخل دالة يعني أنه لا يمكن استخدام الفهرس المبني على created_at الخام. والحل هو إعادة كتابة الشرط على هيئة نطاق يترك العمود دون تغليف، أو إنشاء فهرس تعبيري على DATE(created_at).

-- Slow: function on the indexed column
WHERE DATE(created_at) = '2026-01-01'

-- Fast: bare column, range uses the index
WHERE created_at >= '2026-01-01'
  AND created_at <  '2026-01-02'

مقارنة الطرق

احتفظ بهذه المقارنة في ذهنك للمقابلة:

  • Seq Scan، الأفضل عند إرجاع نسبة كبيرة من الصفوف؛ إدخال وإخراج تسلسلي.
  • Index Scan، الأفضل لعمليات البحث الانتقائية؛ اجتياز للفهرس بالإضافة إلى عمليات جلب عشوائية من heap.
  • Bitmap Heap Scan، مناسب لعدد متوسط من الصفوف المطابقة؛ استخدام الفهرس لإنشاء خريطة نقطية ثم قراءة heap بالترتيب.
  • Index-Only Scan، الأسرع عندما يغطي الفهرس كل الأعمدة المطلوبة وتكون الصفحات مرئية بالكامل.

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

فرض اختبار (ولماذا لا يُنصح بذلك في الإنتاج)

لإثبات فكرة أثناء التطوير، يمكنك توجيه المخطط مؤقتًا: يجبره SET enable_seqscan = off; على تفضيل الفهارس، حتى تتمكن من مقارنة الخطط.

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

SET enable_seqscan = off;
EXPLAIN ANALYZE SELECT * FROM orders WHERE amount > 100;
SET enable_seqscan = on;

اختبار سريع

يختار الاستعلام email فقط ويطبّق التصفية على email، ويوجد فهرس B-tree على email. تعرض الخطة Index Only Scan. لماذا يكون هذا أسرع من فحص Index Scan العادي؟

خلاصة

أهم النقاط حول طرق الوصول:

  • يتفوق Seq Scan في الاستعلامات منخفضة الانتقائية، بينما يتفوق Index Scan في الاستعلامات الانتقائية.
  • يتجنب Index-Only Scan الوصول إلى heap عندما يغطي الفهرس جميع الأعمدة المطلوبة؛ انتبه إلى Heap Fetches وخريطة الرؤية.
  • يمثل Bitmap Heap Scan حلًا وسطًا، إذ يجلب صفحات heap بترتيبها الفعلي.
  • يقرر المخطط وفقًا لـ الانتقائية والإحصاءات؛ وتُعد الدوال المطبقة على الأعمدة، واختلافات الأنواع، والإحصاءات القديمة أسبابًا لتجاهل الفهرس.

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

هل درس «Seq Scan مقابل Index Scan مقابل Index-Only» مجاني؟

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

ماذا ستتعلم في «Seq Scan مقابل Index Scan مقابل Index-Only»؟

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

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

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

كم من الوقت يستغرق درس «Seq Scan مقابل Index Scan مقابل Index-Only»؟

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

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

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

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

  1. قراءة خطة EXPLAIN
  2. Seq Scan مقابل Index Scan مقابل Index-Only
  3. خوارزميات الربط: Nested Loop وHash وMerge
  4. اكتشاف الاستعلامات البطيئة وإصلاحها
← العودة إلى SQL Interview Prep