Обзор
В разделе настроек 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
Максимальная глубина конвейера. Соответствует числу преобразований, через которые проходит каждый блок данных при обработке запроса. Подсчитывается в пределах одного сервера. Если глубина конвейера превышает это значение, генерируется исключение.