الانتقال إلى المحتوى الرئيسي
في القسم السابق، قمت بتوصيل ClickHouse بكتالوج بيانات ونفّذت الاستعلام عن تنسيقات الجداول المفتوحة مباشرةً. ورغم أن الاستعلام عن البيانات في مكانها ملائم، فإن تنسيقات الجداول المفتوحة ليست مُحسّنة لأعباء العمل منخفضة زمن الانتقال وعالية التزامن التي تُشغّل لوحات المعلومات والتقارير التشغيلية. ولهذه الحالات، يوفّر تحميل البيانات إلى محرك MergeTree في ClickHouse أداءً أفضل بكثير. يوفّر MergeTree عدة مزايا مقارنةً بقراءة تنسيقات الجداول المفتوحة مباشرةً:
  • الفهرس الأساسي المتناثر - يرتّب البيانات على القرص وفقًا لمفتاح محدد، مما يتيح لـ ClickHouse تجاوز نطاقات كبيرة من الصفوف غير ذات الصلة أثناء الاستعلامات.
  • أنواع بيانات محسّنة - دعم أصلي لأنواع مثل JSON وLowCardinality وEnum، مما يتيح تخزينًا أكثر كثافة ومعالجة أسرع.
  • فهارس التخطي و**فهارس النص الكامل** - بُنى فهارس ثانوية تتيح لـ ClickHouse تخطي الحبيبات التي لا تطابق شروط التصفية في الاستعلام، وتكون فعّالة بشكل خاص مع أعباء عمل البحث النصي.
  • عمليات إدراج سريعة مع دمج تلقائي - صُمم ClickHouse لعمليات الإدراج عالية الإنتاجية، ويقوم تلقائيًا بدمج أجزاء البيانات في الخلفية، على نحو مماثل لعملية compaction في تنسيقات الجداول المفتوحة.
  • محسّن لعمليات القراءة المتزامنة - يوفّر تخطيط التخزين العمودي في MergeTree، إلى جانب طبقات متعددة من التخزين المؤقت، دعمًا لأعباء العمل التحليلية في الوقت الفعلي وعالية التزامن، وهو ما لم تُصمم له تنسيقات الجداول المفتوحة.
يوضح هذا الدليل كيفية تحميل البيانات من كتالوج إلى جدول MergeTree باستخدام INSERT INTO SELECT للحصول على تحليلات أسرع.

الاتصال بالكتالوج

سنستخدم اتصال Unity Catalog نفسه الوارد في الدليل السابق، عبر نقطة نهاية REST الخاصة بـ Iceberg:

عرض الجداول

استكشاف المخطط

يحتوي هذا الجدول على نحو 283 مليون صف من سجلات عمليات تشغيل اختبارات ClickHouse CI، وهي مجموعة بيانات واقعية لاستكشاف الأداء التحليلي.

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

لنُجرِ استعلامًا يُصفّي السجلات حسب اسم الخيط ونوع المثيل، ويبحث في نص الرسالة عن الأخطاء، ويجمع النتائج حسب المُسجِّل:
يستغرق الاستعلام ما يقارب 9 ثوانٍ لأن ClickHouse يضطر إلى إجراء فحص كامل للجدول عبر جميع ملفات Parquet في تخزين الكائنات. ويمكن تحسين الأداء باستخدام التقسيم، لكن أعمدة مثل logger_name قد تكون عالية التفرّد بدرجة تجعل تقسيمها بفعالية أمرًا صعبًا. كما لا تتوفر لدينا فهارس مثل الفهارس النصية لتقليص البيانات بدرجة أكبر. وهنا يتفوّق MergeTree.

إدخال البيانات إلى MergeTree

أنشئ جدولًا مُحسَّنًا

ننشيء جدول MergeTree مع بذل بعض الجهد لتحسين المخطط. لاحظ بعض الاختلافات الرئيسية مقارنةً بمخطط Iceberg:
  • من دون مغلِّفات Nullable - تؤدي إزالة Nullable إلى تحسين كفاءة التخزين وأداء الاستعلامات.
  • LowCardinality(String) في الأعمدة level وinstance_type وthread_name وcheck_name - يطبّق ترميزًا قاموسيًا على العمود عندما يكون عدد القيم المميّزة فيه قليلًا، مما يحسّن الضغط ويُسرّع التصفية.
  • فهرس النص الكامل على العمود message - يسرّع عمليات البحث النصي المعتمدة على الرموز مثل hasToken(message, 'error').
  • مفتاح ORDER BY بالقيمة (instance_type, thread_name, toStartOfMinute(event_time)) - يرتّب البيانات على القرص بما يتوافق مع أنماط التصفية الشائعة، بحيث يتمكن الفهرس الأساسي المتناثر من تخطّي الحبيبات غير ذات الصلة.

إدراج البيانات من الكتالوج

استخدم INSERT INTO SELECT لتحميل نحو 300 مليون صف من جدول بحيرة البيانات إلى جدول ClickHouse لدينا:

أعد تنفيذ الاستعلام

إذا نفّذنا الآن الاستعلام نفسه على جدول MergeTree، فسنلاحظ تحسنًا كبيرًا في الأداء:
يكتمل الاستعلام نفسه الآن في 0.22 ثانية — أي أسرع بنحو ~40 مرة. ويعود هذا التحسن إلى تحسينين أساسيين:
  • الفهرس الأساسي المتناثر - يعني المفتاح ORDER BY (instance_type, thread_name, ...) أن ClickHouse يمكنه الانتقال مباشرةً إلى الحبيبات المطابقة لـ instance_type = 'm6i.4xlarge' وthread_name = 'TCPHandler'، مما يقلل عدد الصفوف المُعالجة من 283 مليونًا إلى 14 مليونًا فقط.
  • فهرس النص الكامل - يتيح الفهرس text_idx على العمود message حلَّ hasToken(message, 'error') عبر الفهرس بدلًا من فحص كل سلسلة رسائل، مما يقلل أكثر حجم البيانات التي يحتاج ClickHouse إلى قراءتها.
والنتيجة هي استعلام يمكنه تشغيل لوحة معلومات آنية بكفاءة — وعلى نطاق وزمن استجابة لا يمكن للاستعلام عن ملفات Parquet في تخزين الكائنات مجاراتهما.
آخر تعديل في ٢ يوليو ٢٠٢٦