Skip to main content
يرث هذا المحرك من MergeTree. ويتمثل الفرق في أنه عند دمج أجزاء البيانات في جداول SummingMergeTree، يستبدل ClickHouse جميع الصفوف التي لها المفتاح الأساسي نفسه (أو بدقة أكبر، مفتاح الترتيب نفسه) بصف واحد يحتوي على قيم مجمَّعة للأعمدة ذات نوع البيانات الرقمي. وإذا كان مفتاح الترتيب مُكوَّنًا بحيث تقابل قيمة مفتاح واحدة عددًا كبيرًا من الصفوف، فإن ذلك يقلل حجم التخزين بشكل كبير ويُسرّع استرجاع البيانات. نوصي باستخدام هذا المحرك إلى جانب MergeTree. خزّن البيانات الكاملة في جدول MergeTree، واستخدم SummingMergeTree لتخزين البيانات المجمَّعة، على سبيل المثال عند إعداد التقارير. ويساعدك هذا النهج على تجنب فقدان بيانات قيّمة بسبب تكوين غير صحيح للمفتاح الأساسي.

إنشاء جدول

للاطلاع على وصف معلمات الطلب، راجع وصف الطلب.

معلمات SummingMergeTree

الأعمدة

columns - عبارة عن tuple يحتوي على أسماء الأعمدة التي ستُجمَّع قيمها. معلمة اختيارية. يجب أن تكون الأعمدة من نوع بيانات رقمي، وألا تكون ضمن القسم أو مفتاح الترتيب. إذا لم يتم تحديد columns، فسيُجمِّع ClickHouse القيم في جميع الأعمدة ذات نوع البيانات الرقمي غير الموجودة ضمن مفتاح الترتيب.

بنود الاستعلام

عند إنشاء جدول SummingMergeTree، تكون البنود نفسها مطلوبة، كما هو الحال عند إنشاء جدول MergeTree.

مثال على الاستخدام

ضع في الاعتبار الجدول التالي:
أدرِج البيانات فيه:
قد لا يحسب ClickHouse مجموع كل الصفوف بالكامل (انظر أدناه)، لذا نستخدم دالة تجميع sum وعبارة GROUP BY في الاستعلام.

معالجة البيانات

عند إدخال البيانات في جدول، تُحفَظ كما هي. ويُجري ClickHouse عمليات دمج لأجزاء البيانات المُدخلة بشكل دوري، وعندها تُجمَع الصفوف التي لها المفتاح الأساسي نفسه وتُستبدَل بصف واحد في كل جزء بيانات ناتج. يمكن لـ ClickHouse دمج أجزاء البيانات بحيث قد تحتوي أجزاء البيانات الناتجة المختلفة على صفوف لها المفتاح الأساسي نفسه، أي إن الجمع سيكون غير مكتمل. لذلك، يجب استخدام دالة التجميع sum() وعبارة GROUP BY في الاستعلام كما هو موضح في المثال أعلاه.

القواعد العامة للجمع

تُجمع القيم في الأعمدة ذات نوع البيانات الرقمي. وتُحدَّد مجموعة الأعمدة بواسطة المعلمة columns. إذا كانت القيم تساوي 0 في جميع الأعمدة المخصّصة للجمع، يُحذف الصف. إذا لم يكن العمود ضمن المفتاح الأساسي ولم تُجمع قيمه، فتُختار قيمة عشوائية من القيم الموجودة. لا تُجمع القيم في الأعمدة الموجودة ضمن المفتاح الأساسي.

الجمع في أعمدة AggregateFunction

في الأعمدة من النوع AggregateFunction، يتصرف ClickHouse كما يتصرف محرك AggregatingMergeTree، إذ يجري التجميع وفقًا للدالة.

البُنى المتداخلة

يمكن أن يتضمن الجدول بُنى بيانات متداخلة تُعالَج بطريقة خاصة. إذا كان اسم جدول متداخل ينتهي بـ Map وكان يحتوي على عمودين على الأقل يستوفيان المعايير التالية:
  • يكون العمود الأول رقميًا (*Int*, Date, DateTime) أو سلسلة نصية (String, FixedString)، ولنسمّه key،
  • وتكون الأعمدة الأخرى حسابية (*Int*, Float32/64)، ولنسمّها (values...)،
فعندئذٍ يُفسَّر هذا الجدول المتداخل على أنه تعيين من key => (values...)، وعند دمج صفوفه، تُدمَج عناصر مجموعتي البيانات بحسب key مع جمع قيم (values...) المقابلة. أمثلة:
عند طلب البيانات، استخدم الدالة sumMap(key, value) لإجراء التجميع على Map. بالنسبة إلى بنية البيانات المتداخلة، لا تحتاج إلى تحديد أعمدتها ضمن tuple الأعمدة المخصّص للجمع.

تجميع عناصر Tuple

عندما يكون الإعداد allow_tuple_element_aggregation ممكّنًا، تُسطَّح أعمدة Tuple تكراريًا بحيث يُجمَع كل عنصر طرفي فيها على حدة. يتيح لك ذلك تخزين عدة مقاييس في عمود Tuple واحد وجمعها عنصرًا بعنصر أثناء عمليات الدمج. تنطبق القواعد نفسها على الأعمدة الفرعية المسطّحة كما تنطبق على الأعمدة العادية:
  • لا تُجمع إلا الأعمدة الفرعية الرقمية.
  • تُستثنى من الجمع الأعمدة الفرعية التابعة لـ Tuple ضمن مفتاح الفرز أو مفتاح التقسيم.
  • إذا تم تحديد columns، فلن تُجمع إلا الأعمدة الفرعية التابعة لأعمدة Tuple المُدرجة.
  • إذا أصبحت جميع الأعمدة الفرعية الرقمية في صف ما تساوي صفرًا بعد الجمع، فسيُحذف الصف.
هذا الإعداد غير قابل للتغيير ويجب تحديده عند إنشاء الجدول.
آخر تعديل في ٢٣ يوليو ٢٠٢٦