쿼리 복잡도 제한

쿼리 복잡도 제한 (Restrictions on query complexity)

설정의 일부로 ClickHouse는 쿼리 복잡도에 제한을 걸 수 있는 기능을 제공해요. 리소스를 많이 사용할 수 있는 쿼리로부터 보호해 더 안전하고 예측 가능한 실행을 보장해 주는데, 특히 사용자 인터페이스를 쓸 때 유용해요.

출처: 문서

본문

개요 (Overview)

설정의 일부로 ClickHouse는 쿼리 복잡도에 제한을 걸 수 있는 기능을 제공해요. 이는 잠재적으로 리소스를 많이 사용하는 쿼리로부터 보호하여, 특히 사용자 인터페이스를 사용할 때 더 안전하고 예측 가능한 실행을 보장해요.

거의 모든 제한은 SELECT 쿼리에만 적용되며, 분산 쿼리 처리의 경우 각 서버에 개별적으로 적용돼요.

ClickHouse는 일반적으로 데이터 파트(data part)가 완전히 처리된 후에만 제한을 검사하며, 각 행마다 검사하지 않아요. 그래서 파트를 처리하는 동안 제한이 위반되는 상황이 발생할 수 있어요.

overflow_mode 설정

대부분의 제한에는 overflow_mode 설정도 있어요. 이는 한도를 초과했을 때 무엇을 할지 정의하며, 두 값 중 하나를 가질 수 있어요:

  • throw: 예외를 던져요(기본값).
  • break: 쿼리 실행을 중단하고, 마치 소스 데이터가 끝난 것처럼 부분 결과를 반환해요.

break와 함께 max_execution_time에 의해 쿼리가 중단되면, 일부 연산은 부분 결과를 안전하게 반환할 수 없어서 더 작은 결과 대신 아무것도 생성하지 않고 중단돼요. 단일 값을 계산하는 함수는 그 값을 생성하지 않고 중단되며, 중단이 TIMEOUT_EXCEEDED 오류로 클라이언트에 전달되는지 아니면 결과가 없는 것으로만 남는지는 쿼리가 중단된 위치에 달려 있어요. 타임아웃으로 불완전하게 남은 Memory 테이블 뮤테이션은 테이블을 변경하지 않고 TIMEOUT_EXCEEDED를 보고해요. INSERTQUERY_WAS_CANCELLED를 보고할 수 있어요. 다른 복제본이나 백그라운드 작업을 기다리는 일부 연산은 max_execution_time에서 전혀 중단되지 않아요. 쿼럼(quorum) 쓰기는 쿼럼이 충족될 때까지 계속 기다리거나, insert_quorum_timeout이 먼저 경과하면 UNKNOWN_STATUS_OF_INSERT를 보고해요.

group_by_overflow_mode 설정

group_by_overflow_mode 설정은 any 값도 가질 수 있어요:

  • any: 세트에 들어간 키에 대해서는 집계를 계속하지만, 세트에 새 키는 추가하지 않아요.

설정 목록 (List of settings)

다음 설정들이 쿼리 복잡도 제한을 적용하는 데 사용돼요.

참고: "무언가의 최대량"에 대한 제한은 0 값을 가질 수 있으며, 이는 "제한 없음"을 의미해요.

설정 간단한 설명
max_memory_usage 단일 서버에서 쿼리 실행에 사용할 최대 RAM 양.
max_memory_usage_for_user 단일 서버에서 사용자의 쿼리를 실행하는 데 사용할 최대 RAM 양.
max_rows_to_read 쿼리 실행 시 테이블에서 읽을 수 있는 최대 행 수.
max_bytes_to_read 쿼리 실행 시 테이블에서 읽을 수 있는 최대 바이트 수(압축되지 않은 데이터).
read_overflow_mode_leaf 읽은 데이터 양이 leaf 제한 중 하나를 초과할 때 어떻게 할지 설정.
max_rows_to_read_leaf 분산 쿼리 실행 시 leaf 노드의 로컬 테이블에서 읽을 수 있는 최대 행 수.
max_bytes_to_read_leaf 분산 쿼리 실행 시 leaf 노드의 로컬 테이블에서 읽을 수 있는 최대 바이트 수(압축되지 않은 데이터).
read_overflow_mode_leaf 읽은 데이터 양이 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과 유사하지만 분산 또는 원격 쿼리의 leaf 노드에만 적용.
timeout_overflow_mode_leaf 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가 수행할 동작을 정의.
max_partitions_per_insert_block 단일 insert 블록의 최대 파티션 수를 제한하며, 블록의 파티션이 너무 많으면 예외가 발생.
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 단일 쿼리에서 접근할 수 있는 최대 파티션 수를 제한.

폐기된 설정 (Obsolete settings)

참고: 다음 설정들은 폐기되었어요.

max_pipeline_depth

최대 파이프라인 깊이. 쿼리 처리 중 각 데이터 블록이 거치는 변환 횟수에 해당해요. 단일 서버 범위 내에서 계산돼요. 파이프라인 깊이가 더 크면 예외가 발생해요.

더 알아보기 (Learn more)