نظرة عامة
كجزء من الإعدادات، يوفّر ClickHouse إمكانية فرض قيود على تعقيد الاستعلامات. ويساعد ذلك على الحماية من الاستعلامات التي قد تستهلك الموارد بشكل كبير، مما يضمن تنفيذًا أكثر أمانًا وقابليةً للتنبؤ، خصوصًا عند استخدام واجهة المستخدم.
تنطبق جميع القيود تقريبًا فقط على استعلامات SELECT، وفي
معالجة الاستعلامات الموزعة، تُطبَّق القيود على كل خادم على حدة.
يتحقق ClickHouse عمومًا من القيود فقط بعد اكتمال معالجة أجزاء البيانات، بدلًا من التحقق من القيود لكل صف. وقد يؤدي ذلك إلى حدوث حالة تُنتهك فيها القيود أثناء معالجة الجزء.
إعدادات overflow_mode
تحتوي معظم القيود أيضًا على إعداد overflow_mode، الذي يحدّد ما يحدث
عند تجاوز الحدّ، ويمكن أن يأخذ إحدى القيمتين التاليتين:
throw: إثارة استثناء (افتراضيًا).break: إيقاف تنفيذ الاستعلام وإرجاع النتيجة الجزئية، كما لو أن بيانات المصدر قد نفدت.
عند إيقاف استعلام بواسطة max_execution_time باستخدام break، لا يمكن لبعض العمليات إرجاع
نتيجة جزئية بأمان، لذا تتوقف دون إنتاج أي نتيجة بدلًا من إنتاج نتيجة أصغر. تتوقف الدالة التي
تحسب قيمة واحدة دون إنتاج تلك القيمة؛ ويعتمد وصول التوقف إلى
العميل أيضًا على شكل خطأ TIMEOUT_EXCEEDED، أو على شكل نتيجة مفقودة فقط، على موضع
مقاطعة الاستعلام. لا يغيّر انتهاء المهلة عملية تعديل غير مكتملة لجدول Memory الجدولَ،
وتُبلّغ عن TIMEOUT_EXCEEDED. قد تُبلّغ عملية INSERT عن QUERY_WAS_CANCELLED. بعض العمليات التي تنتظر
نسخًا متماثلة أخرى أو عملًا في الخلفية لا تتوقف عند max_execution_time على الإطلاق: تظل
كتابة النصاب في الانتظار حتى استيفاء النصاب، أو تُبلّغ عن UNKNOWN_STATUS_OF_INSERT إذا
انقضت insert_quorum_timeout أولًا.
إعدادات group_by_overflow_mode
يتضمن إعداد group_by_overflow_mode أيضًا
القيمة any:
any: واصِل التجميع للمفاتيح التي دخلت إلى المجموعة، ولكن لا تُضِف مفاتيح جديدة إلى المجموعة.
قائمة الإعدادات
تُستخدم الإعدادات التالية لفرض قيود على تعقيد الاستعلام.
| الإعداد | وصف مختصر |
|---|---|
max_memory_usage |
الحد الأقصى لذاكرة RAM التي يمكن استخدامها لتشغيل استعلام على خادم واحد. |
max_memory_usage_for_user |
الحد الأقصى لذاكرة RAM التي يمكن استخدامها لتشغيل استعلامات مستخدم على خادم واحد. |
max_rows_to_read |
الحد الأقصى لعدد الصفوف التي يمكن قراءتها من جدول عند تشغيل استعلام. |
max_bytes_to_read |
الحد الأقصى لعدد البايتات (من البيانات غير المضغوطة) التي يمكن قراءتها من جدول عند تشغيل استعلام. |
read_overflow_mode_leaf |
يحدد ما يحدث عندما يتجاوز حجم البيانات المقروءة أحد الحدود على العقد الطرفية |
max_rows_to_read_leaf |
الحد الأقصى لعدد الصفوف التي يمكن قراءتها من جدول محلي على عقدة طرفية عند تشغيل استعلام موزع |
max_bytes_to_read_leaf |
الحد الأقصى لعدد البايتات (من البيانات غير المضغوطة) التي يمكن قراءتها من جدول محلي على عقدة طرفية عند تشغيل استعلام موزع. |
read_overflow_mode_leaf |
يحدد ما يحدث عندما يتجاوز حجم البيانات المقروءة أحد الحدود على العقد الطرفية. |
max_rows_to_group_by |
الحد الأقصى لعدد المفاتيح الفريدة الناتجة عن التجميع. |
group_by_overflow_mode |
يحدد ما يحدث عندما يتجاوز عدد المفاتيح الفريدة للتجميع الحد المسموح به |
max_bytes_before_external_group_by |
يفعّل أو يعطّل تنفيذ عبارة GROUP BY في الذاكرة الخارجية. |
max_bytes_ratio_before_external_group_by |
نسبة الذاكرة المتاحة المسموح باستخدامها لـ GROUP BY. وعند بلوغها، تُستخدم الذاكرة الخارجية للتجميع. |
max_bytes_before_external_sort |
يفعّل أو يعطّل تنفيذ عبارة ORDER BY في الذاكرة الخارجية. |
max_bytes_ratio_before_external_sort |
نسبة الذاكرة المتاحة المسموح باستخدامها لـ ORDER BY. وعند بلوغها، يُستخدم الفرز الخارجي. |
max_rows_to_sort |
الحد الأقصى لعدد الصفوف قبل الفرز. يتيح ذلك تقييد استهلاك الذاكرة أثناء الفرز. |
max_bytes_to_sort |
الحد الأقصى لعدد البايتات قبل الفرز. |
sort_overflow_mode |
يحدد ما يحدث إذا تجاوز عدد الصفوف المستلمة قبل الفرز أحد الحدود. |
max_result_rows |
يقيّد عدد الصفوف في النتيجة. |
max_result_bytes |
يقيّد حجم النتيجة بالبايتات (غير المضغوطة) |
result_overflow_mode |
يحدد ما يجب فعله إذا تجاوز حجم النتيجة أحد الحدود. |
max_execution_time |
الحد الأقصى لزمن تنفيذ الاستعلام بالثواني. |
timeout_overflow_mode |
يحدد ما يجب فعله إذا استمر تنفيذ الاستعلام مدة أطول من max_execution_time أو إذا كان زمن التنفيذ التقديري أطول من max_estimated_execution_time (لا يُتحقق من التقدير إلا مع throw). |
max_execution_time_leaf |
مماثل دلاليًا لـ max_execution_time، لكنه يُطبَّق فقط على العقد الطرفية للاستعلامات الموزعة أو البعيدة. |
timeout_overflow_mode_leaf |
يحدد ما يحدث عندما يستغرق الاستعلام على العقدة الطرفية وقتًا أطول من max_execution_time_leaf. |
min_execution_speed |
الحد الأدنى لسرعة التنفيذ بالصفوف في الثانية. |
min_execution_speed_bytes |
الحد الأدنى لعدد بايتات التنفيذ في الثانية. |
max_execution_speed |
الحد الأقصى لعدد صفوف التنفيذ في الثانية. |
max_execution_speed_bytes |
الحد الأقصى لعدد بايتات التنفيذ في الثانية. |
timeout_before_checking_execution_speed |
يتحقق، بعد انقضاء الوقت المحدد بالثواني، من أن سرعة التنفيذ ليست بطيئة جدًا (أي لا تقل عن min_execution_speed). |
max_estimated_execution_time |
الحد الأقصى لزمن تنفيذ الاستعلام التقديري بالثواني. |
max_columns_to_read |
الحد الأقصى لعدد الأعمدة التي يمكن قراءتها من جدول في استعلام واحد. |
max_temporary_columns |
الحد الأقصى لعدد الأعمدة المؤقتة التي يجب الاحتفاظ بها في RAM في الوقت نفسه عند تشغيل استعلام، بما في ذلك الأعمدة الثابتة. |
max_temporary_non_const_columns |
الحد الأقصى لعدد الأعمدة المؤقتة التي يجب الاحتفاظ بها في RAM في الوقت نفسه عند تشغيل استعلام، من دون احتساب الأعمدة الثابتة. |
max_subquery_depth |
يحدد ما يحدث إذا احتوى الاستعلام على عدد من الاستعلامات الفرعية المتداخلة يتجاوز العدد المحدد. |
max_ast_depth |
الحد الأقصى لعمق التداخل في الشجرة النحوية للاستعلام. |
max_ast_elements |
الحد الأقصى لعدد العناصر في الشجرة النحوية للاستعلام. |
max_rows_in_set |
الحد الأقصى لعدد الصفوف في مجموعة البيانات ضمن العبارة IN المُنشأة من استعلام فرعي. |
max_bytes_in_set |
الحد الأقصى لعدد البايتات (للبيانات غير المضغوطة) المستخدمة بواسطة مجموعة ضمن العبارة IN المُنشأة من استعلام فرعي. |
set_overflow_mode |
يحدد ما يحدث عندما تتجاوز كمية البيانات أحد الحدود. |
max_rows_in_distinct |
الحد الأقصى لعدد الصفوف المختلفة عند استخدام DISTINCT. |
max_bytes_in_distinct |
الحد الأقصى لحجم الحالة في الذاكرة، بالبايتات غير المضغوطة، التي يستخدمها جدول تجزئة عند استخدام DISTINCT. |
distinct_overflow_mode |
يحدد ما يحدث عندما تتجاوز كمية البيانات أحد الحدود. |
max_rows_to_transfer |
الحد الأقصى للحجم (بالصفوف) الذي يمكن تمريره إلى خادم بعيد أو حفظه في جدول مؤقت عند تنفيذ عبارة GLOBAL IN/JOIN. |
max_bytes_to_transfer |
الحد الأقصى لعدد البايتات (البيانات غير المضغوطة) التي يمكن تمريرها إلى خادم بعيد أو حفظها في جدول مؤقت عند تنفيذ عبارة GLOBAL IN/JOIN. |
transfer_overflow_mode |
يحدد ما يحدث عندما تتجاوز كمية البيانات أحد الحدود. |
max_rows_in_join |
يقيّد عدد الصفوف في جدول التجزئة المستخدم عند ربط الجداول. |
max_bytes_in_join |
الحد الأقصى لحجم جدول التجزئة المستخدم عند ربط الجداول، بالبايتات. |
join_overflow_mode |
يحدد الإجراء الذي ينفذه ClickHouse عند بلوغ أيٍّ من حدود join التالية. |
max_partitions_per_insert_block |
يقيّد الحد الأقصى لعدد الأقسام في inserted block واحد، ويُطرح استثناء إذا احتوت الكتلة على عدد كبير جدًا من الأقسام. |
throw_on_max_partitions_per_insert_block |
يتيح لك التحكم في السلوك عند بلوغ max_partitions_per_insert_block. |
max_temporary_data_on_disk_size_for_user |
الحد الأقصى لكمية البيانات التي تستهلكها الملفات المؤقتة على disk، بالبايت، لجميع استعلامات المستخدم التي تعمل بالتزامن. |
max_temporary_data_on_disk_size_for_query |
الحد الأقصى لكمية البيانات التي تستهلكها الملفات المؤقتة على disk، بالبايت، لجميع الاستعلامات التي تعمل بالتزامن. |
max_sessions_for_user |
الحد الأقصى لعدد الجلسات المتزامنة لكل مستخدم موثَّق على خادم ClickHouse. |
max_partitions_to_read |
يقيّد الحد الأقصى لعدد الأقسام التي يمكن الوصول إليها في استعلام واحد. |
الإعدادات المتقادمة
max_pipeline_depth
الحد الأقصى لعمق مسار المعالجة. وهو يقابل عدد التحويلات التي تمر بها كل كتلة بيانات أثناء معالجة الاستعلام. ويُحتسب ضمن حدود خادم واحد. وإذا زاد عمق مسار المعالجة عن ذلك، يتم رفع استثناء.