PREWHERE صراحةً. وتعمل بنقل جزء من شرط WHERE تلقائيًا إلى مرحلة PREWHERE. ويقتصر دور عبارة PREWHERE على التحكم في هذا التحسين إذا كنت ترى أنك تعرف كيفية تطبيقه بصورة أفضل من السلوك الافتراضي.
عند استخدام تحسين PREWHERE، لا تُقرأ في البداية إلا الأعمدة اللازمة لتنفيذ تعبير PREWHERE. ثم تُقرأ الأعمدة الأخرى المطلوبة لتنفيذ بقية الاستعلام، ولكن فقط من الكتل التي تكون فيها قيمة تعبير PREWHERE هي true لبعض الصفوف على الأقل. وإذا كان هناك عدد كبير من الكتل التي تكون فيها قيمة تعبير PREWHERE هي false لجميع الصفوف، وكان PREWHERE يحتاج إلى أعمدة أقل من الأجزاء الأخرى من الاستعلام، فغالبًا ما يتيح ذلك قراءة قدر أقل بكثير من البيانات من القرص عند تنفيذ الاستعلام.
التحكّم في PREWHERE يدويًا
WHERE. ويكمن الاختلاف في البيانات التي تُقرأ من الجدول. عند التحكّم يدويًا في PREWHERE لشروط التصفية التي تستخدمها قلّة من الأعمدة في الاستعلام، لكنها توفّر تصفية قوية للبيانات، فإن ذلك يقلّل حجم البيانات المطلوب قراءتها.
يمكن أن يحدّد الاستعلام كلًا من PREWHERE وWHERE في الوقت نفسه. في هذه الحالة، يُنفَّذ PREWHERE قبل WHERE.
إذا كان الإعداد optimize_move_to_prewhere مضبوطًا على 0، فسيتم تعطيل الآليات الاستدلالية التي تنقل تلقائيًا أجزاءً من التعبيرات من WHERE إلى PREWHERE.
إذا كان الاستعلام يحتوي على المُعدِّل FINAL، فإن تحسين PREWHERE لا يكون صحيحًا دائمًا. ولا يُفعَّل إلا إذا كان كل من الإعدادين optimize_move_to_prewhere وoptimize_move_to_prewhere_if_final مفعّلَين.
يُنفَّذ قسم
PREWHERE قبل FINAL، لذا قد تكون نتائج استعلامات FROM ... FINAL غير دقيقة عند استخدام PREWHERE مع حقول غير موجودة في قسم ORDER BY من الجدول.القيود
PREWHERE مدعومة إلا في الجداول التابعة لعائلة *MergeTree.