MergeTree دون بنائها أو تخزينها فعليًا. وهي لا توجد إلا داخل الجلسة الحالية، ويتم إدراجها عبر EXPLAIN WHATIF.
يقدّر EXPLAIN WHATIF الإسقاطات الافتراضية العادية (المرتّبة): عدد العلامات والصفوف التي ستطالها قراءة الإسقاط عند تنفيذ استعلام، وما إذا كان مُحسِّن الاستعلامات سيختار الإسقاط بدلًا من الجدول الأساسي. ولا يقدّر جميع الإسقاطات؛ فالإسقاطات التجميعية والإسقاطات التي تتضمن عبارة WHERE مثالان على ذلك. ويعرض الإسقاطات المرشحة التي لم يقدّرها مع سبب ذلك. راجع EXPLAIN WHATIF للاطلاع على القائمة الكاملة. وتظهر الإسقاطات الافتراضية للجلسة أيضًا في system.hypothetical_projections.
CREATE HYPOTHETICAL PROJECTION
ALTER TABLE ... ADD PROJECTION، ويجري التحقق من التعريف بالطريقة نفسها تمامًا، لذا فإن أي projection يُرفض هنا ما كان ليُجسَّد أصلًا. ولا يُبنى شيء ولا يُكتب — إذ يُخزَّن الوصف فقط، ضمن الجلسة الحالية.
name— اسم الـ projection؛ يجب أن يكون فريدًا ضمن(database, table)في هذه الجلسة، وألا يتعارض مع projection حقيقي على الجدول.- يقبل المتن الأشكال نفسها التي يقبلها الـ projection الحقيقي: projection لإعادة الترتيب باستخدام
ORDER BY، أو projection تجميعي باستخدامGROUP BY، أو projection مُرشَّح باستخدامWHERE، أو صيغة فهرس الـ projection INDEX <expression> TYPE <projection_index_type>. - تُقبل
WITH SETTINGS (...)ويُحتفظ بها، وتظهر الإعدادات فيsystem.hypothetical_projections.
MergeTree وضمن قاعدة بيانات Atomic (أي أن يكون له معرّف UUID)، لأن مخزن الجلسة يفهرس المُدخلات بحسب معرّف UUID الخاص بالجدول. وتنطبق هنا أيضًا القيود التي يفرضها ADD PROJECTION الحقيقي: تُرفض الجداول التي تحتوي على UNIQUE KEY، وأوضاع الدمج غير Ordinary عندما تكون deduplicate_merge_projection_mode = throw، وMergeTree بالصيغة النحوية القديمة، والأقراص غير القابلة للتغيير.
مثال
DROP HYPOTHETICAL PROJECTION
DROP ALL HYPOTHETICAL PROJECTIONS
DROP ALL HYPOTHETICAL INDEXES فيفعل العكس.
النطاق ودورة الحياة
- لا توجد الإسقاطات الافتراضية إلا في الجلسة الحالية — فهي غير مرئية للجلسات الأخرى ويتم التخلص منها عند انتهاء الجلسة.
- تعريف إحداها أو حذفها لا يُنشئ أي إسقاط ولا يؤثر مطلقًا على الاستعلامات العادية على الجدول.
- يمكنك الاطلاع على الإسقاطات الافتراضية للجلسة الحالية عبر
system.hypothetical_projections.
الصلاحيات المطلوبة
يتطلبCREATE HYPOTHETICAL PROJECTION صلاحية ALTER ADD PROJECTION على الجدول — وهي الصلاحية نفسها التي يحتاجها الأمر الفعلي ALTER TABLE ... ADD PROJECTION — لأنه يتحقق من صحة التعريف بمقارنته بأعمدة الجدول. ويتطلب EXPLAIN WHATIF صلاحية SELECT على مستوى العمود لأعمدة الإسقاط كي يتمكن من تقديره، كما هو الحال بالفعل مع CREATE HYPOTHETICAL INDEX.
ويتطلب DROP HYPOTHETICAL PROJECTION الصلاحية نفسها، حتى لا يكشف ذكر اسم جدول في عملية حذف عمّا إذا كان موجودًا أو مؤهلًا، ويعيد EXPLAIN WHATIF التحقق من هذه الصلاحية قبل التحقق من صحة تعريف مخزّن بمقارنته بالجدول. أما DROP ALL HYPOTHETICAL PROJECTIONS فلا يذكر أي جدول ولا يتطلب أي صلاحية.