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

# تخطيط قاموس cache

> تخزين قاموس في cache داخل الذاكرة بحجم ثابت.

يخزّن نوع تخطيط القاموس `cached` القاموس في cache يحتوي على عدد ثابت من الخلايا.
وتتضمن هذه الخلايا العناصر الأكثر استخدامًا.

يكون مفتاح القاموس من النوع [UInt64](/ar/reference/data-types/int-uint).

عند البحث عن قيمة في القاموس، يُبحث أولًا في cache. ولكل block من البيانات، تُطلب جميع المفاتيح التي لا توجد في cache أو التي انتهت صلاحيتها من المصدر باستخدام `SELECT attrs... FROM db.table WHERE id IN (k1, k2, ...)`. ثم تُكتب البيانات المستلمة إلى cache.

إذا لم يُعثر على المفاتيح في القاموس، فستُنشأ مهمة لتحديث cache وتُضاف إلى قائمة انتظار التحديث. ويمكن التحكم في خصائص قائمة انتظار التحديث باستخدام الإعدادات `max_update_queue_size`, `update_queue_push_timeout_milliseconds`, `query_wait_timeout_milliseconds`, `max_threads_for_updates`.

بالنسبة إلى قواميس cache، يمكن ضبط [lifetime](/ar/reference/statements/create/dictionary/lifetime) لانتهاء صلاحية البيانات في cache. وإذا مرّ وقت أطول من `lifetime` منذ تحميل البيانات في خلية معيّنة، فلن تُستخدم قيمة الخلية ويصبح المفتاح منتهي الصلاحية. ويُعاد طلب المفتاح في المرة التالية التي يلزم فيها استخدامه. ويمكن تهيئة هذا السلوك باستخدام الإعداد `allow_read_expired_keys`.

تُعد هذه أقل طرق تخزين القواميس كفاءةً بين جميع الطرق. وتعتمد سرعة cache بدرجة كبيرة على صحة الإعدادات وسيناريو الاستخدام. ولا يحقق القاموس من النوع cache أداءً جيدًا إلا عندما تكون معدلات النجاح مرتفعة بما يكفي (الموصى به 99% فأكثر). ويمكنك عرض متوسط معدل النجاح في جدول [system.dictionaries](/ar/reference/system-tables/dictionaries).

إذا كان الإعداد `allow_read_expired_keys` مضبوطًا على 1، بينما القيمة الافتراضية هي 0، فسيتمكن القاموس من دعم التحديثات غير المتزامنة. وإذا طلب client مفاتيح وكانت جميعها موجودة في cache، لكن بعضًا منها منتهي الصلاحية، فسيُرجع القاموس المفاتيح منتهية الصلاحية إلى client ويطلبها بشكل غير متزامن من المصدر.

لتحسين أداء cache، استخدم استعلامًا فرعيًا مع `LIMIT`، واستدعِ الدالة باستخدام القاموس من خارجها.

جميع أنواع المصادر مدعومة.

مثال على الإعدادات:

<Tabs>
  <Tab title="DDL">
    ```sql theme={null}
    LAYOUT(CACHE(SIZE_IN_CELLS 1000000000))
    ```
  </Tab>

  <Tab title="ملف الإعدادات">
    ```xml theme={null}
    <layout>
        <cache>
            <!-- حجم cache، بعدد الخلايا. يُقرَّب إلى أقرب قوة للعدد 2. -->
            <size_in_cells>1000000000</size_in_cells>
            <!-- السماح بقراءة المفاتيح منتهية الصلاحية. -->
            <allow_read_expired_keys>0</allow_read_expired_keys>
            <!-- الحد الأقصى لحجم قائمة انتظار التحديث. -->
            <max_update_queue_size>100000</max_update_queue_size>
            <!-- المهلة القصوى بالمللي ثانية لإدراج مهمة التحديث في قائمة الانتظار. -->
            <update_queue_push_timeout_milliseconds>10</update_queue_push_timeout_milliseconds>
            <!-- الحد الأقصى لمهلة الانتظار بالمللي ثانية حتى تكتمل مهمة التحديث. -->
            <query_wait_timeout_milliseconds>60000</query_wait_timeout_milliseconds>
            <!-- الحد الأقصى لعدد الخيوط لتحديث قاموس cache. -->
            <max_threads_for_updates>4</max_threads_for_updates>
        </cache>
    </layout>
    ```
  </Tab>
</Tabs>

<br />

اضبط حجم cache بحيث يكون كبيرًا بما يكفي. ستحتاج إلى التجربة لاختيار عدد الخلايا:

1. اضبط قيمة مبدئية.
2. شغّل الاستعلامات حتى يمتلئ cache بالكامل.
3. قيّم استهلاك الذاكرة باستخدام جدول `system.dictionaries`.
4. زِد عدد الخلايا أو قلّله حتى تصل إلى استهلاك الذاكرة المطلوب.

<Note>
  لا يُنصح باستخدام ClickHouse كمصدر لهذا التخطيط. تتطلب عمليات البحث في القاموس قراءات نقطية عشوائية، وهذا ليس نمط الوصول الذي جرى تحسين ClickHouse من أجله.
</Note>
