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 Максимальный объём оперативной памяти, используемый для выполнения запроса на одном сервере.
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 (расчётное время проверяется только при 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 Максимальное количество временных столбцов, которые должны одновременно находиться в оперативной памяти при выполнении запроса, включая константные столбцы.
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 Ограничивает количество строк в хеш-таблице, используемой при JOIN таблиц.
max_bytes_in_join Максимальный размер хеш-таблицы, используемой при 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

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

Navigation