الانتقال إلى المحتوى الرئيسي
تشرح هذه المقالة آلية عمل التجسيد الكسول وكيف يندرج ضمن منظومة تحسينات I/O الأوسع في ClickHouse. كما تعرض مثالًا عمليًا يوضح كيف يعزز التجسيد الكسول أداء الاستعلام.
متاح ابتداءً من الإصدار 25.4أُضيف التجسيد الكسول في الإصدار 25.4 من ClickHouse، وهو مفعّل افتراضيًا.

نظرة عامة

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

مثال تطبيقي

نوصي بشدة بمقالة المدوّنة “ClickHouse gets lazier (and faster): Introducing lazy materialization” للاطلاع المتعمق على التجسيد الكسول. المثال أدناه مأخوذ من مقالة المدوّنة المشار إليها أعلاه، وأُعيد نشره هنا لتوضيح كيف يمكن لاستعلام ClickHouse أن ينتقل من 219 ثانية إلى 139 مللي ثانية فقط (تسريع بمقدار 1576×) باستخدام التجسيد الكسول. وللاستفادة من الفهرسة وPREWHERE، يحتاج الاستعلام إلى عوامل تصفية: على أعمدة المفتاح الأساسي للاستفادة من الفهرسة، وعلى أي أعمدة للاستفادة من PREWHERE. وتُضاف التجسيد الكسول فوق ذلك بسلاسة، لكنها — بخلاف التحسينات الأخرى المذكورة سابقًا — يمكنها أيضًا تسريع الاستعلامات التي لا تحتوي على أي عوامل تصفية للأعمدة على الإطلاق. تأمل استعلام المثال التالي، الذي يعثر على مراجعات Amazon ذات أكبر عدد من الأصوات المفيدة، بغض النظر عن التاريخ أو المنتج أو التقييم أو حالة التحقق، ويُرجع أفضل 3 نتائج مع العنوان والعنوان الرئيسي والنص الكامل. ابدأ أولًا بتشغيل الاستعلام (مع ذاكرات التخزين المؤقت الباردة لنظام الملفات) مع تعطيل التجسيد الكسول (باستخدام query_plan_optimize_lazy_materialization):
Query
Response
بعد ذلك، يُعاد تنفيذ الاستعلام (مرة أخرى مع ذاكرة تخزين مؤقت باردة لنظام الملفات)، ولكن هذه المرة مع تفعيل التجسيد الكسول:
Query
عادةً، لا تحتاج إلى تعيين query_plan_optimize_lazy_materialization = true صراحةً للاستفادة من التجسيد الكسول. وهو مفعّل افتراضيًا.
Response
قارن الفرق في الأداء عند إيقاف التجسيد الكسول وتشغيله:

كيفية التحقق من التجسيد الكسول في خطة تنفيذ الاستعلام

يمكنك ملاحظة استخدام التجسيد الكسول في الاستعلام السابق من خلال فحص خطة التنفيذ المنطقية للاستعلام باستخدام عبارة EXPLAIN:
يمكنك قراءة مخطط تنفيذ المشغّلات من الأسفل إلى الأعلى، وملاحظة أن ClickHouse يؤخر قراءة أعمدة String الثلاثة الكبيرة إلى ما بعد الفرز وتطبيق الحد.
آخر تعديل في ٣ يوليو ٢٠٢٦