اختيار استراتيجية التحديث
- استخدام محركات الجداول المتخصصة التي تتعامل مع التحديثات عبر عمليات الإدراج
- استخدام التحديثات التصريحية مثل عبارتي
UPDATE ... SETأوALTER TABLE ... UPDATE
متى تستخدم محركات الجداول المتخصصة
وبما أن محركات الجداول من عائلة MergeTree تدمج أجزاء البيانات في الخلفية، فهي توفّر اتساقًا نهائيًا، ويجب استخدام الكلمة المفتاحية
FINAL لضمان إزالة التكرار بشكل صحيح خلال هذه الفترة عند الاستعلام عن الجدول.
توجد أيضًا أنواع محركات أخرى، لكن هذه هي الأكثر شيوعًا.
متى تستخدم التحديثات التصريحية
التحديثات باستخدام محركات الجداول المتخصصة
ReplacingMergeTree
ReplacingMergeTree بإزالة تكرار الصفوف التي لها مفتاح فرز واحد أثناء عمليات الدمج في الخلفية، مع الاحتفاظ بأحدث إصدار فقط.
FINAL أو منطق استعلام مكافئ للحصول على نتائج صحيحة وخالية من التكرار. ويضيف المُعدِّل FINAL عبئًا إضافيًا على الاستعلام يتراوح بين 21% و550% بحسب البيانات.
لا يمكن لـ ReplacingMergeTree تحديث قيم مفتاح الفرز. كما أنه يدعم عمود Deleted لعمليات الحذف المنطقي.
اقرأ المزيد: دليل ReplacingMergeTree | مرجع ReplacingMergeTree
CoalescingMergeTree
Nullable لكي يعمل ذلك كما هو مقصود. وكما هو الحال مع ReplacingMergeTree، استخدم FINAL للحصول على نتائج صحيحة ومُوحَّدة.
هذا المحرك متاح ابتداءً من ClickHouse 25.6.
اقرأ المزيد: CoalescingMergeTree
CollapsingMergeTree
CollapsingMergeTree عمود Sign لإخبار ClickHouse بكيفية التعامل مع الصفوف أثناء عمليات الدمج. إذا أُدرجت القيمة -1 في عمود Sign، فسيُطوى الصف (أي يُحذف) عند إقرانه بصف مطابق ذي القيمة +1. تُحدَّد الصفوف المطلوب تحديثها استنادًا إلى مفتاح الفرز المستخدم في عبارة ORDER BY عند إنشاء الجدول.
ReplacingMergeTree، يتيح لك CollapsingMergeTree تعديل قيم مفتاح الترتيب. وهو مناسب جدًا للعمليات القابلة للعكس التي تتضمن دلالات الإلغاء، مثل المعاملات المالية أو تتبّع حالة اللعبة.
يتطلّب نهج التحديث المذكور أعلاه أن يحتفظ تطبيقك بالحالة على جهة العميل لكي يتمكّن من إدراج صف الإلغاء. ورغم أن هذا هو النهج الأكثر كفاءة من منظور ClickHouse، فقد يكون العمل به على نطاق واسع معقّدًا. كما تحتاج الاستعلامات أيضًا إلى تجميع مع ضرب الإشارة لإنتاج نتائج صحيحة.
التحديثات التصريحية
عمليات التعديل
ALTER TABLE ... UPDATE) إلى إعادة كتابة جميع الأجزاء التي تحتوي على صفوف تطابق تعبير WHERE.
WHERE.
ولا تتسم هذه العملية بالذرية.
وتُستبدل الأجزاء بالأجزاء التي طُبِّق عليها التعديل بمجرد أن تصبح جاهزة، وسيشاهد استعلام SELECT الذي يبدأ تنفيذه أثناء عملية التعديل بيانات من أجزاء طُبِّق عليها التعديل بالفعل، إلى جانب بيانات من أجزاء لم يُطبَّق عليها التعديل بعد.
يمكنك تتبّع حالة التقدّم عبر جدول system.mutations.
اقرأ المزيد: ALTER TABLE UPDATE
التعديلات الفورية
ALTER TABLE ... UPDATE، قد تحتاج إلى الانتظار حتى تُطبَّق هذه التعديلات من خلال عملية في الخلفية لكي ترى القيم المعدَّلة منعكسة في استعلاماتك.
يوفّر ClickHouse طريقة لتغيير هذا السلوك من خلال “التعديلات الفورية”.
عندما تكون التعديلات الفورية مُمكَّنة، تُعلَّم الصفوف المحدَّثة فورًا، وتُرجِع استعلامات SELECT اللاحقة القيم المعدَّلة تلقائيًا.
يمكن تمكين التعديلات الفورية للجداول من عائلة MergeTree عبر تفعيل الإعداد على مستوى الاستعلام apply_mutations_on_fly.
مثال
مثال
لنُنشئ جدولًا وننفّذ بعض عمليات mutation:لنتحقق من نتيجة التحديثات عبر استعلام لاحظ أن قيم الصفوف لم تُحدَّث بعد عند الاستعلام عن الجدول الجديد:لنرَ الآن ما يحدث عند تمكين on-the-fly mutations:يُرجع استعلام
SELECT:SELECT الآن النتيجة الصحيحة فورًا، من دون الحاجة إلى انتظار تطبيق عمليات mutation:تأثير الأداء
SELECT. ومع ذلك، يُرجى ملاحظة أن التعديلات لا تزال تُجسَّد بشكل غير متزامن في الخلفية، وهي عملية مكلفة.
إذا ظل عدد التعديلات المُرسلة يتجاوز باستمرار عدد التعديلات التي تُعالَج في الخلفية خلال فترة زمنية معينة، فسيستمر طابور التعديلات غير المُجسَّدة المطلوب تطبيقها في النمو. وسيؤدي ذلك في النهاية إلى تراجع أداء استعلامات SELECT.
نقترح تمكين الإعداد apply_mutations_on_fly مع إعدادات أخرى على مستوى MergeTree مثل number_of_mutations_to_throw و number_of_mutations_to_delay للحد من النمو غير المحدود للتعديلات غير المُجسَّدة.
دعم الاستعلامات الفرعية والدوال غير الحتمية
mutations_max_literal_size_to_replace). كما لا تُدعَم إلا الدوال غير الحتمية الثابتة (مثل الدالة now()).
تخضع هذه السلوكيات للإعدادات التالية:
التحديثات خفيفة الوزن
UPDATE القياسية، وينشئ الأجزاء التصحيحية فورًا من دون انتظار عمليات الدمج. تصبح القيم المحدَّثة مرئية فورًا في استعلامات SELECT عبر تطبيق التصحيحات، لكنها لا تُطبَّق ماديًا إلا أثناء عمليات الدمج اللاحقة. وهذا يجعل التحديثات خفيفة الوزن مثالية لتحديث نسبة صغيرة من الصفوف (حتى نحو 10% من الجدول) بزمن استجابة متوقَّع. وتُظهر اختبارات الأداء أنها قد تكون أسرع بما يصل إلى 23 مرة من الطفرات.
لكن المقابل هو أن استعلامات SELECT تتحمّل كلفة إضافية عند تطبيق التصحيحات، كما تُحتسب الأجزاء التصحيحية ضمن حدود الأجزاء. وبعد تجاوز عتبة ~10%، تزداد الكلفة الإضافية الناتجة عن تطبيق التصحيحات عند القراءة بشكل متناسب، مما يجعل الطفرات المتزامنة أكثر كفاءة للتحديثات الأكبر.
للمزيد: UPDATE خفيف الوزن
الطفرات الفورية
توفر الطفرات الفورية آليةً لتحديث الصفوف بحيث تُرجع استعلاماتSELECT اللاحقة تلقائيًا القيم المعدّلة من دون انتظار المعالجة في الخلفية. ويعالج هذا عمليًا قصور الذرية في الطفرات العادية.
SELECT اللاحقة أن يكون الإعداد apply_mutations_on_fly = 1 مفعّلًا. تُخزَّن شروط mutation في ClickHouse Keeper، الذي يحتفظ بكل شيء في الذاكرة، وتُطبَّق آنيًا أثناء الاستعلامات.
لاحظ أن mutation لا تزال تُستخدم لتحديث البيانات، لكنها فقط لا تُطبَّق ماديًا على الفور. وستظل mutation تُنفَّذ في الخلفية كعملية غير متزامنة، وتتحمل نفس الـ overhead المرتفع مثل mutation العادية. كما أن التعبيرات التي يمكن استخدامها مع هذه العملية محدودة أيضًا (راجع التفاصيل).
اقرأ المزيد: On-the-fly mutations