الانتقال إلى المحتوى الرئيسي
توجد عدة طرق لحذف البيانات في ClickHouse، ولكل منها مزاياها وخصائص أداء مختلفة. ينبغي اختيار الطريقة المناسبة بناءً على نموذج البيانات لديك وكمية البيانات التي تنوي حذفها.
الطريقةالصياغةمتى تُستخدم
الحذف الخفيفDELETE FROM [table]يُستخدم عند حذف كميات صغيرة من البيانات. تُستبعد الصفوف فورًا من جميع استعلامات SELECT اللاحقة، لكنها في البداية لا تُزال من القرص، بل تُعلَّم داخليًا فقط على أنها محذوفة.
الحذف بالتعديلALTER TABLE [table] DELETEيُستخدم عندما يجب حذف البيانات من القرص فورًا (على سبيل المثال، لأغراض الامتثال). ويؤثر سلبًا في أداء SELECT.
تفريغ الجدولTRUNCATE TABLE [db.table]يزيل جميع البيانات من الجدول بكفاءة.
حذف التقسيمDROP PARTITIONيزيل جميع البيانات من القسم بكفاءة.
فيما يلي ملخص للطرق المختلفة لحذف البيانات في ClickHouse:

عمليات الحذف الخفيف

تؤدي عمليات الحذف الخفيف إلى وسم الصفوف فورًا بأنها محذوفة، بحيث يمكن تصفيتها تلقائيًا من جميع استعلامات SELECT اللاحقة. وتُزال هذه الصفوف المحذوفة لاحقًا أثناء دورات الدمج الطبيعية، مما يترتب عليه قدر أقل من عمليات الإدخال/الإخراج. ونتيجة لذلك، قد تظل البيانات، لفترة غير محددة، غير محذوفة فعليًا من التخزين، وإنما موسومة فقط بأنها محذوفة. إذا كنت بحاجة إلى ضمان حذف البيانات، ففكّر في استخدام أمر تعديل المذكور أعلاه.
-- delete all data from 2018 with a lightweight delete. Not recommended.
DELETE FROM posts WHERE toYear(CreationDate) = 2018
يمكن أن يؤثر حذف كميات كبيرة من البيانات باستخدام عبارة DELETE الخفيفة سلبًا أيضًا على أداء استعلامات SELECT. كما أن هذا الأمر غير متوافق مع الجداول التي تحتوي على إسقاطات. لاحظ أنه يتم استخدام تعديل في هذه العملية لوسم الصفوف المحذوفة (عن طريق إضافة عمود _row_exists)، مما يترتب عليه بعض عمليات I/O. بوجه عام، يُفضَّل استخدام عمليات الحذف الخفيف بدلًا من التعديلات إذا كان من المقبول بقاء البيانات المحذوفة على القرص (على سبيل المثال، في الحالات غير المرتبطة بالامتثال). ومع ذلك، ينبغي تجنب هذا النهج إذا كانت هناك حاجة إلى حذف جميع البيانات. اقرأ المزيد عن عمليات الحذف الخفيف.

عمليات الحذف بالتعديل

يمكن تنفيذ عمليات الحذف بالتعديل باستخدام الأمر ALTER TABLE ... DELETE، على سبيل المثال.
-- delete all data from 2018 with a mutation. Not recommended.
ALTER TABLE posts DELETE WHERE toYear(CreationDate) = 2018
يمكن تنفيذ هذه العمليات إما بشكل متزامن (وهو السلوك الافتراضي إذا كانت غير مكررة) أو بشكل غير متزامن (بحسب الإعداد mutations_sync). وهذه عمليات كثيفة جدًا من ناحية I/O، إذ تعيد كتابة جميع الأجزاء التي تطابق تعبير WHERE. ولا تتمتع هذه العملية بخاصية الذرية، إذ تُستبدل الأجزاء بأجزاء خضعت لـ تعديل بمجرد أن تصبح جاهزة، وسيطّلع استعلام SELECT الذي يبدأ تنفيذه أثناء تعديل على بيانات من الأجزاء التي خضعت لـ تعديل بالفعل، إلى جانب بيانات من الأجزاء التي لم تخضع لها بعد. ويمكن للمستخدمين تتبّع حالة التقدّم عبر جدول system.mutations. وهذه عمليات كثيفة من ناحية I/O، لذا ينبغي استخدامها بحذر لأنها قد تؤثر في أداء SELECT على مستوى الـ cluster. اقرأ المزيد عن عمليات الحذف بالتعديل.

تفريغ الجدول

إذا كنت بحاجة إلى حذف جميع البيانات من جدول، فاستخدم الأمر TRUNCATE TABLE الموضح أدناه. وهذه عملية منخفضة التكلفة.
TRUNCATE TABLE posts
اقرأ المزيد عن TRUNCATE TABLE.

حذف التقسيم

إذا كنت قد حدّدت مفتاح تقسيم مخصّصًا لبياناتك، فيمكن حذف التقسيمات بكفاءة. تجنّب التقسيم ذي الكاردينالية العالية.
ALTER TABLE posts (DROP PARTITION '2008')
اقرأ المزيد عن DROP PARTITION.

مراجع إضافية

آخر تعديل في ٢٩ يونيو ٢٠٢٦