Skip to main content
بعد تحسين التخزين، تتمثل الخطوة التالية في تحسين أداء الاستعلام. يستعرض هذا القسم تقنيتين أساسيتين: تحسين مفاتيح ORDER BY واستخدام العروض المُجسَّدة. سنرى كيف يمكن لهذه الأساليب تقليل زمن الاستعلام من ثوانٍ إلى ميلي ثانية.

حسّن مفاتيح ORDER BY

قبل تجربة أي تحسينات أخرى، ينبغي أولًا تحسين مفاتيح الترتيب لضمان أن يقدّم ClickHouse أسرع النتائج الممكنة. ويعتمد اختيار المفتاح المناسب إلى حد كبير على الاستعلامات التي ستجريها. لنفترض أن معظم استعلاماتنا تُصفّي حسب العمودين project وsubproject. في هذه الحالة، من الجيد إضافتهما إلى مفتاح الترتيب، وكذلك العمود time لأننا نستعلم حسب الوقت أيضًا. لننشئ نسخة أخرى من الجدول لها أنواع الأعمدة نفسها في wikistat، لكنها مرتبة حسب (project, subproject, time).
لنقارن الآن عدة استعلامات لنكوّن فكرة عن مدى أهمية تعبير مفتاح الترتيب بالنسبة إلى الأداء. لاحظ أننا لم نطبّق بعد تحسينات نوع البيانات وcodec السابقة، لذا فإن أي فروقات في أداء الاستعلامات تعود فقط إلى ترتيب الفرز.
الاستعلام(time)(project, subproject, time)
2.381 ثانية1.660 ثانية
2.148 ثانية0.058 ثانية
2.192 ثانية0.012 ثانية
2.968 ثانية0.010 ثانية

العروض المُجسَّدة

خيار آخر هو استخدام العروض المُجسَّدة لتجميع نتائج الاستعلامات الشائعة وتخزينها. ويمكن الاستعلام عن هذه النتائج بدلًا من الجدول الأصلي. لنفترض أن الاستعلام التالي يُنفَّذ كثيرًا في حالتنا:

إنشاء عرض مُجسَّد

يمكننا إنشاء العرض المُجسَّد التالي:

تعبئة جدول الوجهة بالبيانات التاريخية

لن تتم تعبئة جدول الوجهة هذا إلا عند إدراج سجلات جديدة في جدول wikistat، لذا نحتاج إلى إجراء تعبئة للبيانات التاريخية. أسهل طريقة لتنفيذ ذلك هي استخدام تعليمة INSERT INTO SELECT للإدراج مباشرةً في الجدول الهدف الخاص بالعرض المُجسَّد باستخدام استعلام SELECT الخاص بالعرض (التحويل):
اعتمادًا على كاردينالية مجموعة البيانات الخام (لدينا مليار صف!)، قد يكون هذا النهج كثيف الاستهلاك للذاكرة. بدلًا من ذلك، يمكنك استخدام طريقة بديلة تتطلب حدًا أدنى من الذاكرة:
  • إنشاء جدول مؤقت باستخدام محرك جدول Null
  • ربط نسخة من العرض المُجسَّد المستخدم عادةً بذلك الجدول المؤقت
  • باستخدام استعلام INSERT INTO SELECT، نسخ جميع البيانات من مجموعة البيانات الخام إلى ذلك الجدول المؤقت
  • حذف الجدول المؤقت والعرض المُجسَّد المؤقت.
باستخدام هذا النهج، تُنسخ الصفوف من مجموعة البيانات الخام على مستوى الكتل إلى الجدول المؤقت (الذي لا يخزّن أيًا من هذه الصفوف)، ولكل كتلة من الصفوف، تُحتسب حالة جزئية وتُكتب في الجدول الهدف، حيث تُدمج هذه الحالات تدريجيًا في الخلفية.
بعد ذلك، سننشئ عرضًا مُجسَّدًا لقراءة البيانات من wikistat_backfill وكتابتها في wikistat_top
وأخيرًا، سنعبّئ wikistat_backfill انطلاقًا من جدول wikistat الأوّلي:
بمجرد اكتمال هذا الاستعلام، يمكننا حذف جدول تعبئة البيانات التاريخية والعرض المُجسَّد:
يمكننا الآن الاستعلام من العرض المُجسَّد بدلًا من الجدول الأصلي:
التحسّن في الأداء هنا هائل. فبعد أن كان يستغرق ما يزيد قليلًا على ثانيتين لحساب إجابة هذا الاستعلام، أصبح الآن لا يستغرق سوى 4 ميلي ثانية.
آخر تعديل في ٣ يوليو ٢٠٢٦