Skip to main content
يطبّق هذا الدليل نهجين للتحسين على مجموعة بيانات سيارات الأجرة في نيويورك. أولًا، يقلّل كمية البيانات المخزنة والمُعالجة باختيار أنواع أعمدة أدق. ثم يقدّم مفتاح ترتيب يتيح لـ ClickHouse تجاوز البيانات في الاستعلامات الانتقائية. يُقاس كل تغيير مقارنةً بخط الأساس نفسه. راجع نظرة عامة على تحسين الاستعلامات للاطلاع على سير العمل الأوسع الذي يتبعه هذا المثال.

قبل أن تبدأ

تستخدم الأمثلة الجدول nyc_taxi.trips_small_inferred. أنشئه وحمّله إذا لم تكن قد فعلت ذلك بالفعل:
يبلغ حجم ملف Parquet المصدر نحو 5.8 GB. قد يستغرق تحميله عدة دقائق، حسب الشبكة والموارد المتاحة.
يحتوي ملف Parquet المصدر على نحو 329 مليون صف. سُجّلت أزمنة التنفيذ الواردة في هذا الدليل على عملية نشر واحدة، وقد تختلف حسب موارد الحوسبة المتاحة. قارن التغيّر النسبي بين المراحل بدلًا من توقّع مدد متطابقة. عند تطبيق هذه الطريقة على عبء العمل لديك، استخدم تشخيص الاستعلامات البطيئة لتحديد نمط استعلام متكرر واختيار تشغيل ممثل قبل تعديل الاستعلام أو المخطط.

نظرة عامة على العملية

يستخدم المثال المراحل الثلاث التالية:
  1. شغّل ثلاثة استعلامات لأحمال عمل مستقلة على المخطط المستنتج لتحديد خط أساس.
  2. أنشئ جدولًا بأنواع أعمدة أدق، وحمّل البيانات نفسها، ثم أعد تشغيل الاستعلامات.
  3. أنشئ جدولًا آخر بالمخطط المُحسَّن نفسه ومفتاح ترتيب، ثم أعد تشغيل الاستعلامات مجددًا.
يسهّل تغيير المخطط ومفتاح الترتيب في مراحل منفصلة تمييز تأثير كلٍّ منهما. يوضّح أساليب التحسين متى ينبغي النظر في هذه التغييرات وكيفية التحقق منها. ولمزيد من الإرشادات حول جمع قياسات قابلة للمقارنة، راجع عزل اختناقات الاستعلامات.

تحديد حمل العمل الأساسي

في جلسة العميل نفسها المستخدمة لتشغيل حمل العمل، عطّل ذاكرة التخزين المؤقت لنظام الملفات للبيانات البعيدة، وذاكرة التخزين المؤقت للاستعلامات، وذاكرة التخزين المؤقت لشروط الاستعلام:
تساعد هذه الإعدادات على جعل عمليات التشغيل المتكررة قابلة للمقارنة أثناء الاختبار. أعد القيم السابقة لها بعد إتمام القياسات.
تشكّل الاستعلامات الثلاثة المستقلة التالية حمل العمل المرجعي. شغّل الاستعلامات الثلاثة جميعها على كل جدول يُنشأ في المراحل التالية. نفّذ كل استعلام عدة مرات في ظروف متقاربة، وسجّل مدةً ممثلة، مثل القيمة الوسيطة، إلى جانب عدد الصفوف المقروءة وذروة استخدام الذاكرة. راجع إنشاء خط أساس قابل للتكرار للاطلاع على سير عمل القياس الكامل، بما في ذلك كيفية استرداد هذه القيم من system.query_log.

التصفية حسب سرعة الرحلة المحسوبة

يحسب هذا الاستعلام مدة الرحلة وسرعتها، ثم يعرض توزيع مسافات الرحلات التي تتجاوز سرعتها 30 ميلاً في الساعة:

تجميع الرحلات ضمن نطاق زمني

يحسب هذا الاستعلام عدد الرحلات والمسافة ومتوسط مبالغ الدفع للربع الأول من عام 2009:

التصفية حسب عدد الركاب

يحسب هذا الاستعلام متوسط مدة الرحلات التي تضم راكبًا واحدًا أو راكبين:
كانت القياسات الأصلية كما يلي: تقرأ الاستعلامات الثلاثة نحو 329 مليون صف لكل منها، وهو عدد قريب من إجمالي الصفوف في الجدول. ويوضح ذلك إمكانية تحسين جانبين مختلفين من عبء العمل: تقليل تكلفة معالجة الأعمدة المحددة، ثم تقليل عدد الصفوف المحددة عندما تسمح عوامل التصفية بذلك.

تحسين المخطط

يُعد استنتاج المخطط طريقة عملية لبدء استكشاف مجموعة بيانات، لكن الأنواع المستنتجة قد تكون أوسع نطاقًا أو أكثر تساهلًا مما يتطلبه عبء العمل. افحص البيانات قبل تغيير المخطط، ولا تفترض أن النوع المستنتج غير ضروري.

تجنّب أعمدة Nullable غير الضرورية

يخزّن العمود Nullable قناعًا للقيم NULL بالإضافة إلى قيمه. استخدم Nullable عندما يكون التمييز بين قيمة NULL والقيمة الافتراضية للنوع مهمًا، ولكن تجنّبه للأعمدة التي يُضمن أن تحتوي على قيمة. احسب قيم NULL في الأعمدة المستخدمة في المخطط النموذجي:
لا تحتوي سوى الأعمدة ratecode_id وmta_tax وpayment_type على قيم فارغة في مجموعة البيانات هذه. ويُبقي المخطط المُحسَّن النوع Nullable لهذه الأعمدة ويزيله من الأعمدة الأخرى.

استخدم LowCardinality للقيم المتكررة

يستخدم LowCardinality ترميز القاموس، ويمكنه تقليل مساحة التخزين ووقت المعالجة للأعمدة التي تحتوي على قيم متكررة بكثرة. تحقّق من عدد القيم الفريدة قبل استخدامه:
تحتوي هذه الأعمدة الأربعة على عدد من القيم المميزة أقل بكثير من عدد الصفوف. وهي مرشحات مناسبة لاستخدام LowCardinality، رغم أنه ينبغي قياس تأثير ذلك على حمل العمل. ويُعد نحو 10,000 قيمة مميزة نقطة بداية مفيدة لتحديد المرشحات، وليس حدًا ثابتًا.

اختر أنواع بيانات أكثر دقة

استخدم أضيق نوع يحافظ بأمان على النطاق والدقة المطلوبين. على سبيل المثال، افحص القيم الدنيا والقصوى للأعمدة الرقمية قبل استبدال نوع Int64 أو Float64 المستنتج:
يتسع كلا العمودين الصحيحين ضمن UInt8، رغم أن passenger_count يصل إلى قيمته القصوى البالغة 255. يستخدم المثال أيضًا Float32 لـ trip_distance وDecimal32 للقيم النقدية. تقع جميع القيم في مجموعة البيانات هذه ضمن النطاقات المستهدفة، ويقبل المثال الدقة الأقل للأرقام ذات الفاصلة العائمة والدقة النقدية على مستوى السنت، لأن عبء العمل فيه يقارن النتائج التجميعية. احتفظ بأنواع المصدر الأوسع عندما تكون قيم المصدر الدقيقة مطلوبة. يستبدل المثال أعمدة DateTime64 المستنتجة بـ DateTime ضمن المنطقة الزمنية UTC نفسها، لأن استعلامات المثال لا تتطلب دقة أجزاء الثانية. هذه الخيارات خاصة بمجموعة البيانات هذه. تأكد من متطلبات النطاق والدقة وقابلية القيم لأن تكون فارغة في بيانات الإنتاج قبل تطبيق التغييرات نفسها.

تطبيق تغييرات المخطط

أنشئ جدولًا من دون مفتاح ترتيب لكي تقيس هذه المرحلة تغييرات المخطط بصورة مستقلة:
في كل استعلام ضمن عبء العمل، استبدل nyc_taxi.trips_small_inferred بـ nyc_taxi.trips_small_no_pk، ثم أعد تشغيل الاستعلامات الثلاثة. سجّل المثال الأصلي النتائج التمثيلية التالية: لا تزال الاستعلامات تقرأ العدد نفسه من الصفوف، لكن المخطط المُحسَّن يقلل كمية البيانات التي تمثلها هذه الصفوف. لذلك تتحسن مدة الاستعلام وذروة استهلاك الذاكرة دون تغيير البيانات المحددة. قارن الحجم على القرص للجدولين:
بالنسبة إلى مجموعة البيانات هذه، يقلّل المخطط المُحسَّن حجم التخزين المضغوط بنحو 34%، من 7.38 GiB إلى 4.89 GiB.

تحسين مفتاح الترتيب

في عائلة MergeTree، يحدد مفتاح الترتيب كيفية ترتيب الصفوف على القرص. ينشئ ClickHouse فهرسًا أساسيًا متناثرًا وفقًا لهذا الترتيب، بحيث يتمكن من تجاوز الحبيبات التي لا يمكنها تلبية عوامل تصفية الاستعلام. وعلى خلاف المفتاح الأساسي في كثير من قواعد البيانات المعاملاتية، لا يفرض هذا المفتاح تفرّد القيم. ينبغي أن يعكس مفتاح الترتيب عوامل التصفية المستخدمة في الاستعلامات المهمة والمتكررة. ترتيب الأعمدة مهم: يكون المفتاح أكثر فعالية عندما يطبّق الاستعلام عامل تصفية على بادئة مفيدة منه. قد تكون الأعمدة منخفضة التعددية خيارات فعالة في بداية المفتاح إذا كانت تُصفّى كثيرًا، وغالبًا ما يكون مكوّن الوقت مفيدًا لأحمال العمل المستندة إلى الوقت. للحصول على إرشادات مفصلة حول الاختيار، راجع اختيار مفتاح أساسي. في هذا المثال، استخدم (passenger_count, pickup_datetime, dropoff_datetime). يحتوي passenger_count على عدد قليل من القيم المميزة ويظهر في عامل تصفية عدد الركاب، بينما يظهر pickup_datetime في تجميع نطاق التاريخ. وعلى الرغم من أن pickup_datetime ليس العمود الأول، يظل بإمكان ClickHouse استخدام قيم من أعمدة المفتاح اللاحقة لاستبعاد البيانات عندما لا يكون العمود الأول مقيّدًا. تؤدي التصفية على بادئة مفيدة من مفتاح الترتيب عمومًا إلى تقليم أكثر فعالية.

طبّق تغيير مفتاح الترتيب

أنشئ جدولًا بالمخطط المُحسَّن نفسه المستخدم في المرحلة السابقة. غيّر مفتاح الترتيب فقط:
في كل استعلام من استعلامات عبء العمل، استبدل اسم الجدول بـ nyc_taxi.trips_small_pk، ثم أعد تنفيذ الاستعلامات الثلاثة.

مقارنة النتائج

سجّل الدليل الأصلي القياسات التالية عبر المراحل الثلاث: يقلل تحسين المخطط مساحة التخزين ويجعل معالجة القيم المحددة أقل تكلفة. ويوفر مفتاح الترتيب أكبر تحسن إضافي لتجميع نطاق التاريخ، إذ يمكن لـ ClickHouse تجاوز الحبيبات الواقعة خارج نطاق التاريخ. كما يقرأ عامل تصفية عدد الركاب صفوفًا أقل لأنه يطبّق التصفية على أول عمود في المفتاح. أما عامل تصفية السرعة المحسوبة، فلا يزال يقرأ الجدول بأكمله لأن شرط التصفية فيه مشتق من pickup_datetime وdropoff_datetime وtrip_distance، وليس من بادئة مفيدة لمفتاح الترتيب. افحص تجميع نطاق التاريخ باستخدام EXPLAIN indexes = 1:
في ClickHouse 25.9 والإصدارات الأحدث، تضمن هذه الإعدادات أن يعرض EXPLAIN الفهارس المستخدمة والأجزاء والحبيبات التي تُسقِطها.
يختار الفهرس الأساسي 5,061 من أصل 40,167 حبيبة. ويعني هذا الانخفاض أن تجميع نطاق التاريخ يعالج 41.46 مليون صف بدلًا من إجمالي 329.04 مليون صف.

طبّق المنهج على حمل العمل لديك

استخدم التسلسل نفسه مع حمل العمل لديك:
  1. سجّل المدة الأساسية، والصفوف والبايتات المقروءة، وذروة الذاكرة.
  2. تحقّق مما إذا كانت الأعمدة المحددة تستخدم أنواعًا واسعة أو متساهلة أكثر من اللازم.
  3. طبّق تغييرات المخطط وقِس أثرها دون تغيير تخطيط البيانات.
  4. اختبر مفتاح ترتيب يستند إلى عوامل التصفية المستخدمة في الاستعلامات المتكررة المهمة.
  5. قارن البيانات المحددة باستخدام EXPLAIN indexes = 1، ثم أعد تشغيل الاستعلامات الأساسية في ظروف مماثلة.
لا تفترض أن الأنواع أو مفتاح الترتيب في هذا المثال ستناسب مجموعة بيانات أخرى. استخدم القيم المرصودة وعوامل تصفية الاستعلامات لاتخاذ هذه القرارات.

الخطوات التالية

ارجع إلى أساليب التحسين لتقييم الإسقاطات والعروض المُجسَّدة وفهارس تخطي البيانات أو الحساب المسبق، إذا لم تُعالج تغييرات المخطط ومفتاح الترتيب عنق الزجاجة المحدد.
آخر تعديل في ٢٨ أغسطس ٢٠٢٦