نظرة عامة
ومع أن تحسينات الإدخال/الإخراج المذكورة أعلاه يمكن أن تقلّل بدرجة كبيرة حجم البيانات المقروءة، فإنها لا تزال تفترض ضرورة تحميل جميع أعمدة الصفوف التي تستوفي عبارة
WHERE قبل تنفيذ عمليات مثل الفرز أو التجميع أو LIMIT. لكن ماذا لو أن بعض الأعمدة لا تكون مطلوبة إلا لاحقًا، أو أن بعض البيانات، رغم استيفائها لعبارة WHERE، لا تكون مطلوبة أصلًا؟
هنا يأتي دور التجسيد الكسول. فهو تحسين مستقل يُكمل منظومة تحسينات الإدخال/الإخراج:
- تضمن الفهرسة، بالاقتران مع
PREWHERE، ألّا تُعالَج إلا الصفوف التي تطابق عوامل تصفية الأعمدة في عبارةWHERE. - ويعتمد التجسيد الكسول على ذلك من خلال تأجيل قراءة الأعمدة إلى أن تصبح مطلوبة فعليًا وفقًا لخطة تنفيذ الاستعلام.
فحتى بعد التصفية، لا تُحمَّل فورًا إلا الأعمدة اللازمة للعملية التالية - مثل الفرز.
أما بقية الأعمدة فتُؤجَّل، وبسبب
LIMIT، لا تُقرأ غالبًا إلا جزئيًا، وبالقدر اللازم فقط لإنتاج النتيجة النهائية. وهذا يجعل التجسيد الكسول فعّالًا بشكل خاص مع استعلامات Top N، حيث قد لا تتطلب النتيجة النهائية سوى عدد محدود من الصفوف من بعض الأعمدة، التي تكون غالبًا كبيرة الحجم.
مثال تطبيقي
PREWHERE، يحتاج الاستعلام إلى عوامل تصفية: على أعمدة المفتاح الأساسي للاستفادة من الفهرسة، وعلى أي أعمدة للاستفادة من PREWHERE.
وتُضاف التجسيد الكسول فوق ذلك بسلاسة، لكنها — بخلاف التحسينات الأخرى المذكورة سابقًا — يمكنها أيضًا تسريع الاستعلامات التي لا تحتوي على أي عوامل تصفية للأعمدة على الإطلاق.
تأمل استعلام المثال التالي، الذي يعثر على مراجعات Amazon ذات أكبر عدد من الأصوات المفيدة، بغض النظر عن التاريخ أو المنتج أو التقييم أو حالة التحقق، ويُرجع أفضل 3 نتائج مع العنوان والعنوان الرئيسي والنص الكامل.
ابدأ أولًا بتشغيل الاستعلام (مع ذاكرات التخزين المؤقت الباردة لنظام الملفات) مع تعطيل التجسيد الكسول (باستخدام query_plan_optimize_lazy_materialization):
Query
Response
Query
Response
كيفية التحقق من التجسيد الكسول في خطة تنفيذ الاستعلام
EXPLAIN: