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

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

Обзор

В рамках настроек 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 при достижении любого из следующих ограничений для JOIN.
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

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