Skip to main content
الإسقاطات الافتراضية (Hypothetical projections) هي إسقاطات وهمية يقتصر نطاقها على الجلسة، ويمكنك إرفاقها بجدول من عائلة 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

يزيل إسقاطًا افتراضيًا (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 فلا يذكر أي جدول ولا يتطلب أي صلاحية.

انظر أيضاً