Dynamic، استخدم الصياغة التالية:
N معلمة اختيارية بين 0 و254 تشير إلى عدد أنواع البيانات المختلفة التي يمكن تخزينها كأعمدة فرعية منفصلة داخل عمود من النوع Dynamic ضمن كتلة بيانات واحدة تُخزَّن بشكل منفصل (على سبيل المثال ضمن جزء بيانات واحد لجدول MergeTree). إذا تم تجاوز هذا الحد، فستُخزَّن جميع القيم ذات الأنواع الجديدة معًا في بنية بيانات مشتركة خاصة بصيغة ثنائية. القيمة الافتراضية لـ max_types هي 32.
إنشاء النوع Dynamic
Dynamic في تعريف عمود الجدول:
Variant:
قراءة أنواع Dynamic المتداخلة كأعمدة فرعية
Dynamic قراءة نوع متداخل واحد من عمود Dynamic باستخدام اسم النوع كعمود فرعي.
لذا، إذا كان لديك العمود d Dynamic، يمكنك قراءة عمود فرعي لأي نوع صالح T باستخدام الصياغة d.T.
وسيكون نوع هذا العمود الفرعي Nullable(T) إذا كان يمكن أن يوجد T داخل Nullable، وإلا فسيكون T. وسيكون هذا العمود الفرعي
بالحجم نفسه للعمود Dynamic الأصلي، وسيحتوي على قيم NULL (أو قيم فارغة إذا كان T لا يمكن أن يوجد داخل Nullable)
في جميع الصفوف التي لا يكون فيها نوع العمود Dynamic الأصلي هو T.
يمكن أيضًا قراءة الأعمدة الفرعية لـ Dynamic باستخدام الدالة dynamicElement(dynamic_column, type_name).
أمثلة:
dynamicType(dynamic_column). وتُرجع String يحتوي على اسم نوع القيمة لكل صف (أو 'None' إذا كان الصف NULL).
مثال:
التحويل بين عمود Dynamic والأعمدة الأخرى
Dynamic.
تحويل عمود عادي إلى عمود من النوع Dynamic
تحويل عمود String إلى عمود Dynamic عبر التحليل
Dynamic من عمود String، يمكنك تفعيل الإعداد cast_string_to_dynamic_use_inference:
تحويل عمود Dynamic إلى عمود عادي
Dynamic إلى عمود عادي. في هذه الحالة، ستُحوَّل جميع الأنواع المتداخلة إلى النوع الهدف:
تحويل عمود Variant إلى عمود Dynamic
تحويل عمود Dynamic(max_types=N) إلى عمود Dynamic(max_types=K) آخر
K >= N، فلن تتغير البيانات أثناء التحويل:
K < N، فستُدرج القيم ذات الأنواع الأقل شيوعًا في عمود فرعي خاص واحد، لكن سيظل الوصول إليها ممكنًا:
isDynamicElementInSharedData القيمة true للصفوف المخزّنة في بنية بيانات مشتركة خاصة داخل Dynamic، وكما نرى، فإن العمود الناتج لا يحتوي إلا على نوعين غير مخزّنين في بنية البيانات المشتركة.
إذا كانت K=0، فستُدرَج جميع الأنواع في عمود فرعي خاص واحد:
قراءة النوع Dynamic من البيانات
Dynamic. أثناء تحليل البيانات، يحاول ClickHouse استنتاج نوع كل قيمة واستخدامه عند إدراجها في العمود Dynamic.
مثال:
استخدام النوع Dynamic في الدوال
Dynamic. في هذه الحالة، تُنفَّذ الدالة بشكل منفصل على كل نوع بيانات داخلي مخزَّن في عمود Dynamic.
عندما يعتمد نوع نتيجة الدالة على أنواع الوسائط، فإن نتيجة تنفيذ تلك الدالة بوسائط Dynamic ستكون من النوع Dynamic. أما حين لا يعتمد نوع النتيجة على أنواع الوسائط، فستكون النتيجة Nullable(T) حيث T هو نوع النتيجة المعتاد لهذه الدالة.
أمثلة:
Dynamic، فسيتم طرح استثناء:
سلوك عدم توافق النوع
dynamic_throw_on_type_mismatch فيما يحدث عند تطبيق دالة على عمود Dynamic وكان النوع الفعلي المخزَّن في صفٍّ ما غير متوافق مع الدالة:
true(default) — رفع استثناء (ILLEGAL_TYPE_OF_ARGUMENT) عند أول صف غير متوافق.false— إرجاعNULLللصفوف غير المتوافقة مع الاحتفاظ بالنتيجة للصفوف المتوافقة.
استخدام النوع Dynamic في ORDER BY وGROUP BY
ORDER BY وGROUP BY، تُقارَن قيم النوع Dynamic على نحو مماثل لقيم النوع Variant:
تُحدَّد نتيجة المعامل < للقيمتين d1 من النوع الأساسي T1 وd2 من النوع الأساسي T2 من النوع Dynamic كما يلي:
- إذا كان
T1 = T2 = T، فستكون النتيجةd1.T < d2.T(ستُقارَن القيم الأساسية). - إذا كان
T1 != T2، فستكون النتيجةT1 < T2(ستُقارَن أسماء الأنواع).
Dynamic في مفاتيح GROUP BY/ORDER BY. إذا أردت استخدامه، فضع في الاعتبار قاعدة المقارنة الخاصة به وفعِّل الإعدادين allow_suspicious_types_in_group_by/allow_suspicious_types_in_order_by.
أمثلة:
</>/= وغيرها، وذلك بسبب الطريقة الخاصة التي تعمل بها الدوال مع النوع Dynamic
بلوغ الحد الأقصى لعدد أنواع البيانات المختلفة المخزَّنة داخل Dynamic
Dynamic تخزين سوى عدد محدود من أنواع البيانات المختلفة على شكل أعمدة فرعية منفصلة. يكون هذا الحد افتراضيًا 32، لكن يمكنك تغييره في تعريف النوع باستخدام الصيغة Dynamic(max_types=N)، حيث تكون N بين 0 و254 (وبسبب تفاصيل التنفيذ، يستحيل وجود أكثر من 254 نوع بيانات مختلفًا يمكن تخزينها كأعمدة فرعية منفصلة داخل Dynamic).
عند بلوغ هذا الحد، ستُدرج جميع أنواع البيانات الجديدة التي تُضاف إلى العمود Dynamic في بنية بيانات مشتركة واحدة تخزّن القيم ذات أنواع البيانات المختلفة بصيغة ثنائية.
لنرَ ما يحدث عند بلوغ هذا الحد في سيناريوهات مختلفة.
الوصول إلى الحد أثناء تحليل البيانات
Dynamic من البيانات، وعند الوصول إلى الحد في كتلة البيانات الحالية، ستُدرَج جميع القيم الجديدة في بنية البيانات المشتركة:
Int64 وArray(Int64) وString، أُدرجت جميع الأنواع الجديدة في بنية البيانات المشتركة الخاصة.
أثناء عمليات دمج أجزاء البيانات في محركات الجداول MergeTree
Dynamic في جزء البيانات الناتج إلى الحد الأقصى لعدد أنواع البيانات المختلفة التي يمكن تخزينها داخله في أعمدة فرعية منفصلة، ولن يعود قادرًا على تخزين جميع الأنواع باعتبارها أعمدة فرعية قادمة من أجزاء المصدر.
في هذه الحالة، يحدّد ClickHouse الأنواع التي ستبقى في صورة أعمدة فرعية منفصلة بعد الدمج، والأنواع التي ستُدرج في بنية بيانات مشتركة. وفي معظم الحالات، يحاول ClickHouse الإبقاء على الأنواع الأكثر شيوعًا وتخزين الأنواع الأقل شيوعًا في بنية بيانات مشتركة، لكن ذلك يعتمد على آلية التنفيذ.
لنرَ مثالًا على هذا النوع من الدمج. أولًا، لنُنشئ جدولًا يحتوي على عمود Dynamic، ونضبط الحد الأقصى لعدد أنواع البيانات المختلفة على 3، ثم نُدرج قيَمًا من 5 أنواع مختلفة:
Dynamic من نوع واحد:
UInt64 وArray(UInt64) كأعمدة فرعية، وأدخل جميع الأنواع الأخرى في البيانات المشتركة.
دوال JSONExtract مع Dynamic
JSONExtract* النوع Dynamic:
صيغة الإخراج الثنائية
Dynamic بالصيغة التالية: