قراءة خطة EXPLAIN
تفسير أنواع المسح وأساليب الربط وتقديرات التكلفة في خطة الاستعلام
قراءة خطة EXPLAIN درس مجاني في SQL Interview Prep على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Interview Prep 4 دروس في المجموع.
لماذا يسأل المحاورون عن EXPLAIN
عندما تصل إلى مقابلة لمستوى متقدم، يتوقف المحاورون عن طلب كتابة استعلام ويبدؤون بسؤال لماذا هذا الاستعلام بطيء؟ والأداة التي تجيب عن ذلك هي EXPLAIN.
يعرض EXPLAIN خطة تنفيذ قاعدة البيانات: الاستراتيجية خطوة بخطوة التي اختارها المخطط لتشغيل SQL. ويكشف الجداول التي يجري فحصها، وترتيب ربطها، والتكلفة التقريبية لكل خطوة.
إن قدرتك على قراءة الخطة تدل على فهمك للمحرك، لا للصياغة فقط. وهذا تحديدًا هو الخط الذي يستخدمه المحاورون للتمييز بين المطور متوسط الخبرة والمطور المتقدم.
EXPLAIN مقابل EXPLAIN ANALYZE
هناك نوعان، ويميل المحاورون إلى التركيز على الفرق بينهما.
- EXPLAIN يعرض الخطة المقدَّرة من المخطط دون تشغيل الاستعلام. وهو سريع وآمن.
- EXPLAIN ANALYZE يشغّل الاستعلام فعليًا، ويعرض أعداد الصفوف الفعلية وأزمنة التنفيذ إلى جانب التقديرات.
وتكمن الفائدة الكبرى في مقارنة الصفوف المقدَّرة بالصفوف الفعلية. إذ يعني الاختلاف الكبير أن إحصاءات المخطط سيئة، وأنه يُرجح أن يتخذ قرارًا غير مناسب.
تنبيه: يشغّل EXPLAIN ANALYZE الاستعلام فعليًا، ولذلك سينفذ أي INSERT أو UPDATE ما لم يُغلَّف داخل معاملة يجري التراجع عنها.
EXPLAIN ANALYZE
SELECT * FROM orders WHERE customer_id = 42;كيفية قراءة الشجرة
الخطة عبارة عن شجرة وليست قائمة. والعُقد الأكثر إزاحةً إلى الداخل هي الأوراق التي تُنفَّذ أولًا؛ ثم تتدفق النتائج إلى الأعلى نحو الجذر الذي ينتج المخرجات النهائية.
اقرأها من الداخل إلى الخارج: ابحث عن أعمق عقدة، فهناك يبدأ التنفيذ. ويستهلك كل عنصر أب الصفوف التي تنتجها عناصره الأبناء.
في المقابلة، اشرحها بهذه الطريقة: أولًا نفحص هذا الجدول، ثم تنتقل هذه الصفوف إلى عملية الربط هذه، وتنتقل نتيجة الربط إلى الفرز، ثم تنتقل نتيجة الفرز إلى الحدّ. هذا الشرح من الأسفل إلى الأعلى هو ما يريدون سماعه.
بنية عقدة في الخطة
تتضمن كل عقدة في خطة Postgres الأرقام الأساسية نفسها:
- cost=0.00..35.50 تكلفة بدء التشغيل..التكلفة الإجمالية بوحدات اعتباطية للمخطط
- rows=1000 العدد المقدّر للصفوف الناتجة
- width=64 متوسط الحجم المقدّر للصف الواحد بالبايت
التكلفة الأولى هي تكلفة بدء التشغيل، أي العمل المنجز قبل ظهور الصف الأول، مثل إنشاء جدول تجزئة. أما الثانية فهي التكلفة الإجمالية لإرجاع جميع الصفوف. وتمثل التكلفة الإجمالية الأعلى تقدير المخطط للتكلفة النسبية.
Seq Scan on orders (cost=0.00..35.50 rows=1000 width=64)مثال عملي
لنفترض وجود استعلام بسيط يتضمن تصفية. تخبرك الخطة أدناه بالقصة كاملة في سطر واحد.
إنها عملية Seq Scan (قراءة كاملة للجدول) على orders، مع تطبيق المرشح status = 'shipped'. ويقدّر المخطط وجود 1000 صف مطابق.
إذا كان جدول orders يحتوي على 10 ملايين صف ولم يطابق الشرط سوى 1000 صف، فيتوقع منك المحاور أن تقول: الفحص التسلسلي هنا يهدر الموارد، وسيتيح لنا إنشاء فهرس على status (أو على عمود أكثر انتقائية) تجنب قراءة الجدول بأكمله.
EXPLAIN SELECT * FROM orders WHERE status = 'shipped';
Seq Scan on orders (cost=0.00..18334.00 rows=1000 width=64)
Filter: (status = 'shipped'::text)الصفوف المقدّرة والفعلية
باستخدام EXPLAIN ANALYZE تحصل أيضًا على الأرقام الفعلية بين قوسين.
انظر إلى المثال: قدّر المخطط وجود 1000 صف، لكنه حصل فعليًا على 480000 صف. وهذا تقدير أقل من الواقع بمقدار 480 مرة. اختار المخطط استراتيجيته على افتراض وجود عدد قليل من الصفوف، ولذلك من المرجح أن يكون اختياره غير مناسب للبيانات الفعلية.
في المقابلات، تمثل هذه الفجوة تشخيصك الأساسي: الإحصاءات قديمة، شغّل ANALYZE على الجدول، ومن المرجح أن يختار المخطط بعد ذلك خطة أفضل.
Seq Scan on orders
(cost=0.00..18334.00 rows=1000 width=64)
(actual time=0.02..210.4 rows=480000 loops=1)ما الذي تعنيه loops=N
تكتسب قيمة loops أهمية أكبر مما يتوقع معظم المرشحين. فهي تمثل عدد مرات تنفيذ العقدة.
تظهر هذه القيمة على الجانب الداخلي من عملية الربط المتداخل: تُنفَّذ العقدة الداخلية مرة واحدة لكل صف خارجي. فإذا كانت loops=480000، فهذا يعني أن تلك الخطوة الداخلية نُفذت 480 ألف مرة.
مهم: الوقت وعدد الصفوف الظاهران لكل صف هما لكل حلقة. ولحساب الإجمالي الحقيقي، اضربهما في قيمة loops. فالعقدة التي تبدو رخيصة، بتكلفة 0.004ms لكل حلقة، تصبح قريبة من ثانيتين عبر 480000 حلقة.
Index Scan using idx_cust on orders
(actual time=0.003..0.004 rows=1 loops=480000)التكلفة نسبية وليست بالميلي ثانية
من الأخطاء الشائعة أن يقرأ المرشح cost=18334 ويقول يستغرق ذلك 18 ثانية. وهذا خطأ.
التكلفة معبَّر عنها بوحدات اعتباطية للمخطط، وهي مُعايرة بحيث تعادل قراءة صفحة واحدة بالتسلسل 1.0. ولا يكون لها معنى إلا عند مقارنة الخطط بعضها ببعض، وليس باعتبارها مدة تنفيذ فعلية.
لمعرفة الزمن الحقيقي، تحتاج إلى EXPLAIN ANALYZE وقيم actual time الخاصة به، والمقاسة بالميلي ثانية. اذكر ذلك بوضوح في المقابلة؛ فهذا يوضح أنك تفهم المقياس فهمًا فعليًا.
قراءة خطة ربط
إليك خطة لجدولين. اقرأها من الأسفل إلى الأعلى.
تجمع عمليتا الفحص الأوليان الصفوف من orders وcustomers. ثم تغذيان عملية Hash Join: يُحوَّل أحد الجانبين إلى جدول تجزئة، بينما يبحث الجانب الآخر فيه. بعد ذلك تُغذي مخرجات عملية الربط النتيجة النهائية.
لاحظ أن المسافات البادئة توضح البنية: كلتا عمليتي الفحص تقعان تحت Hash Join. ويريد منك المحاور تحديد أسلوب الربط، وهو التجزئة هنا، وتحديد الجدول الذي يجري تحويله إلى جدول تجزئة، وعادةً ما يكون الجدول الأصغر.
Hash Join (cost=30.0..520.0 rows=900 width=72)
Hash Cond: (o.customer_id = c.id)
-> Seq Scan on orders o (cost=0..400 rows=10000)
-> Hash (cost=18..18 rows=500)
-> Seq Scan on customers c (cost=0..18 rows=500)مؤشرات الخطر التي يجب التنبيه إليها
درّب عينك على ملاحظة علامات التحذير التالية في أي خطة:
- Seq Scan على جدول ضخم مع مرشح انتقائي؛ قد يساعد إنشاء فهرس.
- اختلاف كبير بين الصفوف المقدّرة والفعلية؛ الإحصاءات قديمة.
- Nested Loop مع عدد كبير من الحلقات على جدول كبير؛ وغالبًا ما يشير ذلك إلى فهرس مفقود على مفتاح الربط الداخلي.
- تسرب Sort أو Hash إلى القرص، كما يظهر في استخدام
Disk؛ قيمةwork_memصغيرة جدًا. - ارتفاع كبير جدًا في Rows Removed by Filter؛ لقد قرأت معظم الجدول وتخلصت منه.
تنسيقات الإخراج وBUFFERS
تتوفر الخطط بعدة تنسيقات. ويكون التنسيق الافتراضي TEXT هو ما تقرؤه بصوت عالٍ في المقابلات، لكن يمكنك أيضًا طلب إخراج منظم.
ينتج EXPLAIN (FORMAT JSON) أو FORMAT YAML خططًا قابلة للقراءة آليًا، ويمكن للأدوات ولوحات المعلومات تحليلها. ونادرًا ما تحتاج إلى قراءتها يدويًا، لكن معرفتك بوجودها تمثل لمسة جيدة تدل على الخبرة المتقدمة.
أضف الخيارات بين قوسين: EXPLAIN (ANALYZE, BUFFERS). ويعرض الخيار BUFFERS مرات الوصول إلى ذاكرة التخزين المؤقت مقارنةً بقراءات القرص، وهو مفيد جدًا لتشخيص الاستعلامات المقيّدة بالإدخال والإخراج.
EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM orders WHERE customer_id = 42;اختبار سريع
يعرض لك المحاور عقدة EXPLAIN ANALYZE تحتوي على rows=1000 في قسم التكلفة، لكن تحتوي على actual ... rows=480000. ما التشخيص الأرجح؟
خلاصة
يمكنك الآن قراءة الخطة مثل خبير:
- يقدّر
EXPLAINالنتائج، بينما ينفذEXPLAIN ANALYZEالخطة ويقيسها. - اقرأ الشجرة من الأسفل إلى الأعلى؛ تُنفّذ الأوراق أولًا، وتنتج العقدة الجذرية المخرجات.
- تعرض كل عقدة التكلفة بوحدات نسبية، وعدد الصفوف، والعرض؛ أما
actual timeفهو الزمن الحقيقي بالميلي ثانية. - تضرب
loopsالأرقام الخاصة بكل حلقة، لذا انتبه إلى الحلقات المتداخلة. - تُعد الفجوة بين عدد الصفوف المقدّر والفعلي أهم مؤشر تشخيصي لديك.
اشرح الخطة بصوت عالٍ ونبّه إلى مؤشرات الخطر؛ فهذا هو السلوك الذي يميز الإجابة الفائزة في المقابلة.
الأسئلة الشائعة
هل درس «قراءة خطة EXPLAIN» مجاني؟
نعم — نص درس «قراءة خطة EXPLAIN» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Interview Prep 4 دروس في المجموع.
ماذا ستتعلم في «قراءة خطة EXPLAIN»؟
تفسير أنواع المسح وأساليب الربط وتقديرات التكلفة في خطة الاستعلام تتمرن على SQL Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ SQL Interview Prep؟
لا تُشترط خبرة سابقة. SQL Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «قراءة خطة EXPLAIN»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس SQL Interview Prep هذا؟
نعم. كل درس في SQL Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- قراءة خطة EXPLAIN
- Seq Scan مقابل Index Scan مقابل Index-Only
- خوارزميات الربط: Nested Loop وHash وMerge
- اكتشاف الاستعلامات البطيئة وإصلاحها