التحديثات الخفيفة لا تزال حاليًا في المرحلة التجريبية.
إذا واجهت أي مشكلات، يُرجى فتح بلاغ في مستودع ClickHouse.
UPDATE الخفيفة الصفوف في الجدول [db.]table التي تطابق التعبير filter_expr.
ويُطلق عليها اسم “التحديث الخفيف” لتمييزها عن استعلام ALTER TABLE ... UPDATE، وهو عملية ثقيلة تعيد كتابة أعمدة كاملة في أجزاء البيانات.
وهي متاحة فقط لعائلة محركات الجداول MergeTree.
filter_expr من النوع UInt8. يُحدِّث هذا الاستعلام قيم الأعمدة المحددة لتصبح قيمَ التعبيرات المقابلة في الصفوف التي تكون فيها قيمة filter_expr غير صفرية.
تُحوَّل القيم إلى نوع العمود باستخدام العامل CAST. لا يُدعم تحديث الأعمدة المستخدمة في حساب المفتاح الأساسي أو مفاتيح التقسيم.
أمثلة
لا يُحدِّث التحديث الخفيف البيانات فورًا
UPDATE خفيف الوزن باستخدام أجزاء التصحيح — وهي نوع خاص من جزء البيانات لا يحتوي إلا على الأعمدة والصفوف المُحدَّثة.
ينشئ UPDATE خفيف الوزن أجزاء تصحيح، لكنه لا يُعدِّل البيانات الأصلية فعليًا في التخزين على الفور.
تشبه عملية التحديث استعلام INSERT ... SELECT ...، لكن استعلام UPDATE ينتظر حتى يكتمل إنشاء جزء التصحيح قبل أن يُنهي التنفيذ.
القيم المُحدَّثة تكون:
- مرئية فورًا في استعلامات
SELECTعبر تطبيق التصحيحات - تُطبَّق فعليًا فقط أثناء عمليات الدمج وعمليات mutation اللاحقة
- تُنظَّف تلقائيًا بمجرد أن تكون جميع الأجزاء النشطة قد طُبِّقت عليها التصحيحات فعليًا
متطلبات التحديث الخفيف
MergeTree وReplacingMergeTree وCollapsingMergeTree وVersionedCollapsingMergeTree التحديث الخفيف، وكذلك إصداراتها Replicated وShared.
لاستخدام التحديث الخفيف، يجب تمكين مادية العمودين _block_number و_block_offset باستخدام إعدادات الجدول enable_block_number_column وenable_block_offset_column.
عمليات الحذف الخفيفة
DELETE خفيف الوزن باعتباره UPDATE خفيفًا بدلًا من عملية mutation من نوع ALTER UPDATE. ويُتحكَّم في آلية تنفيذ DELETE خفيف الوزن من خلال الإعداد lightweight_delete_mode.
اعتبارات الأداء
- زمن استجابة التحديث مماثل لزمن استجابة استعلام
INSERT ... SELECT ... - لا تُكتب سوى الأعمدة والقيم المُحدَّثة، وليس الأعمدة كاملةً داخل أجزاء البيانات
- لا حاجة إلى انتظار اكتمال عمليات الدمج/التعديلات الجارية حاليًا، لذلك يكون زمن استجابة التحديث قابلًا للتوقّع
- يمكن تنفيذ التحديثات الخفيفة بالتوازي
- تضيف عبئًا إضافيًا إلى استعلامات
SELECTالتي تحتاج إلى تطبيق التصحيحات - لن تُستخدم فهارس التخطي للأعمدة في أجزاء البيانات التي تحتوي على تصحيحات يجب تطبيقها. كما لن تُستخدم الإسقاطات إذا كانت هناك أجزاء تصحيح في الجدول، بما في ذلك أجزاء البيانات التي لا تحتوي على تصحيحات يجب تطبيقها.
- قد تؤدي التحديثات الصغيرة، إذا كانت متكررة جدًا، إلى ظهور الخطأ “too many parts”. ويُنصح بتجميع عدة تحديثات في استعلام واحد، على سبيل المثال بوضع المعرّفات الخاصة بالتحديثات في عبارة
INواحدة داخل عبارةWHERE - صُممت التحديثات الخفيفة لتحديث عدد صغير من الصفوف (حتى نحو 10% من الجدول). وإذا كنت بحاجة إلى تحديث عدد أكبر، فيُنصح باستخدام التعديل
ALTER TABLE ... UPDATE
العمليات المتزامنة
update_sequential_consistency وupdate_parallel_mode.
أذونات التحديث
UPDATE امتياز ALTER UPDATE. لتمكين عبارات UPDATE على جدول معيّن لمستخدم محدد، شغّل:
تفاصيل التنفيذ
_part- اسم الجزء الأصلي_part_offset- رقم الصف في الجزء الأصلي_block_number- رقم الكتلة للصف في الجزء الأصلي_block_offset- إزاحة الكتلة للصف في الجزء الأصلي_data_version- إصدار البيانات للبيانات المحدَّثة (رقم الكتلة المخصَّص لاستعلامUPDATE)
_part و _part_offset.
تنتمي أجزاء التصحيح إلى أقسام مختلفة عن الجزء الأصلي.
ومعرّف القسم لجزء التصحيح هو patch-<hash of column names in patch part>-<original_partition_id>.
لذلك تُخزَّن أجزاء التصحيح ذات الأعمدة المختلفة في أقسام مختلفة.
فعلى سبيل المثال، ستؤدي ثلاثة تحديثات SET x = 1 WHERE <cond> و SET y = 1 WHERE <cond> و SET x = 1, y = 1 WHERE <cond> إلى إنشاء ثلاثة أجزاء تصحيح في ثلاثة أقسام مختلفة.
يمكن دمج أجزاء التصحيح مع بعضها لتقليل عدد التصحيحات المطبَّقة على استعلامات SELECT وتقليل العبء الإضافي. ويستخدم دمج أجزاء التصحيح خوارزمية الدمج replacing مع _data_version بوصفه عمود إصدار.
ولذلك تحتفظ أجزاء التصحيح دائمًا بأحدث إصدار لكل صف محدَّث في الجزء.
لا ينتظر التحديث الخفيف انتهاء عمليات الدمج وعمليات التعديل الجارية حاليًا، بل تستخدم دائمًا اللقطة الحالية لأجزاء البيانات لتنفيذ التحديث وإنتاج جزء تصحيح.
وبسبب ذلك، قد توجد حالتان لتطبيق أجزاء التصحيح.
فعلى سبيل المثال، إذا قرأنا الجزء A، فنحن بحاجة إلى تطبيق جزء التصحيح X:
- إذا كان
Xيحتوي على الجزءAنفسه. ويحدث ذلك إذا لم يكنAمشاركًا في عملية دمج عند تنفيذUPDATE. - إذا كان
Xيحتوي على الجزأينBوC، اللذين يشملهما الجزءA. ويحدث ذلك إذا كانت هناك عملية دمج (B,C) ->Aقيد التشغيل عند تنفيذUPDATE.
- استخدام الدمج بحسب الأعمدة المرتَّبة
_partو_part_offset. - استخدام join بحسب العمودين
_block_numberو_block_offset.
ALTER UPDATE- عملياتUPDATEالثقيلةDELETEخفيف الوزن - عملياتDELETEخفيفة الوزنAPPLY PATCHES- فرض التجسيد المادي للتصحيحات في أجزاء البيانات (عملية mutation)