> ## 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.

# إعدادات الجلسة لـ optimize_*

> إعدادات جلسة ClickHouse ضمن المجموعة المُولَّدة optimize_*.

export const SettingsInfoBlock = ({type, default_value, changeable_without_restart}) => {
  return <div className="not-prose" style={{
    display: "flex",
    flexWrap: "wrap",
    alignItems: "baseline",
    columnGap: "0.5rem",
    rowGap: "0.125rem",
    margin: "0.375rem 0",
    fontSize: "0.8125rem",
    lineHeight: "1.125rem"
  }}>
      <div style={{
    fontWeight: 600,
    opacity: 0.72
  }}>النوع</div>
      <div style={{
    overflowWrap: "anywhere"
  }}>{type}</div>
      <div style={{
    fontWeight: 600,
    opacity: 0.72,
    marginInlineStart: "0.5rem"
  }}>القيمة الافتراضية</div>
      <div style={{
    overflowWrap: "anywhere"
  }}>{default_value}</div>
      {changeable_without_restart && <div style={{
    fontWeight: 600,
    opacity: 0.72,
    marginInlineStart: "0.5rem"
  }}>
          يمكن تغييره دون إعادة التشغيل
        </div>}
      {changeable_without_restart && <div style={{
    overflowWrap: "anywhere"
  }}>
          {changeable_without_restart}
        </div>}
    </div>;
};

هذه الإعدادات متاحة في [system.settings](/docs/ar/reference/system-tables/settings)، ويتم إنشاؤها تلقائيًا من [المصدر](https://github.com/ClickHouse/ClickHouse/blob/master/src/Core/Settings.cpp).

<div id="optimize_aggregators_of_group_by_keys">
  ## optimize\_aggregators\_of\_group\_by\_keys
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

يزيل دوال التجميع min/max/any/anyLast لمفاتيح GROUP BY في قسم SELECT

<div id="optimize_append_index">
  ## optimize\_append\_index
</div>

<SettingsInfoBlock type="Bool" default_value="0" />

استخدم [القيود](/docs/ar/reference/statements/create/table#constraints) لإضافة شرط الفهرس. القيمة الافتراضية هي `false`.

القيم الممكنة:

* true, false

<div id="optimize_arithmetic_operations_in_aggregate_functions">
  ## optimize\_arithmetic\_operations\_in\_aggregate\_functions
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

نقل العمليات الحسابية خارج دوال التجميع

<div id="optimize_const_name_size">
  ## optimize\_const\_name\_size
</div>

<SettingsInfoBlock type="Int64" default_value="256" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.11"},{"label": "256"},{"label": "الاستعاضة بـ scalar واستخدام hash اسمًا للثوابت الكبيرة (يُقدَّر الحجم بطول الاسم)"}]}]} />

الاستعاضة بـ scalar واستخدام hash اسمًا للثوابت الكبيرة (يُقدَّر الحجم بطول الاسم).

القيم الممكنة:

* عدد صحيح موجب - الحد الأقصى لطول الاسم،
* 0 — دائمًا،
* عدد صحيح سالب - أبدًا.

<div id="optimize_count_from_files">
  ## optimize\_count\_from\_files
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

يُمكّن أو يعطّل تحسين احتساب عدد الصفوف من الملفات بتنسيقات إدخال مختلفة. وينطبق ذلك على دوال/محركات الجداول `file`/`s3`/`url`/`hdfs`/`azureBlobStorage`.

القيم الممكنة:

* 0 — التحسين معطّل.
* 1 — التحسين مُمكّن.

<div id="optimize_dictget_tuple_element">
  ## optimize\_dictget\_tuple\_element
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.5"},{"label": "1"},{"label": "أعِد كتابة tupleElement(dictGet(..., tuple_of_attrs, ...), N) إلى استدعاء dictGet ذي سمة واحدة."}]}]} />

أعِد كتابة `tupleElement(dictGet('dict', ('a', 'b', 'c'), key), 2)` إلى `dictGet('dict', 'b', key)` لتجنّب جلب سمات القاموس غير الضرورية. يدعم الوصول الموضعي (`.1`, `.2`, ...) والمُسمّى (`.b`)، ويَنطبق أيضًا على `dictGetOrDefault` عندما تكون وسيطة القيمة الافتراضية Tuple ثابتة أو `tuple(...)` مكوّنة من ثوابت.

<div id="optimize_distinct_in_order">
  ## optimize\_distinct\_in\_order
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

فعِّل تحسين DISTINCT إذا كانت بعض الأعمدة فيه تُشكّل بادئة للفرز. على سبيل المثال، بادئة مفتاح الفرز في MergeTree أو في عبارة ORDER BY

<div id="optimize_distributed_group_by_sharding_key">
  ## optimize\_distributed\_group\_by\_sharding\_key
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

يعمل على تحسين استعلامات `GROUP BY sharding_key` عبر تجنّب تنفيذ تجميع مكلف على الخادم البادئ، مما يقلّل استخدام الذاكرة للاستعلام على هذا الخادم.

الأنواع التالية من الاستعلامات مدعومة (بما في ذلك جميع التركيبات بينها):

* `SELECT DISTINCT [..., ]sharding_key[, ...] FROM dist`
* `SELECT ... FROM dist GROUP BY sharding_key[, ...]`
* `SELECT ... FROM dist GROUP BY sharding_key[, ...] ORDER BY x`
* `SELECT ... FROM dist GROUP BY sharding_key[, ...] LIMIT 1`
* `SELECT ... FROM dist GROUP BY sharding_key[, ...] LIMIT 1 BY x`

الأنواع التالية من الاستعلامات غير مدعومة (وقد يُضاف دعم بعضها لاحقًا):

* `SELECT ... GROUP BY sharding_key[, ...] WITH TOTALS`
* `SELECT ... GROUP BY sharding_key[, ...] WITH ROLLUP`
* `SELECT ... GROUP BY sharding_key[, ...] WITH CUBE`
* `SELECT ... GROUP BY sharding_key[, ...] SETTINGS extremes=1`

القيم الممكنة:

* 0 — معطّل.
* 1 — مفعّل.

انظر أيضًا:

* [distributed\_group\_by\_no\_merge](/docs/ar/reference/settings/session-settings/distributed#distributed_group_by_no_merge)
* [distributed\_push\_down\_limit](/docs/ar/reference/settings/session-settings/distributed#distributed_push_down_limit)
* [optimize\_skip\_unused\_shards](/docs/ar/reference/settings/session-settings/optimize-skip#optimize_skip_unused_shards)

<Note>
  في الوقت الحالي، يتطلب هذا الخيار `optimize_skip_unused_shards` (والسبب هو أنه قد يُفعَّل افتراضيًا في المستقبل، ولن يعمل بشكل صحيح إلا إذا أُدرجت البيانات عبر جدول Distributed، أي إذا كانت البيانات موزعة وفقًا لـ `sharding_key`).
</Note>

<div id="optimize_dry_run_check_part">
  ## optimize\_dry\_run\_check\_part
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.2"},{"label": "1"},{"label": "إعداد جديد"}]}]} />

عند التفعيل، يتحقق `OPTIMIZE ... DRY RUN` من الجزء المدمج الناتج باستخدام `checkDataPart`. وإذا أخفق التحقق، يُطلَق استثناء.

<div id="optimize_empty_string_comparisons">
  ## optimize\_empty\_string\_comparisons
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.10"},{"label": "1"},{"label": "إعداد جديد."}]}]} />

حوِّل تعبيرات مثل `col = ''` أو `'' = col` إلى `empty(col)`، و`col != ''` أو `'' != col` إلى `notEmpty(col)`،
وذلك فقط عندما يكون `col` من النوع `String` أو `FixedString`.

<div id="optimize_extract_common_expressions">
  ## optimize\_extract\_common\_expressions
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.1"},{"label": "1"},{"label": "تحسين تعبيرات WHERE وPREWHERE وON وHAVING وQUALIFY عبر استخراج التعبيرات المشتركة من حالات OR بين تعبيرات AND."}]}, {"id": "row-2","items": [{"label": "24.12"},{"label": "0"},{"label": "إضافة إعداد لتحسين تعبيرات WHERE وPREWHERE وON وHAVING وQUALIFY عبر استخراج التعبيرات المشتركة من حالات OR بين تعبيرات AND."}]}]} />

يسمح باستخراج التعبيرات المشتركة من حالات OR في تعبيرات WHERE وPREWHERE وON وHAVING وQUALIFY. على سبيل المثال، يمكن إعادة كتابة تعبير منطقي مثل `(A AND B) OR (A AND C)` إلى `A AND (B OR C)`، مما قد يساعد على الاستفادة من:

* الفهارس في تعبيرات التصفية البسيطة
* تحسين تحويل CROSS JOIN إلى INNER JOIN

<div id="optimize_functions_to_subcolumns">
  ## optimize\_functions\_to\_subcolumns
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "24.8"},{"label": "1"},{"label": "الإعداد مُمكَّن افتراضيًا"}]}]} />

يُمكّن هذا الإعداد التحسين أو يعطّله عبر تحويل بعض الدوال بحيث تقرأ الأعمدة الفرعية، مما يقلل كمية البيانات المطلوب قراءتها.

يمكن تحويل هذه الدوال:

* [length](/docs/ar/reference/functions/regular-functions/array-functions#length) لقراءة العمود الفرعي [size0](/docs/ar/reference/data-types/array#array-size).
* [empty](/docs/ar/reference/functions/regular-functions/array-functions#empty) لقراءة العمود الفرعي [size0](/docs/ar/reference/data-types/array#array-size).
* [notEmpty](/docs/ar/reference/functions/regular-functions/array-functions#notEmpty) لقراءة العمود الفرعي [size0](/docs/ar/reference/data-types/array#array-size).
* [isNull](/docs/ar/reference/functions/regular-functions/functions-for-nulls#isNull) لقراءة العمود الفرعي [null](/docs/ar/reference/data-types/nullable#finding-null).
* [isNotNull](/docs/ar/reference/functions/regular-functions/functions-for-nulls#isNotNull) لقراءة العمود الفرعي [null](/docs/ar/reference/data-types/nullable#finding-null).
* [count](/docs/ar/reference/functions/aggregate-functions/count) لقراءة العمود الفرعي [null](/docs/ar/reference/data-types/nullable#finding-null).
* [mapKeys](/docs/ar/reference/functions/regular-functions/tuple-map-functions#mapKeys) لقراءة العمود الفرعي [keys](/docs/ar/reference/data-types/map#reading-subcolumns-of-map).
* [mapValues](/docs/ar/reference/functions/regular-functions/tuple-map-functions#mapValues) لقراءة العمود الفرعي [values](/docs/ar/reference/data-types/map#reading-subcolumns-of-map).

القيم الممكنة:

* 0 — التحسين معطّل.
* 1 — التحسين مُمكَّن.

<div id="optimize_inverse_dictionary_lookup">
  ## optimize\_inverse\_dictionary\_lookup
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.12"},{"label": "1"},{"label": "إعداد جديد"}]}]} />

تجنّب تكرار البحث العكسي في القاموس من خلال إجراء عمليات بحث أسرع ضمن مجموعة محسوبة مسبقًا من قيم المفاتيح المحتملة.

<div id="optimize_multiif_to_if">
  ## optimize\_multiif\_to\_if
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

استبدل 'multiIf' بـ 'if' عندما يحتوي على شرط واحد فقط.

<div id="optimize_normalize_count_variants">
  ## optimize\_normalize\_count\_variants
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "21.3"},{"label": "1"},{"label": "إعادة كتابة الدوال التجميعية المكافئة دلاليًا لـ count() إلى count() افتراضيًا"}]}]} />

إعادة كتابة الدوال التجميعية المكافئة دلاليًا لـ count() إلى count().

<div id="optimize_on_insert">
  ## optimize\_on\_insert
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "21.1"},{"label": "1"},{"label": "تمكين تحسين البيانات عند INSERT افتراضيًا لتحسين تجربة المستخدم"}]}]} />

يمكّن أو يعطّل تحويل البيانات قبل الإدراج، كما لو أُجريت عملية الدمج على هذه الكتلة (وفقًا لمحرك الجدول).

القيم الممكنة:

* 0 — معطّل.
* 1 — مفعّل.

**مثال**

الفرق بين حالتي التمكين والتعطيل:

الاستعلام:

```sql theme={null}
SET optimize_on_insert = 1;

CREATE TABLE test1 (`FirstTable` UInt32) ENGINE = ReplacingMergeTree ORDER BY FirstTable;

INSERT INTO test1 SELECT number % 2 FROM numbers(5);

SELECT * FROM test1;

SET optimize_on_insert = 0;

CREATE TABLE test2 (`SecondTable` UInt32) ENGINE = ReplacingMergeTree ORDER BY SecondTable;

INSERT INTO test2 SELECT number % 2 FROM numbers(5);

SELECT * FROM test2;
```

النتيجة:

```text theme={null}
┌─FirstTable─┐
│          0 │
│          1 │
└────────────┘

┌─SecondTable─┐
│           0 │
│           0 │
│           0 │
│           1 │
│           1 │
└─────────────┘
```

لاحظ أن هذا الإعداد يؤثر في سلوك [العرض المادي](/docs/ar/reference/statements/create/view#materialized-view).

<div id="optimize_prewhere_after_pushdown">
  ## optimize\_prewhere\_after\_pushdown
</div>

<SettingsInfoBlock type="Bool" default_value="0" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.6"},{"label": "0"},{"label": "إعداد جديد يفعّل تمريرة ثانية لترقية `PREWHERE` لدمج عوامل التصفية التي أودعتها تحسينات لاحقة فوق خطوة قراءة `MergeTree` (مثل دفع المسند عبر `JOIN` وإعادات كتابة الإسقاط) في سلسلة `PREWHERE` الحالية."}]}]} />

شغّل تمريرة ثانية لترقية `PREWHERE` بعد أن تكون تحسينات لاحقة في خطة الاستعلام قد
أضافت عوامل تصفية أخرى فوق خطوة قراءة `MergeTree` (على سبيل المثال، دفع المسند عبر
`JOIN` وإعادات كتابة الإسقاط). وعند وجود `PREWHERE` حالي مسبقًا، يُدمَج عامل
التصفية الجديد فيه باستخدام `AND` بدلًا من أن يبقى كخطوة تصفية منفصلة.

<div id="optimize_qbit_distance_function_reads">
  ## optimize\_qbit\_distance\_function\_reads
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.10"},{"label": "1"},{"label": "إعداد جديد"}]}]} />

يستبدل دوال المسافة على نوع البيانات `QBit` بما يكافئها من الدوال التي لا تقرأ من التخزين إلا الأعمدة اللازمة للحساب.

<div id="optimize_read_in_order">
  ## optimize\_read\_in\_order
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

يُفعِّل تحسين [ORDER BY](/docs/ar/reference/statements/select/order-by#optimization-of-data-reading) في استعلامات [SELECT](/docs/ar/reference/statements/select/index) عند قراءة البيانات من جداول [MergeTree](/docs/ar/reference/engines/table-engines/mergetree-family/mergetree).

القيم الممكنة:

* 0 — يكون تحسين `ORDER BY` معطّلًا.
* 1 — يكون تحسين `ORDER BY` مفعّلًا.

**انظر أيضًا**

* [عبارة ORDER BY](/docs/ar/reference/statements/select/order-by#optimization-of-data-reading)

<div id="optimize_respect_aliases">
  ## optimize\_respect\_aliases
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

إذا ضُبط هذا الإعداد على true، فستُراعى الأسماء المستعارة في WHERE/GROUP BY/ORDER BY، مما يساعد في استبعاد الأقسام/الفهارس الثانوية/optimize\_aggregation\_in\_order/optimize\_read\_in\_order/optimize\_trivial\_count

<div id="optimize_sorting_by_input_stream_properties">
  ## optimize\_sorting\_by\_input\_stream\_properties
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

حسِّن الفرز استنادًا إلى خصائص فرز تدفق الإدخال

<div id="optimize_substitute_columns">
  ## optimize\_substitute\_columns
</div>

<SettingsInfoBlock type="Bool" default_value="0" />

استخدم [القيود](/docs/ar/reference/statements/create/table#constraints) في استبدال الأعمدة. القيمة الافتراضية هي `false`.

القيم الممكنة:

* true, false

<div id="optimize_syntax_fuse_functions">
  ## optimize\_syntax\_fuse\_functions
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.3"},{"label": "1"},{"label": "هذا التحسين جاهز للإنتاج"}]}]} />

يتيح دمج الدوال التجميعية ذات الوسيطة نفسها. ويعيد كتابة الاستعلام الذي يتضمن دالتين تجميعيّتين على الأقل من [sum](/docs/ar/reference/functions/aggregate-functions/sum) أو [count](/docs/ar/reference/functions/aggregate-functions/count) أو [avg](/docs/ar/reference/functions/aggregate-functions/avg) ذات الوسيطة نفسها إلى [sumCount](/docs/ar/reference/functions/aggregate-functions/sumCount).

القيم الممكنة:

* 0 — لا تُدمَج الدوال ذات الوسيطة نفسها.
* 1 — تُدمَج الدوال ذات الوسيطة نفسها.

**مثال**

الاستعلام:

```sql theme={null}
CREATE TABLE fuse_tbl(a Int8, b Int8) Engine = Log;
SET optimize_syntax_fuse_functions = 1;
EXPLAIN SYNTAX run_query_tree_passes = 1 SELECT sum(a), sum(b), count(b), avg(b) from fuse_tbl FORMAT TSV;
```

النتيجة:

```text theme={null}
SELECT
    sum(__table1.a) AS `sum(a)`,
    tupleElement(sumCount(__table1.b), 1) AS `sum(b)`,
    tupleElement(sumCount(__table1.b), 2) AS `count(b)`,
    divide(tupleElement(sumCount(__table1.b), 1), toFloat64(tupleElement(sumCount(__table1.b), 2))) AS `avg(b)`
FROM default.fuse_tbl AS __table1
```

<div id="optimize_throw_if_noop">
  ## optimize\_throw\_if\_noop
</div>

<SettingsInfoBlock type="Bool" default_value="0" />

يؤدي إلى تمكين أو تعطيل رفع استثناء إذا لم يُجرِ الاستعلام [OPTIMIZE](/docs/ar/reference/statements/optimize) عملية دمج.

بشكل افتراضي، يُرجِع `OPTIMIZE` بنجاح حتى إذا لم ينفّذ أي شيء. يتيح لك هذا الإعداد التمييز بين هذه الحالات ومعرفة السبب من خلال رسالة الاستثناء.

القيم الممكنة:

* 1 — تم تمكين رفع استثناء.
* 0 — تم تعطيل رفع استثناء.

<div id="optimize_time_filter_with_preimage">
  ## optimize\_time\_filter\_with\_preimage
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "24.2"},{"label": "1"},{"label": "تحسين شروط Date وDateTime عبر تحويل الدوال إلى مقارنات مكافئة من دون تحويلات (على سبيل المثال: toYear(col) = 2023 -> col >= '2023-01-01' AND col <= '2023-12-31')"}]}]} />

يُحسِّن شروط Date وDateTime عبر تحويل الدوال إلى مقارنات مكافئة من دون تحويلات (على سبيل المثال: `toYear(col) = 2023 -> col >= '2023-01-01' AND col <= '2023-12-31'`)

<div id="optimize_truncate_order_by_after_group_by_keys">
  ## optimize\_truncate\_order\_by\_after\_group\_by\_keys
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.4"},{"label": "1"},{"label": "احذف عناصر ORDER BY الختامية بعد أن تغطي بادئة ORDER BY جميع مفاتيح GROUP BY."}]}]} />

احذف عناصر ORDER BY الختامية بعد أن تغطي بادئة ORDER BY جميع مفاتيح GROUP BY.

<div id="optimize_uniq_to_count">
  ## optimize\_uniq\_to\_count
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

أعِد كتابة uniq وأشكاله (باستثناء uniqUpTo) إلى count إذا تضمّن الاستعلام الفرعي DISTINCT أو بند GROUP BY.

<div id="optimize_using_constraints">
  ## optimize\_using\_constraints
</div>

<SettingsInfoBlock type="Bool" default_value="0" />

استخدم [القيود](/docs/ar/reference/statements/create/table#constraints) لتحسين الاستعلامات. القيمة الافتراضية هي `false`.

القيم الممكنة:

* true, false
