Hash Join مقابل Merge Join مقابل Nested Loop
تعرّف على استراتيجيات الربط الرئيسية الثلاث، وخصائص تكلفتها، ومتى يكون كل منها الخيار الأفضل للمخطط
Hash Join مقابل Merge Join مقابل Nested Loop درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.
ثلاث استراتيجيات للربط
لدى PostgreSQL ثلاث خوارزميات فعلية للربط:
- Nested Loop — يفحص الجانب الداخلي لكل صف من الجانب الخارجي
- Hash Join — ينشئ تجزئة للجانب الداخلي ثم يبحث فيها باستخدام الجانب الخارجي
- Merge Join — يرتب الجانبين ثم يدمجهما بالتزامن
Nested Loop
الأبسط: outer × inner. يكون سريعًا عندما يحتوي الجانب الداخلي على فهرس جيد ويكون الجانب الخارجي صغيرًا:
EXPLAIN ANALYZE
SELECT * FROM users u JOIN orders o ON o.user_id = u.id
WHERE u.id = 42;
-- Nested Loop
-- -> Index Scan on users where id = 42 (rows=1)
-- -> Index Scan on orders_user_id_idx (rows=5)متى يفوز Nested Loop
إذا كان الجانب الخارجي يحتوي على عدد قليل من الصفوف، وكان الجانب الداخلي يحتوي على فهرس لمفتاح الربط، فإن Nested Loop يكون سريعًا للغاية. أسوأ حالة: O(outer × inner).
Hash Join
أنشئ جدول تجزئة على أحد الجانبين، عادةً الأصغر، ثم ابحث فيه باستخدام الجانب الآخر. يكون ذلك مناسبًا جدًا لربط جدولين كبيرين عند عدم وجود فهرس مفيد على مفتاح الربط:
EXPLAIN ANALYZE
SELECT * FROM big_a a JOIN big_b b ON a.key = b.key;
-- Hash Join (cost=10000..50000)
-- -> Seq Scan on big_a
-- -> Hash
-- -> Seq Scan on big_bمتى يفوز Hash Join
عند ربط جدولين متوسطَي الحجم أو كبيريه، أو عند عدم وجود فهرس جيد على مفتاح الربط، أو عندما يحتاج المخطط إلى عدد كبير من الصفوف. يعتمد ذلك على الذاكرة: يجب أن يتسع جدول التجزئة في work_mem، وإلا فسيُفرَّغ إلى القرص.
Merge Join
يُرتَّب الجانبان حسب مفتاح الربط ثم يُجتازان معًا. يكون ذلك مناسبًا جدًا عندما يكون الجانبان مرتبَين مسبقًا، مثلًا بواسطة فهرس مطابق:
EXPLAIN ANALYZE
SELECT * FROM big_a a JOIN big_b b ON a.key = b.key
ORDER BY a.key;
-- Merge Join
-- -> Index Scan on big_a (a.key ASC)
-- -> Index Scan on big_b (b.key ASC)متى يفوز Merge Join
عند وجود مدخلين كبيرين ومرتّبين مسبقًا. يكون الفحص خطيًا ويحتاج إلى ذاكرة قليلة. لكن تكلفة الترتيب مهمة؛ فإذا احتاج الجانبان إلى ترتيب صريح، فعادةً ما يفوز hash.
الاختيار من بينها
يختار المخطط بناءً على:
- أعداد الصفوف المقدّرة
- الفهارس المتاحة
- الذاكرة (
work_mem) - ثوابت التكلفة في postgresql.conf
فرض استراتيجية للتشخيص فقط
لأغراض تصحيح الأخطاء، يمكنك تعطيل الاستراتيجيات:
SET enable_hashjoin = off;
SET enable_mergejoin = off;
SET enable_nestloop = off;
-- Re-run EXPLAIN to see what the planner picks instead.
-- NEVER persist these in production.التفريغ إلى القرص
إذا تجاوز جدول التجزئة أو عملية الترتيب قيمة work_mem، فسيُفرغ المشغّل ملفاته المؤقتة إلى القرص، ما يؤدي إلى إبطاء كبير. يمكنك إما زيادة work_mem أو إعادة كتابة الاستعلام.
عمليات الربط المتوازية
يمكن لـ PostgreSQL تنفيذ Hash Join وMerge Join بالتوازي، وكذلك عمليات الفحص التسلسلي وفحص الفهرس. يظهر ذلك في EXPLAIN باسم Parallel Hash Join مع Workers Planned.
قراءة الاختيار
في EXPLAIN ANALYZE، يخبرك اسم عقدة الربط بالاستراتيجية المستخدمة. يكون الاختيار صحيحًا في الغالب؛ وعندما لا يكون كذلك، ركّز على الإحصاءات والفهارس قبل فرض الاستراتيجيات.
مراجعة
تخدم استراتيجيات الربط الثلاث أشكالًا مختلفة من الاستعلامات.
- Nested Loop: جانب خارجي صغير + جانب داخلي مفهرس
- Hash: جداول كبيرة من دون فهرس مفيد
- Merge: مدخلات مرتبة مسبقًا
تحقق سريع
أنت تربط جدولين، يحتوي كل منهما على 10 ملايين صف، باستخدام عمود غير مفهرس. ما خوارزمية الربط التي يُرجح أن يختارها المخطط؟
الأسئلة الشائعة
هل درس «Hash Join مقابل Merge Join مقابل Nested Loop» مجاني؟
نعم — نص درس «Hash Join مقابل Merge Join مقابل Nested Loop» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.
ماذا ستتعلم في «Hash Join مقابل Merge Join مقابل Nested Loop»؟
تعرّف على استراتيجيات الربط الرئيسية الثلاث، وخصائص تكلفتها، ومتى يكون كل منها الخيار الأفضل للمخطط تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟
لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «Hash Join مقابل Merge Join مقابل Nested Loop»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟
نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- قراءة EXPLAIN وEXPLAIN ANALYZE
- الفحص التسلسلي مقابل فحص الفهرس
- Hash Join مقابل Merge Join مقابل Nested Loop
- تحديد الاستعلامات البطيئة وإصلاحها