ORDER BY، وليس PRIMARY KEY).
لا تحدث إزالة البيانات المكررة إلا أثناء عملية دمج. وتحدث عملية الدمج في الخلفية في وقت غير معروف، لذلك لا يمكنك التخطيط لها. وقد تظل بعض البيانات غير مُعالَجة. ورغم أنه يمكنك تشغيل عملية دمج غير مجدولة باستخدام الاستعلام OPTIMIZE، فلا تعوّل على ذلك، لأن الاستعلام OPTIMIZE سيقرأ كمية كبيرة من البيانات ويكتبها.
لذلك، يُعد ReplacingMergeTree مناسبًا لإزالة البيانات المكررة في الخلفية لتوفير المساحة، لكنه لا يضمن خلو البيانات من التكرار.
يتوفر هنا دليل مفصل حول ReplacingMergeTree، بما في ذلك أفضل الممارسات وكيفية تحسين الأداء.
إنشاء جدول
يُحدَّد تفرّد الصفوف بواسطة قسم
ORDER BY في الجدول، وليس بواسطة PRIMARY KEY.معلمات ReplacingMergeTree
ver
ver — عمود يحتوي على رقم الإصدار. النوع UInt* أو Date أو DateTime أو DateTime64. مُعامِل اختياري.
عند الدمج، يحتفظ ReplacingMergeTree بصف واحد فقط من بين جميع الصفوف التي لها مفتاح الفرز نفسه:
- الصف الأخير في التحديد، إذا لم يتم تعيين
ver. والتحديد هو مجموعة من الصفوف ضمن مجموعة من الأجزاء المشاركة في عملية الدمج. ويكون الجزء الذي أُنشئ مؤخرًا (آخر عملية insert) هو الأخير في التحديد. لذلك، بعد إزالة التكرار، يبقى آخر صف أُدرج من أحدث عملية insert لكل مفتاح فرز فريد. - الصف ذو أكبر إصدار، إذا تم تحديد
ver. وإذا كانت قيمةverمتطابقة في عدة صفوف، فستُطبَّق عليها قاعدة “إذا لم يتم تحديدver”، أي سيبقى الصف المُدرَج الأحدث.
is_deleted
is_deleted — اسم عمود يُستخدم أثناء عملية الدمج لتحديد ما إذا كانت البيانات في هذا الصف تمثل الحالة أم يجب حذفها؛ 1 يشير إلى صف “محذوف”، و0 يشير إلى صف “حالة”.
نوع بيانات العمود — UInt8.
لا يمكن تمكين
is_deleted إلا عند استخدام ver.بغض النظر عن العملية التي تُجرى على البيانات، يجب زيادة رقم الإصدار. إذا كان لصفّين مُدرجين رقم الإصدار نفسه، فسيُحتفَظ بالصف الذي أُدرج أخيرًا.يحتفظ ClickHouse افتراضيًا بالصف الأخير للمفتاح حتى إذا كان هذا الصف صف حذف. وذلك حتى يمكن
إدراج أي صفوف لاحقة ذات أرقام إصدارات أقل بأمان، مع استمرار تطبيق صف الحذف.لحذف صفوف الحذف هذه نهائيًا، فعِّل إعداد الجدول allow_experimental_replacing_merge_with_cleanup ثم نفِّذ أحد الخيارين التاليين:-
اضبط إعدادات الجدول
enable_replacing_merge_with_cleanup_for_min_age_to_force_mergeوmin_age_to_force_merge_on_partition_onlyوmin_age_to_force_merge_seconds. إذا كانت جميع الأجزاء في القسم أقدم منmin_age_to_force_merge_seconds، فسيُجري ClickHouse دمجها كلها في جزء واحد ويزيل أي صفوف حذف. -
شغِّل يدويًا
OPTIMIZE TABLE table [PARTITION partition | PARTITION ID 'partition_id'] FINAL CLEANUP.
عبارات الاستعلام
ReplacingMergeTree، تكون العبارات نفسها مطلوبة، كما هو الحال عند إنشاء جدول MergeTree.
إزالة التكرار وقت الاستعلام & FINAL
ORDER BY (المستخدمة في إنشاء الجدول) بوصفها معرّفًا فريدًا، ولا يحتفظ إلا بأعلى إصدار. لكن هذا لا يوفّر سوى صحة نهائية بمرور الوقت، إذ لا يضمن إزالة تكرار الصفوف، لذا ينبغي عدم الاعتماد عليه. ولذلك قد تُنتج الاستعلامات نتائج غير صحيحة بسبب احتساب صفوف التحديث والحذف ضمن الاستعلامات.
وللحصول على نتائج صحيحة، سيحتاج المستخدمون إلى استكمال عمليات الدمج في الخلفية بإزالة التكرار وحذف الصفوف المحذوفة وقت الاستعلام. ويمكن تحقيق ذلك باستخدام العامل FINAL. على سبيل المثال، تأمل المثال التالي:
FINAL عددًا غير صحيح (تختلف النتيجة الدقيقة بحسب عمليات الدمج):
FINAL، بما في ذلك كيفية تحسين أداء FINAL، نوصي بقراءة دليلنا التفصيلي حول ReplacingMergeTree.