PREWHERE التصفية أكثر كفاءة من خلال تقليل كمية البيانات المقروءة. افتراضيًا، يطبّق ClickHouse هذا التحسين حتى عندما لا يحدد الاستعلام PREWHERE صراحةً، وذلك بنقل الشروط المؤهلة من WHERE إلى PREWHERE. يمكنك تحديد PREWHERE صراحةً للتحكم في الشروط التي تُطبّق في هذه المرحلة.
باستخدام PREWHERE، يقرأ ClickHouse أولًا الأعمدة اللازمة لتقييم الشرط فقط. ثم يقرأ الأعمدة الأخرى التي يتطلبها الاستعلام للكتل التي تحتوي على صف مطابق واحد على الأقل فقط. يمكن أن يقلل ذلك من كمية البيانات المقروءة عندما يستخدم الشرط أعمدة أقل من بقية الاستعلام ويستبعد عددًا كبيرًا من الكتل.
التحكّم اليدوي في PREWHERE
PREWHERE يدويًا عندما يشير الشرط إلى عدد قليل من الأعمدة ويستبعد عددًا كبيرًا من الصفوف. يمكن أن يقلل ذلك من كمية البيانات المقروءة للأعمدة المتبقية.
يمكن أن يحتوي الاستعلام على كلٍّ من PREWHERE وWHERE. في هذه الحالة، يُقيَّم PREWHERE أولًا.
اضبط optimize_move_to_prewhere على 0 لمنع ClickHouse من نقل الشروط تلقائيًا من WHERE إلى PREWHERE.
بالنسبة إلى الاستعلامات التي تستخدم المعدِّل FINAL، لا ينقل ClickHouse الشروط من WHERE إلى PREWHERE إلا إذا كان كلٌّ من optimize_move_to_prewhere وoptimize_move_to_prewhere_if_final مفعّلًا.
افتراضيًا، يُقيَّم
PREWHERE قبل FINAL، لذا قد تُنتج استعلامات FROM ... FINAL نتائج غير متوقعة عندما يشير PREWHERE إلى أعمدة لا تدخل ضمن مفتاح ORDER BY للجدول.PREWHERE مع JOIN
PREWHERE في استعلام يتضمن JOIN أن يشير مباشرةً إلى أعمدة جدول واحد كحد أقصى. يطبّق ClickHouse الشرط على صفوف ذلك الجدول قبل وصولها إلى عملية الربط.
في المقابل، يرشّح شرط WHERE منطقيًا نتيجة الربط، رغم أن المُحسِّن قد يطبّقه قبل عملية الربط إذا كان ذلك لا يغيّر النتيجة. لذلك، قد يؤدي استخدام الشرط نفسه في PREWHERE وWHERE إلى نتائج مختلفة، لا سيما مع عمليات الربط الخارجية.
ينشئ المثال التالي جدولين لتوضيح هذا الاختلاف:
PREWHERE التصفية على table_2 قبل LEFT JOIN، لذلك يبقى الصف في table_1 الذي له id = 1 دون مطابقة:
WHERE إلى تصفية نتيجة الربط، مما يستبعد الصف الذي فيه id = 1:
القيود
PREWHERE مدعومة إلا في الجداول التابعة لعائلة *MergeTree.