أنواع تخطيط القاموس
توجد عدة طرق لتخزين القواميس في الذاكرة، ولكل منها مفاضلات بين استخدام CPU وRAM.
| التخطيط | الوصف |
|---|---|
| flat | يخزّن البيانات في مصفوفات مسطّحة مفهرسة حسب المفتاح. وهو أسرع تخطيط، لكن يجب أن تكون المفاتيح من النوع UInt64 وأن تكون محدودة بالقيمة max_array_size. |
| hashed | يخزّن البيانات في جدول hash. لا يوجد حد لحجم المفتاح، ويدعم أي عدد من العناصر. |
| sparse_hashed | يشبه hashed، لكنه يضحّي ببعض CPU مقابل تقليل استخدام الذاكرة. |
| complex_key_hashed | يشبه hashed، للمفاتيح المركبة. |
| complex_key_sparse_hashed | يشبه sparse_hashed، للمفاتيح المركبة. |
| hashed_array | تُخزَّن السمات في مصفوفات مع جدول hash يربط المفاتيح بفهارس المصفوفات. وهو فعّال من حيث الذاكرة عند وجود عدد كبير من السمات. |
| complex_key_hashed_array | يشبه hashed_array، للمفاتيح المركبة. |
| range_hashed | جدول hash مع ranges مرتبة. يدعم عمليات lookup حسب المفتاح + نطاق التاريخ/الوقت. |
| complex_key_range_hashed | يشبه range_hashed، للمفاتيح المركبة. |
| cache | cache ثابتة الحجم داخل الذاكرة. لا تُخزَّن إلا المفاتيح التي يكثر الوصول إليها. |
| complex_key_cache | يشبه cache، للمفاتيح المركبة. |
| ssd_cache | يشبه cache، لكنه يخزّن البيانات على SSD مع index داخل الذاكرة. |
| complex_key_ssd_cache | يشبه ssd_cache، للمفاتيح المركبة. |
| direct | لا يستخدم تخزينًا داخل الذاكرة — بل يستعلم المصدر مباشرةً لكل طلب. |
| complex_key_direct | يشبه direct، للمفاتيح المركبة. |
| ip_trie | بنية trie لإجراء عمليات lookup سريعة على بادئات IP (المعتمدة على CIDR). |
| hierarchical | يدعم البُنى الهرمية باستخدام مفتاح رقمي يصف علاقات الأصل والفرع. |
| polygon | عمليات lookup فعّالة للنقطة داخل المضلع (الترميز الجغرافي العكسي). |
| regexp_tree | يطابق المفاتيح مع شجرة من التعبيرات النمطية. |
تحديد تخطيط القاموس
يمكنك ضبط تخطيط القاموس باستخدام العبارة LAYOUT (في DDL) أو الإعداد layout في تعريفات ملف التهيئة.
CREATE DICTIONARY (...)
...
LAYOUT(LAYOUT_TYPE(param value)) -- إعدادات التخطيط
...<clickhouse>
<dictionary>
...
<layout>
<layout_type>
<!-- إعدادات التخطيط -->
</layout_type>
</layout>
...
</dictionary>
</clickhouse>انظر أيضًا إلى CREATE DICTIONARY للاطّلاع على بنية DDL الكاملة.
القواميس التي لا يتضمن تخطيطها الكلمة complex-key* يكون مفتاحها من النوع UInt64، أما قواميس complex-key* فلها مفتاح مركب (معقّد، وبأنواع مختلفة).
مثال على مفتاح رقمي (العمود key_column من النوع UInt64):
CREATE DICTIONARY dict_name (
key_column UInt64,
...
)
PRIMARY KEY key_column<structure>
<id>
<name>key_column</name>
</id>
...
</structure>مثال على مفتاح مركب (يحتوي المفتاح على عنصر واحد من النوع String):
CREATE DICTIONARY dict_name (
country_code String,
...
)
PRIMARY KEY country_code<structure>
<key>
<attribute>
<name>country_code</name>
<type>String</type>
</attribute>
</key>
...
</structure>تحسين أداء القاموس
هناك عدة طرق لتحسين أداء القاموس:
- استدعِ الدالة المستخدمة للعمل مع القاموس بعد
GROUP BY. - علِّم السمات المراد استخراجها بأنها injective.
تُعدّ السمة injective إذا كانت المفاتيح المختلفة تقابلها قيم سمات مختلفة.
لذلك، عندما يستخدم
GROUP BYدالةً تجلب قيمة سمة باستخدام المفتاح، تُستبعد هذه الدالة تلقائيًا منGROUP BY.
ينشئ ClickHouse استثناءً عند حدوث أخطاء في القواميس. ومن أمثلة هذه الأخطاء:
- تعذّر تحميل القاموس الجاري الوصول إليه.
- حدث خطأ أثناء تنفيذ استعلام على قاموس
cached.
يمكنك عرض قائمة القواميس وحالاتها في جدول system.dictionaries.