> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-8c05c8a2.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# طفرات الحذف

> صفحة تصف طفرات الحذف - استعلامات ALTER التي تعدّل بيانات الجدول عبر الحذف

تشير طفرات الحذف إلى استعلامات `ALTER` التي تعدّل بيانات الجدول عبر الحذف. وأشهرها استعلامات مثل `ALTER TABLE DELETE` وغيرها. ويؤدي تنفيذ مثل هذه الاستعلامات إلى إنشاء إصدارات مُطفَّرة جديدة من أجزاء البيانات. وهذا يعني أن مثل هذه العبارات ستؤدي إلى إعادة كتابة أجزاء البيانات بالكامل لكل البيانات التي أُدرجت قبل الطفرة، ما يترتب عليه عدد كبير من طلبات الكتابة.

<Info>
  في عمليات الحذف، يمكنك تجنب هذا العدد الكبير من طلبات الكتابة باستخدام محركات جداول متخصصة مثل [ReplacingMergeTree](/ar/concepts/features/operations/update/replacing-merge-tree) أو [CollapsingMergeTree](/ar/reference/engines/table-engines/mergetree-family/collapsingmergetree) بدلًا من محرك جدول MergeTree الافتراضي.
</Info>

تُزيل عبارة `DELETE` الخفيفة الصفوف من الجدول `[db.]table` التي تطابق التعبير `expr`. ولا تتوفر إلا لعائلة محركات جداول \*MergeTree.

```sql theme={null}
DELETE FROM [db.]table [ON CLUSTER cluster] [IN PARTITION partition_expr] WHERE expr;
```

يُسمّى "الحذف `DELETE` الخفيف" تمييزًا له عن الأمر [ALTER TABLE ... DELETE](/ar/reference/statements/alter/delete)، الذي يُعد عملية ثقيلة.

<div id="examples">
  ## أمثلة
</div>

```sql theme={null}
-- Deletes all rows from the `hits` table where the `Title` column contains the text `hello`
DELETE FROM hits WHERE Title LIKE '%hello%';
```

<div id="lightweight-delete-does-not-delete-data-immediately">
  ## لا يحذف `DELETE` الخفيف البيانات فورًا
</div>

يُنَفَّذ `DELETE` الخفيف باعتباره [mutation](/ar/reference/statements/alter/index#mutations) تضع علامة على الصفوف بأنها محذوفة، لكنها لا تحذفها فعليًا على الفور.

بشكل افتراضي، تنتظر عبارات `DELETE` حتى يكتمل وضع علامة الحذف على الصفوف قبل أن تعود. وقد يستغرق ذلك وقتًا طويلًا إذا كان حجم البيانات كبيرًا. بدلًا من ذلك، يمكنك تشغيله بشكل غير متزامن في الخلفية باستخدام الإعداد [`lightweight_deletes_sync`](/ar/reference/settings/session-settings#lightweight_deletes_sync). وإذا كان هذا الإعداد معطّلًا، فستعود عبارة `DELETE` فورًا، لكن قد تظل البيانات مرئية للاستعلامات إلى أن تنتهي الـ mutation في الخلفية.

لا تحذف الـ mutation الصفوف التي وُضعت عليها علامة الحذف فعليًا؛ إذ لا يحدث ذلك إلا أثناء عملية الدمج التالية. ونتيجة لذلك، قد لا تُحذف البيانات فعليًا من التخزين لفترة غير محددة، وإنما يُكتفى فقط بوضع علامة عليها بأنها محذوفة.

إذا كنت بحاجة إلى ضمان حذف بياناتك من التخزين خلال مدة يمكن التنبؤ بها، ففكّر في استخدام إعداد الجدول [`min_age_to_force_merge_seconds`](/ar/reference/settings/merge-tree-settings#min_age_to_force_merge_seconds). أو يمكنك استخدام الأمر [ALTER TABLE ... DELETE](/ar/reference/statements/alter/delete). لاحظ أن حذف البيانات باستخدام `ALTER TABLE ... DELETE` قد يستهلك قدرًا كبيرًا من الموارد لأنه يعيد إنشاء جميع الأجزاء المتأثرة.

<div id="deleting-large-amounts-of-data">
  ## حذف كميات كبيرة من البيانات
</div>

قد يؤثر حذف كميات كبيرة من البيانات سلبًا على أداء ClickHouse. إذا كنت تحاول حذف جميع الصفوف من جدول، ففكّر في استخدام الأمر [`TRUNCATE TABLE`](/ar/reference/statements/truncate).

إذا كنت تتوقع تكرار عمليات الحذف، ففكّر في استخدام [مفتاح تقسيم مخصّص](/ar/reference/engines/table-engines/mergetree-family/custom-partitioning-key). عندها يمكنك استخدام الأمر [`ALTER TABLE ... DROP PARTITION`](/ar/reference/statements/alter/partition#drop-partitionpart) لإزالة جميع الصفوف المرتبطة بهذا القسم بسرعة.

<div id="limitations-of-lightweight-delete">
  ## قيود `DELETE` الخفيف
</div>

<div id="lightweight-deletes-with-projections">
  ### عمليات `DELETE` الخفيفة مع الإسقاطات
</div>

افتراضيًا، لا تعمل `DELETE` مع الجداول التي تتضمن إسقاطات. والسبب في ذلك أن الصفوف في الإسقاط قد تتأثر بعملية `DELETE`. لكن يوجد [إعداد MergeTree](/ar/reference/settings/merge-tree-settings) باسم `lightweight_mutation_projection_mode` لتغيير هذا السلوك.

<div id="performance-considerations-when-using-lightweight-delete">
  ## اعتبارات الأداء عند استخدام lightweight `DELETE`
</div>

**قد يؤثر حذف كميات كبيرة من البيانات باستخدام عبارة `DELETE` الخفيف سلبًا على أداء استعلامات SELECT.**

يمكن أن تؤثر العوامل التالية أيضًا سلبًا على أداء lightweight `DELETE`:

* وجود شرط `WHERE` معقّد في استعلام `DELETE`.
* إذا كان طابور عمليات mutation ممتلئًا بالعديد من عمليات mutation الأخرى، فقد يؤدي ذلك إلى مشكلات في الأداء، لأن جميع عمليات mutation على الجدول تُنفَّذ بالتسلسل.
* يحتوي الجدول المتأثر على عدد كبير جدًا من أجزاء البيانات.
* وجود كمية كبيرة من البيانات في الأجزاء المضغوطة. في الجزء المضغوط، تُخزَّن جميع الأعمدة في ملف واحد.

<div id="delete-permissions">
  ## أذونات `DELETE`
</div>

يتطلب `DELETE` امتياز `ALTER DELETE`. لتمكين عبارة `DELETE` على جدول محدد لمستخدم معيّن، شغّل الأمر التالي:

```sql theme={null}
GRANT ALTER DELETE ON db.table to username;
```

<div id="how-lightweight-deletes-work-internally-in-clickhouse">
  ## كيف تعمل عمليات DELETE الخفيفة داخليًا في ClickHouse
</div>

1. **يُطبَّق "قناع" على الصفوف المتأثرة**

   عند تنفيذ استعلام `DELETE FROM table ...`، يحفظ ClickHouse قناعًا تُوسَم فيه كل صفٍّ إما بأنه "موجود" أو "محذوف". وتُستبعَد هذه الصفوف "المحذوفة" من الاستعلامات اللاحقة. ومع ذلك، لا تُزال الصفوف فعليًا إلا لاحقًا عبر عمليات الدمج اللاحقة. وتكون كتابة هذا القناع أخف بكثير مما يجري في استعلام `ALTER TABLE ... DELETE`.

   يُنفَّذ هذا القناع على شكل عمود نظامي مخفي باسم `_row_exists` يخزّن `True` لجميع الصفوف المرئية و`False` للصفوف المحذوفة. ولا يظهر هذا العمود في الجزء إلا إذا كانت بعض الصفوف في ذلك الجزء قد حُذفت. ولا يوجد هذا العمود عندما تكون جميع القيم في الجزء مساوية لـ `True`.

2. **تُحوَّل استعلامات `SELECT` لتتضمن القناع**

   عند استخدام عمود مشمول بالقناع في استعلام، فإن استعلام `SELECT ... FROM table WHERE condition` يُوسَّع داخليًا بإضافة شرط على `_row_exists` ويُحوَّل إلى:

   ```sql theme={null}
   SELECT ... FROM table PREWHERE _row_exists WHERE condition
   ```

   وعند التنفيذ، يُقرأ العمود `_row_exists` لتحديد الصفوف التي يجب عدم إرجاعها. وإذا كان هناك عدد كبير من الصفوف المحذوفة، يمكن لـ ClickHouse تحديد الحبيبات التي يمكن تخطيها بالكامل عند قراءة بقية الأعمدة.

3. **تُحوَّل استعلامات `DELETE` إلى استعلامات `ALTER TABLE ... UPDATE`**

   يُترجم `DELETE FROM table WHERE condition` إلى عملية `mutation` بالشكل `ALTER TABLE table UPDATE _row_exists = 0 WHERE condition`.

   داخليًا، تُنفَّذ هذه الـ `mutation` على خطوتين:

   1. يُنفَّذ الأمر `SELECT count() FROM table WHERE condition` لكل جزء على حدة لتحديد ما إذا كان الجزء متأثرًا.

   2. استنادًا إلى الأوامر أعلاه، تُطبَّق `mutation` بعد ذلك على الأجزاء المتأثرة، وتُنشأ hardlinks للأجزاء غير المتأثرة. وفي حالة `wide parts`، يُحدَّث العمود `_row_exists` لكل صف، وتُربط ملفات جميع الأعمدة الأخرى عبر hardlink. أما في الأجزاء المضغوطة، فتُعاد كتابة جميع الأعمدة لأنها مخزنة معًا في ملف واحد.

   ومن الخطوات أعلاه، يتضح أن `DELETE` الخفيف باستخدام أسلوب القناع يحسّن الأداء مقارنةً بـ `ALTER TABLE ... DELETE` التقليدي، لأنه لا يعيد كتابة ملفات جميع الأعمدة للأجزاء المتأثرة.

<div id="related-content">
  ## محتوى ذو صلة
</div>

* مدونة: [التعامل مع التحديثات وعمليات الحذف في ClickHouse](https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse)
