Skip to main content
بعد استكشاف كيفية الاستعلام عن مجموعة بيانات إحصاءات Wikipedia، لنركّز الآن على تحسين كفاءة تخزينها في ClickHouse. يوضح هذا القسم تقنيات عملية لتقليل مساحة التخزين المطلوبة مع الحفاظ على أداء الاستعلام.

تحسين الأنواع

النهج العام لتحسين كفاءة التخزين هو استخدام أنواع البيانات المثلى. لنأخذ العمودين project وsubproject. هذان العمودان من النوع String، لكن عدد القيم الفريدة فيهما صغير نسبيًا:
هذا يعني أنه يمكننا استخدام نوع البيانات LowCardinality()، الذي يعتمد على ترميز قائم على القاموس. ونتيجة لذلك، يخزّن ClickHouse معرّف القيمة الداخلي بدلًا من قيمة السلسلة الأصلية، مما يوفّر بدوره قدرًا كبيرًا من المساحة:
لقد استخدمنا أيضًا النوع UInt64 للعمود hits، الذي يشغل 8 بايتات، لكن قيمته القصوى صغيرة نسبيًا:
استنادًا إلى هذه القيمة، يمكننا استخدام UInt32 بدلًا من ذلك، إذ لا يتطلب سوى 4 بايت، ويتيح لنا تخزين قيمة قصوى تصل إلى نحو ~4 مليارات:
سيؤدي هذا إلى تقليل حجم هذا العمود في الذاكرة إلى النصف على الأقل. لاحظ أن الحجم على القرص سيبقى دون تغيير بسبب الضغط. ولكن انتبه: اختر أنواع بيانات لا تكون صغيرة أكثر من اللازم!

ترميزات ضغط متخصصة

عندما نتعامل مع بيانات متسلسلة، مثل السلاسل الزمنية، يمكننا تحسين كفاءة التخزين بدرجة أكبر باستخدام ترميزات ضغط خاصة. وتقوم الفكرة العامة على تخزين التغيرات بين القيم بدلًا من القيم المطلقة نفسها، مما يقلل كثيرًا من المساحة المطلوبة عند التعامل مع بيانات تتغير ببطء:
لقد استخدمنا ترميز Delta للعمود time، وهو مناسب جدًا لبيانات السلاسل الزمنية. يمكن أن يوفّر مفتاح الترتيب المناسب أيضًا مساحة على القرص. وبما أننا نحتاج عادةً إلى التصفية حسب المسار، فسنضيف path إلى مفتاح الفرز. ويتطلب ذلك إعادة إنشاء الجدول. فيما يلي يظهر الأمر CREATE لجدولنا الأصلي والجدول المُحسَّن:
ولنلقِ نظرة على حجم المساحة التي تشغلها البيانات في كل جدول:
لا يشغل الجدول المُحسَّن، في صورته المضغوطة، سوى أقل بقليل من ربع المساحة.
آخر تعديل في ٣ يوليو ٢٠٢٦