Перейти к основному содержимому
Перейти к основному содержимому

Ограничения по сложности запросов

Обзор

В рамках настроек ClickHouse предлагает возможность устанавливать ограничения на сложность запросов. Это помогает защитить от потенциально ресурсоёмких запросов, обеспечивая более безопасное и предсказуемое выполнение, особенно при использовании пользовательского интерфейса.

Практически все ограничения применяются только к запросам SELECT, а для распределенной обработки запросов ограничения применяются на каждом сервере отдельно.

ClickHouse, как правило, проверяет ограничения только после полной обработки частей данных, а не для каждой строки. Это может привести к ситуации, когда ограничения нарушаются во время обработки части.

Настройки overflow_mode

Большинство ограничений также имеют настройку overflow_mode, которая определяет, что происходит, когда лимит превышен, и может принимать одно из двух значений:

  • throw: выбросить исключение (по умолчанию).
  • break: прекратить выполнение запроса и вернуть частичный результат, как если бы исходные данные исчерпались.

Настройки group_by_overflow_mode

Настройка group_by_overflow_mode также имеет значение any:

  • any : продолжить агрегацию для ключей, которые попали в множество, но не добавлять новые ключи в множество.

Список настроек

Следующие настройки используются для применения ограничений на сложность запросов.

примечание

Ограничения на "максимальное количество чего-либо" могут принимать значение 0, что означает, что оно "не ограничено".

НастройкаКраткое описание
max_memory_usageМаксимальное количество ОЗУ, которое можно использовать для выполнения запроса на одном сервере.
max_memory_usage_for_userМаксимальное количество ОЗУ, которое можно использовать для выполнения запросов пользователя на одном сервере.
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.
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Максимальное количество временных колонок, которые должны храниться в ОЗУ одновременно при выполнении запроса, включая постоянные колонки.
max_temporary_non_const_columnsМаксимальное количество временных колонок, которые должны храниться в ОЗУ одновременно при выполнении запроса, но без учета постоянных колонок.
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, когда достигается одно из следующих ограничений соединения.
max_partitions_per_insert_blockОграничивает максимальное количество партиций в одном вставляемом блоке, и выбрасывается исключение, если блок содержит слишком много партиций.
throw_on_max_partitions_per_insert_blockПозволяет контролировать поведение при достижении max_partitions_per_insert_block.
max_temporary_data_on_disk_size_for_userМаксимальное количество данных, потребляемых временными файлами на диске в байтах для всех одновременно выполняемых пользовательских запросов.
max_temporary_data_on_disk_size_for_queryМаксимальное количество данных, потребляемых временными файлами на диске в байтах для всех одновременно выполняемых запросов.
max_sessions_for_userМаксимальное количество одновременных сессий для каждого аутентифицированного пользователя на сервере ClickHouse.
max_partitions_to_readОграничивает максимальное количество партиций, которые могут быть доступны в одном запросе.

Устаревшие настройки

примечание

Следующие настройки устарели

max_pipeline_depth

Максимальная глубина конвейера. Соответствует количеству преобразований, которые проходит каждый блок данных во время обработки запроса. Подсчитывается в пределах одного сервера. Если глубина конвейера больше, выбрасывается исключение.