Skip to main content
الإسقاطات الافتراضية (Hypothetical projections) هي إسقاطات وهمية يقتصر نطاقها على الجلسة، ويمكنك إرفاقها بجدول من عائلة MergeTree دون بنائها أو تخزينها فعليًا. وهي لا توجد إلا داخل الجلسة الحالية، ويتم إدراجها عبر EXPLAIN WHATIF. لا يقدّر EXPLAIN WHATIF حتى الآن مدى فائدة الإسقاط الافتراضي، بل يُبلغ عن كل منها بالحالة status: not_applicable. ويبقى تعريفها مفيدًا اليوم للتحقق من صحة التعريف مقابل الجدول دون تجسيده، وكذلك للأدوات التي تقرأ من 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 — لأنه يتحقق من صحة التعريف بمقارنته بأعمدة الجدول. وهو لا يقرأ أي بيانات من الجدول، لذا لا تُشترط صلاحية SELECT على أعمدة الإسقاط في الوقت الحالي؛ أما عندما يبدأ EXPLAIN WHATIF بتقدير الإسقاطات فسيقرأ تلك الأعمدة، وعندئذٍ ستصبح صلاحية SELECT على مستوى العمود مطلوبة، كما هو الحال بالفعل مع CREATE HYPOTHETICAL INDEX. ويتطلب DROP HYPOTHETICAL PROJECTION الصلاحية نفسها، حتى لا يكشف ذكر اسم جدول في عملية حذف عمّا إذا كان موجودًا أو مؤهلًا. أما DROP ALL HYPOTHETICAL PROJECTIONS فلا يذكر أي جدول ولا يتطلب أي صلاحية.

انظر أيضاً

آخر تعديل في ٢٦ سبتمبر ٢٠٢٦