Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

قيود تعقيد الاستعلام

نظرة عامة

كجزء من الإعدادات، يوفّر 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

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

Navigation