القيود
حالة الإدراج غير المؤكدة
حد نافذة إزالة التكرار
*_deduplication_window عملية إدراج أخرى أثناء تسلسل إعادة المحاولة، فقد لا تعمل إزالة التكرار كما هو مقصود. في هذه الحالة، قد تُدرَج البيانات نفسها عدة مرات.
تمكين إزالة التكرار عند الإدراج عند إعادة المحاولات
إزالة التكرار عند الإدراج في الجداول
*MergeTree.
بالنسبة إلى محرّكات *ReplicatedMergeTree، تكون إزالة التكرار عند الإدراج مفعّلة افتراضيًا، ويتحكم فيها الإعدادان replicated_deduplication_window وreplicated_deduplication_window_seconds. أما في محرّكات *MergeTree غير المكرّرة، فيتحكم في إزالة التكرار الإعداد non_replicated_deduplication_window.
تحدّد الإعدادات أعلاه معلمات سجل إزالة التكرار للجدول. ويخزّن سجل إزالة التكرار عددًا محدودًا من block_ids`، وهي التي تحدد آلية عمل إزالة التكرار (انظر أدناه).
إزالة التكرار عند الإدراج على مستوى الاستعلام
insert_deduplicate=1 إزالة التكرار على مستوى الاستعلام. لاحظ أنه إذا أدرجت بيانات باستخدام insert_deduplicate=0، فلن يكون بالإمكان إزالة تكرار هذه البيانات حتى إذا أعدت محاولة إدراجها باستخدام insert_deduplicate=1. ويرجع ذلك إلى أن معرّفات block_ids لا تُكتب للكتل أثناء عمليات الإدراج التي تستخدم insert_deduplicate=0.
كيف تعمل إزالة التكرار عند الإدراج
*MergeTree، يُخصَّص لكل كتلة block_id فريد، وهو hash لبيانات تلك الكتلة. ويُستخدم block_id هذا كمفتاح فريد لعملية الإدراج. وإذا عُثر على block_id نفسه في سجل إزالة التكرار، تُعتبر الكتلة مكررة ولا تُدرج في الجدول.
يعمل هذا النهج جيدًا عندما تحتوي عمليات الإدراج على بيانات مختلفة. ولكن إذا أُدرجت البيانات نفسها عدة مرات عن قصد، فستحتاج إلى استخدام الإعداد insert_deduplication_token للتحكم في عملية إزالة التكرار. يتيح لك هذا الإعداد تحديد رمز مميز فريد لكل عملية إدراج، ويستخدم ClickHouse هذا الرمز لتحديد ما إذا كانت البيانات مكررة.
بالنسبة إلى استعلامات INSERT ... VALUES، يكون تقسيم البيانات المُدرجة إلى كتل حتميًا ويتحدد بواسطة الإعدادات. لذلك، ينبغي إعادة محاولة الإدراج باستخدام قيم الإعدادات نفسها التي استُخدمت في العملية الأولى.
بالنسبة إلى استعلامات INSERT ... SELECT، من المهم أن يعيد جزء SELECT من الاستعلام البيانات نفسها وبالترتيب نفسه في كل عملية. لاحظ أن تحقيق ذلك عمليًا صعب. ولضمان ترتيب ثابت للبيانات عند إعادة المحاولة، حدِّد عبارة ORDER BY ALL في جزء SELECT من الاستعلام. في الوقت الحالي، يجب استخدام ORDER BY ALL حرفيًا في الاستعلام. ولم يُنفَّذ دعم ORDER BY بعد، لذلك لن يُعتبر جزء SELECT من الاستعلام ثابتًا. وضع في اعتبارك أنه قد يجري تحديث الجدول المحدد بين محاولات إعادة التنفيذ، ما يعني أن بيانات النتيجة قد تتغير ولن تحدث إزالة التكرار. بالإضافة إلى ذلك، عند إدراج كميات كبيرة من البيانات، قد يتجاوز عدد الكتل بعد عمليات الإدراج نطاق نافذة سجل إزالة التكرار، وعندها لن يتمكن ClickHouse من معرفة ضرورة إزالة تكرار الكتل.
في الوقت الحالي، يتحكم الإعداد insert_select_deduplicate في سلوك INSERT ... SELECT. ويحدد هذا الإعداد ما إذا كانت إزالة التكرار ستُطبَّق على البيانات المُدرجة باستخدام استعلامات INSERT ... SELECT. راجع الوثائق المرتبطة للحصول على التفاصيل وأمثلة الاستخدام.
إزالة تكرار الإدراج مع العروض المادية
replicated_deduplication_windowreplicated_deduplication_window_secondsnon_replicated_deduplication_window
deduplicate_blocks_in_dependent_materialized_views.
عند تمكين الإعداد insert_deduplicate=1، يُزال تكرار البيانات المُدرجة في الجدول المصدر. ويؤدي الإعداد deduplicate_blocks_in_dependent_materialized_views=1 أيضًا إلى تمكين إزالة التكرار في الجداول التابعة. يجب تمكين الإعدادين معًا إذا كان المطلوب هو إزالة التكرار الكامل.
عند إدراج كتل في الجداول التابعة للعروض المادية، يحسب ClickHouse قيمة block_id عبر إجراء تجزئة لسلسلة تجمع بين قيم block_id من الجدول المصدر ومعرّفات إضافية. ويضمن ذلك إزالة تكرار دقيقة داخل العروض المادية، بحيث يمكن تمييز البيانات استنادًا إلى عملية إدراجها الأصلية، بغض النظر عن أي تحويلات طُبّقت عليها قبل وصولها إلى جدول الوجهة التابع للعرض المادي.
أمثلة
الكتل المتطابقة بعد التحويلات في العرض المادي
dst. كتلتان من select — وجزآن عند الإدراج. تحتوي الأجزاء على بيانات مختلفة.
mv_dst. يحتوي هذان الجزآن على البيانات نفسها، لكن لم تُزل التكرارات بينهما.
dst وmv_dst.
الكتل المتطابقة عند الإدراج
dst. ومع ذلك، نرى أنه لم تُدرج سوى كتلة واحدة في الجدول dst. حدث ذلك لأن الكتلة الثانية أُزيل تكرارها. فهي تحتوي على البيانات نفسها وعلى مفتاح إزالة التكرار block_id، الذي يُحتسب على شكل hash من البيانات المُدرجة. هذا السلوك ليس ما كان متوقعًا. مثل هذه الحالات نادرة الحدوث، لكنها ممكنة نظريًا. وللتعامل مع مثل هذه الحالات على نحو صحيح، يجب على المستخدم توفير insert_deduplication_token. لنُصلِح ذلك بالأمثلة التالية:
الكتل المتطابقة عند الإدراج باستخدام insert_deduplication_token
insert_deduplication_token له أولوية أعلى: لا يستخدم ClickHouse قيمة hash للبيانات عند توفير insert_deduplication_token.
تُنتِج عمليات إدراج مختلفة البيانات نفسها بعد التحويل في الجدول الأساسي للعرض المادي
mv_dst. لا تُزال التكرارات لأن بيانات المصدر كانت مختلفة.
عمليات إدراج مختلفة من عروض مادية إلى جدول أساسي واحد ببيانات متكافئة
mv_dst (كما هو متوقع).
dst وmv_dst.