> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> تُسهّل التحديثات الخفيفة عملية تحديث البيانات في قاعدة البيانات باستخدام أجزاء التصحيح.

# عبارة `UPDATE` للتحديث الخفيف

export const BetaBadge = ({link, galaxyTrack, galaxyEvent}) => {
  if (link) {
    return <a href={link} target="_blank" rel="noopener noreferrer" className="betaBadge" onClick={galaxyTrack && galaxyEvent ? galaxyOnClick(galaxyEvent) : undefined}>
                <Icon />
                <span>Beta</span>
            </a>;
  }
  return <div className="betaBadge">
            <Icon />
            <span>
                ميزة Beta. 
                <u>
                    <a href="/docs/docs/beta-and-experimental-features#beta-features">
                        مزيد من المعلومات.
                    </a>
                </u>
            </span>
        </div>;
};

<BetaBadge />

<Note>
  التحديثات الخفيفة لا تزال حاليًا في المرحلة التجريبية.
  إذا واجهت أي مشكلات، يُرجى فتح بلاغ في [مستودع ClickHouse](https://github.com/clickhouse/clickhouse/issues).
</Note>

تُحدِّث تعليمة `UPDATE` الخفيفة الصفوف في الجدول `[db.]table` التي تطابق التعبير `filter_expr`.
ويُطلق عليها اسم "التحديث الخفيف" لتمييزها عن استعلام [`ALTER TABLE ... UPDATE`](/docs/ar/reference/statements/alter/update)، وهو عملية ثقيلة تعيد كتابة أعمدة كاملة في أجزاء البيانات.
وهي متاحة فقط لعائلة محركات الجداول [`MergeTree`](/docs/ar/reference/engines/table-engines/mergetree-family/mergetree).

```sql theme={null}
UPDATE [db.]table [ON CLUSTER cluster] SET column1 = expr1 [, ...] [IN PARTITION partition_expr] WHERE filter_expr;
```

يجب أن يكون `filter_expr` من النوع `UInt8`. يُحدِّث هذا الاستعلام قيم الأعمدة المحددة لتصبح قيمَ التعبيرات المقابلة في الصفوف التي تكون فيها قيمة `filter_expr` غير صفرية.
تُحوَّل القيم إلى نوع العمود باستخدام العامل `CAST`. لا يُدعم تحديث الأعمدة المستخدمة في حساب المفتاح الأساسي أو مفاتيح التقسيم.

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

```sql theme={null}
UPDATE hits SET Title = 'Updated Title' WHERE EventDate = today();

UPDATE wikistat SET hits = hits + 1, time = now() WHERE path = 'ClickHouse';
```

<div id="lightweight-update-does-not-update-data-immediately">
  ## لا يُحدِّث التحديث الخفيف البيانات فورًا
</div>

يُنفَّذ `UPDATE` خفيف الوزن باستخدام **أجزاء التصحيح** — وهي نوع خاص من جزء البيانات لا يحتوي إلا على الأعمدة والصفوف المُحدَّثة.
ينشئ `UPDATE` خفيف الوزن أجزاء تصحيح، لكنه لا يُعدِّل البيانات الأصلية فعليًا في التخزين على الفور.
تشبه عملية التحديث استعلام `INSERT ... SELECT ...`، لكن استعلام `UPDATE` ينتظر حتى يكتمل إنشاء جزء التصحيح قبل أن يُنهي التنفيذ.

القيم المُحدَّثة تكون:

* **مرئية فورًا** في استعلامات `SELECT` عبر تطبيق التصحيحات
* **تُطبَّق فعليًا** فقط أثناء عمليات الدمج وعمليات mutation اللاحقة
* **تُنظَّف تلقائيًا** بمجرد أن تكون جميع الأجزاء النشطة قد طُبِّقت عليها التصحيحات فعليًا

<div id="lightweight-update-requirements">
  ## متطلبات التحديث الخفيف
</div>

تدعم المحركات [`MergeTree`](/docs/ar/reference/engines/table-engines/mergetree-family/mergetree) و[`ReplacingMergeTree`](/docs/ar/reference/engines/table-engines/mergetree-family/replacingmergetree) و[`CollapsingMergeTree`](/docs/ar/reference/engines/table-engines/mergetree-family/collapsingmergetree) و[`VersionedCollapsingMergeTree`](/docs/ar/reference/engines/table-engines/mergetree-family/versionedcollapsingmergetree) التحديث الخفيف، وكذلك إصداراتها [`Replicated`](/docs/ar/reference/engines/table-engines/mergetree-family/replication) و[`Shared`](/docs/ar/products/cloud/features/infrastructure/shared-merge-tree).

لاستخدام التحديث الخفيف، يجب تمكين مادية العمودين `_block_number` و`_block_offset` باستخدام إعدادات الجدول [`enable_block_number_column`](/docs/ar/reference/settings/merge-tree-settings#enable_block_number_column) و[`enable_block_offset_column`](/docs/ar/reference/settings/merge-tree-settings#enable_block_offset_column).

<div id="lightweight-delete">
  ## عمليات الحذف الخفيفة
</div>

يمكن تنفيذ استعلام [`DELETE` خفيف الوزن](/docs/ar/reference/statements/delete) باعتباره `UPDATE` خفيفًا بدلًا من عملية mutation من نوع `ALTER UPDATE`. ويُتحكَّم في آلية تنفيذ `DELETE` خفيف الوزن من خلال الإعداد [`lightweight_delete_mode`](/docs/ar/reference/settings/session-settings#lightweight_delete_mode).

<div id="performance-considerations">
  ## اعتبارات الأداء
</div>

**مزايا التحديثات الخفيفة:**

* زمن استجابة التحديث مماثل لزمن استجابة استعلام `INSERT ... SELECT ...`
* لا تُكتب سوى الأعمدة والقيم المُحدَّثة، وليس الأعمدة كاملةً داخل أجزاء البيانات
* لا حاجة إلى انتظار اكتمال عمليات الدمج/التعديلات الجارية حاليًا، لذلك يكون زمن استجابة التحديث قابلًا للتوقّع
* يمكن تنفيذ التحديثات الخفيفة بالتوازي

**التأثيرات المحتملة على الأداء:**

* تضيف عبئًا إضافيًا إلى استعلامات `SELECT` التي تحتاج إلى تطبيق التصحيحات
* لن تُستخدم [فهارس التخطي](/docs/ar/reference/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-data_skipping-indexes) للأعمدة في أجزاء البيانات التي تحتوي على تصحيحات يجب تطبيقها. كما لن تُستخدم [الإسقاطات](/docs/ar/reference/engines/table-engines/mergetree-family/mergetree#projections) إذا كانت هناك أجزاء تصحيح في الجدول، بما في ذلك أجزاء البيانات التي لا تحتوي على تصحيحات يجب تطبيقها.
* قد تؤدي التحديثات الصغيرة، إذا كانت متكررة جدًا، إلى ظهور الخطأ "too many parts". ويُنصح بتجميع عدة تحديثات في استعلام واحد، على سبيل المثال بوضع المعرّفات الخاصة بالتحديثات في عبارة `IN` واحدة داخل عبارة `WHERE`
* صُممت التحديثات الخفيفة لتحديث عدد صغير من الصفوف (حتى نحو 10% من الجدول). وإذا كنت بحاجة إلى تحديث عدد أكبر، فيُنصح باستخدام التعديل [`ALTER TABLE ... UPDATE`](/docs/ar/reference/statements/alter/update)

<div id="concurrent-operations">
  ## العمليات المتزامنة
</div>

لا ينتظر التحديث الخفيف اكتمال عمليات الدمج/التعديلات (mutations) الجارية حاليًا، على عكس التعديلات الثقيلة.
ويُحدَّد اتساق التحديث الخفيف المتزامن بواسطة الإعدادات [`update_sequential_consistency`](/docs/ar/reference/settings/session-settings#update_sequential_consistency) و[`update_parallel_mode`](/docs/ar/reference/settings/session-settings#update_parallel_mode).

<div id="update-permissions">
  ## أذونات التحديث
</div>

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

```sql theme={null}
GRANT ALTER UPDATE ON db.table TO username;
```

<div id="details-of-the-implementation">
  ## تفاصيل التنفيذ
</div>

أجزاء التصحيح هي مثل الأجزاء العادية، لكنها لا تحتوي إلا على الأعمدة المحدَّثة وعدة أعمدة نظام:

* `_part` - اسم الجزء الأصلي
* `_part_offset` - رقم الصف في الجزء الأصلي
* `_block_number` - رقم الكتلة للصف في الجزء الأصلي
* `_block_offset` - إزاحة الكتلة للصف في الجزء الأصلي
* `_data_version` - إصدار البيانات للبيانات المحدَّثة (رقم الكتلة المخصَّص لاستعلام `UPDATE`)

في المتوسط، يضيف ذلك نحو 40 بايتًا من العبء الإضافي (بيانات غير مضغوطة) لكل صف محدَّث في أجزاء التصحيح.
وتساعد أعمدة النظام في العثور على الصفوف داخل الجزء الأصلي التي يجب تحديثها.
وترتبط أعمدة النظام بـ [الأعمدة الافتراضية](/docs/ar/reference/engines/table-engines/mergetree-family/mergetree#virtual-columns) في الجزء الأصلي، والتي تُضاف عند القراءة إذا كان ينبغي تطبيق أجزاء التصحيح.
وتُرتَّب أجزاء التصحيح حسب `_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](/docs/ar/reference/engines/table-engines/mergetree-family/replacingmergetree) مع `_data_version` بوصفه عمود إصدار.
ولذلك تحتفظ أجزاء التصحيح دائمًا بأحدث إصدار لكل صف محدَّث في الجزء.

لا ينتظر التحديث الخفيف انتهاء عمليات الدمج وعمليات التعديل الجارية حاليًا، بل تستخدم دائمًا اللقطة الحالية لأجزاء البيانات لتنفيذ التحديث وإنتاج جزء تصحيح.
وبسبب ذلك، قد توجد حالتان لتطبيق أجزاء التصحيح.

فعلى سبيل المثال، إذا قرأنا الجزء `A`، فنحن بحاجة إلى تطبيق جزء التصحيح `X`:

* إذا كان `X` يحتوي على الجزء `A` نفسه. ويحدث ذلك إذا لم يكن `A` مشاركًا في عملية دمج عند تنفيذ `UPDATE`.
* إذا كان `X` يحتوي على الجزأين `B` و `C`، اللذين يشملهما الجزء `A`. ويحدث ذلك إذا كانت هناك عملية دمج (`B`, `C`) -> `A` قيد التشغيل عند تنفيذ `UPDATE`.

ولهاتين الحالتين، توجد طريقتان لتطبيق أجزاء التصحيح على التوالي:

* استخدام الدمج بحسب الأعمدة المرتَّبة `_part` و `_part_offset`.
* استخدام join بحسب العمودين `_block_number` و `_block_offset`.

وضع join أبطأ ويتطلب ذاكرة أكبر من وضع الدمج، لكنه يُستخدم بوتيرة أقل.

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

* [`ALTER UPDATE`](/docs/ar/reference/statements/alter/update) - عمليات `UPDATE` الثقيلة
* [`DELETE` خفيف الوزن](/docs/ar/reference/statements/delete) - عمليات `DELETE` خفيفة الوزن
* [`APPLY PATCHES`](/docs/ar/reference/statements/alter/apply-patches) - فرض التجسيد المادي للتصحيحات في أجزاء البيانات (عملية mutation)
