Cloud용 V24.6 변경 내역
v24.6 릴리스를 기반으로 한 ClickHouse Cloud 서비스 관련 변경 사항입니다.
이전 버전과 호환되지 않는 변경 사항
- 스토리지
S3Queue의Ordered모드에서 병렬 처리 방식을 재설계했습니다. 이 PR은s3queue_processing_threads_num또는s3queue_total_shards_num설정을 사용한 경우Ordered모드에 대해 이전 버전과 호환되지 않습니다. 설정s3queue_total_shards_num는 삭제되었습니다. 이 설정은 이전에는s3queue_allow_experimental_sharded_mode가 활성화된 경우에만 사용할 수 있었으며,s3queue_allow_experimental_sharded_mode는 이제 사용 중단(deprecated)되었습니다. 새로운 설정인s3queue_buckets가 추가되었습니다. #64349 (Kseniia Sumarokova). - 새로운 함수
snowflakeIDToDateTime,snowflakeIDToDateTime64,dateTimeToSnowflakeID,dateTime64ToSnowflakeID가 추가되었습니다. 기존 함수snowflakeToDateTime,snowflakeToDateTime64,dateTimeToSnowflake,dateTime64ToSnowflake와 달리, 새로운 함수는generateSnowflakeIDFUNCTION과 호환됩니다. 즉,generateSnowflakeID가 생성한 스노우플레이크 ID를 입력으로 받고,generateSnowflakeID와 동일한 타입(즉,UInt64)의 스노우플레이크 ID를 생성합니다. 또한 새로운 함수는generateSnowflakeID와 마찬가지로 기본적으로 UNIX epoch(1970-01-01)을 사용합니다. 필요하다면, 예를 들어 Twitter/X의 epoch인 2010-11-04(UNIX epoch 이후 1288834974657밀리초)와 같이 다른 epoch를 전달할 수 있습니다. 기존 변환 함수는 사용 중단(deprecated)되었으며 전환 기간 이후 제거될 예정입니다. 전환 기간 동안에도 기존 함수를 사용하려면 설정allow_deprecated_snowflake_conversion_functions를 활성화하십시오. #64948 (Robert Schulze).
New feature
- 빈 튜플을 지원합니다. #55061 (Amos Bird).
- Hilbert 곡선 인코딩 및 디코딩 함수가 추가되었습니다. #60156 (Artem Mustafin).
hilbertEncode에 대한 인덱스 분석을 지원합니다. #64662 (Artem Mustafin).- 함수
readWKTLineString을 사용해 WKT 포맷의LINESTRING지오메트리를 읽는 기능이 추가되었습니다. #62519 (Nikita Mikhaylov). - Twitter 스타일 Snowflake ID를 생성하는 새로운 SQL 함수
generateSnowflakeID가 추가되었습니다. #63577 (Danila Puzov). =연산자를 사용하여IPv4와IPv6타입을 비교하는 기능을 추가했습니다. #64292 (Francisco J. Jurado Moreno).- 이항 수학 함수(pow, atan2, max2, min2, hypot)에서 10진수 인자를 지원합니다. #64582 (Mikhail Gorshkov).
- SQL 함수
parseReadableSize(및OrNull,OrZero변형 함수)가 추가되었습니다. #64742 (Francisco J. Jurado Moreno). - 파일 기반 스토리지(s3/file/hdfs/url/azureBlobStorage)에
_time가상 컬럼을 추가했습니다. #64947 (Ilya Golshtein). - 새로운 함수
base64URLEncode,base64URLDecode,tryBase64URLDecode가 도입되었습니다. #64991 (Mikhail Gorshkov). - 두 UTF-8 문자열 간의 편집 거리를 계산하는 새로운 함수
editDistanceUTF8를 추가했습니다. #65269 (LiuNeng). - 사용자 정의 HTTP 핸들러에서 사용자 정의 응답 헤더를 지원하기 위해
http_response_headers설정을 추가했습니다. #63562 (Grigorii). - 쿼리 결과를 무한 루프로 반환할 수 있도록 새로운 테이블 함수
loop가 추가되었습니다. #63452 (Sariel). 이는 테스트에 유용합니다. system.query_log에used_privileges와missing_privileges라는 두 개의 컬럼을 추가했습니다.used_privileges는 쿼리 실행 중에 확인된 권한으로 채워지며,missing_privileges는 누락된 필수 권한을 포함합니다. #64597 (Alexey Katsman).- 설정
output_format_pretty_display_footer_column_names가 추가되었으며, 이를 활성화하면 행 수가 많은 테이블(기본값 50행)의 끝에 컬럼 이름을 표시합니다. 최소 행 수에 대한 임계값은output_format_pretty_display_footer_column_names_min_rows로 제어됩니다. #65144 (Shaun Struwig).
성능 향상
- #60459 (24.5)에서 발생한 CROSS JOIN의 성능 저하 문제를 수정합니다. #65243 (Nikita Taranov).
- io_uring 재제출 작업의 가시성을 개선합니다. 프로파일 이벤트 IOUringSQEsResubmits를 IOUringSQEsResubmitsAsync로 이름을 변경하고, 새 이벤트 IOUringSQEsResubmitsSync를 추가합니다. #63699 (Tomer Shafir).
- 모든 함수가 올바른 크기의 컬럼로 호출되었는지 검증하는 assertion을 도입했습니다. #63723 (Raúl Marín).
PRIMARY KEY가 설정한 순서를 위반하지 않으면서도 데이터 크기 최적화를 위해 INSERT 시 행을 재배열할 수 있는 기능이 추가되었습니다. 이 기능은 설정값optimize_row_order로 제어되며(기본값은 off), #63578에서 도입되었습니다(Igor Markelov).- 네이티브 Parquet 리더를 추가하여 Parquet 바이너리를 ClickHouse 컬럼으로 직접 읽을 수 있도록 했습니다. 이 기능은
input_format_parquet_use_native_reader설정(기본값은 비활성화)으로 제어됩니다. #60361 (ZhiHong Zhang). - 쿼리의 필터가 MergeTree 테이블에서 정확한 범위를 선택할 수 있을 때 부분적인 단순 COUNT 최적화를 지원합니다. #60463 (Amos Bird).
- 멀티스레드
INSERT의 최대 메모리 사용량을 줄이기 위해 여러 스레드의 청크를 하나의 transform에서 수집하도록 했습니다. #61047 (Yarik Briukhovetsky). - Azure 객체 스토리지 사용 시 고정 메모리 할당을 사용하여 추가 버퍼 할당을 피함으로써 메모리 사용량을 줄입니다. #63160 (SmitaRKulkarni).
ColumnNullable::size에서 가상 함수 호출 횟수를 줄였습니다. #60556 (HappenLee).- 정규식 인자가 한 글자인 경우
splitByRegexp의 성능을 향상했습니다. #62696 (Robert Schulze). - 사용된 최소 및 최대 키 값을 추적하여 8비트 및 16비트 키에 대한 집계를 가속화합니다. 이를 통해 검증해야 하는 셀의 개수를 줄일 수 있습니다. #62746 (Jiebin Sun).
IN연산자에서 왼쪽 피연산자가LowCardinality이고 오른쪽이 상수 집합(Set)인 경우를 최적화했습니다. #64060 (Zhiguo Zhou).ConcurrentHashJoin내부의 해시 테이블 초기화 및 삭제에 스레드 풀을 사용하도록 했습니다. #64241 (Nikita Taranov).- 희소 컬럼을 사용하는 테이블에서 수직 병합을 최적화했습니다. #64311 (Anton Popov).
- 수직 병합 시 원격 파일 시스템에서 데이터를 미리 가져오도록(prefetch) 기능을 활성화했습니다. 이를 통해 데이터가 원격 파일 시스템에 저장된 테이블에서 수직 병합의 지연 시간이 감소합니다. #64314 (Anton Popov).
ColumnSparse::filter에서isDefault의 중복 호출을 줄여 성능을 개선합니다. #64426 (Jiebin Sun).- 여러 개의 비동기
getChildren요청을 보내find_super_nodes및find_big_familykeeper-client 명령의 실행 속도를 높였습니다. #64628 (Alexander Gololobov). - 널 허용 숫자형 타입 인자를 사용하는
least/greatest함수를 개선했습니다. #64668 (KevinyhZou). - 쿼리 플랜에서 연속된 두 개의 필터링 단계를 하나로 병합할 수 있도록 했습니다. 이는 상위 단계의 필터 조건을 하위 단계로 내려보낼 수 있는 경우 filter-push-down 최적화를 향상시킵니다. #64760 (Nikolai Kochetov).
vertical final구현에서 잘못된 최적화를 제거하고,vertical final알고리즘을 기본값으로 다시 활성화합니다. #64783 (Duc Canh Le).- 필터 표현식에서 ALIAS 노드를 제거합니다. 이는 새 분석기를 사용할 때
PREWHERE가 포함된 쿼리의 성능을 소폭 향상시킵니다. #64793 (Nikolai Kochetov). - OpenSSL 세션 캐시를 다시 활성화합니다. #65111 (Robert Schulze).
- 삽입 시 skip 인덱스와 통계를 구체화하지 않도록 하는 설정(
materialize_skip_indexes_on_insert및materialize_statistics_on_insert)이 추가되었습니다. #64391 (Anton Popov). - 할당된 메모리 크기를 사용하여 row group 크기를 계산하고, 단일 스레드 모드에서 Parquet writer의 최대 메모리 사용량을 줄입니다. #64424 (LiuNeng).
- 희소 컬럼 이터레이터를 개선하여
size호출 횟수를 줄였습니다. #64497 (Jiebin Sun). - Azure Blob Storage로 백업할 때 서버 측 복사를 사용하도록 조건을 수정합니다. #64518 (SmitaRKulkarni).
- 스킵 인덱스가 많은 테이블에서 수직 병합 시 메모리 사용을 최적화했습니다. #64580 (Anton Popov).
개선 사항
- CSV 형식에서 ClickHouse가 튜플(Tuple)을 처리하고 해석하는 동작을 이전 방식으로 되돌렸습니다. 이 변경 사항은 사실상 ClickHouse/ClickHouse#60994를 되돌리는 것이며, 다음과 같은 몇 가지 설정에서만 활성화됩니다: output_format_csv_serialize_tuple_into_separate_columns, input_format_csv_deserialize_separate_columns_into_tuple 및 input_format_csv_try_infer_strings_from_quoted_tuples. #65170 (Nikita Mikhaylov).
- 시스템 테이블에 대해 실행하는
SHOW CREATE TABLE명령은 이제 각 테이블이 왜 필요한지 설명하는, 테이블마다 고유하고 매우 유용한 주석을 표시합니다. #63788 (Nikita Mikhaylov). - 이제 함수
round(),roundBankers(),floor(),ceil()및trunc()의 두 번째 인수인 scale이 상수가 아닌(non-const) 값일 수 있습니다. #64798 (Mikhail Gorshkov). - 서비스가 포화 상태인 환경에서 스레드를 스케줄링할 때 MergeTree 인덱스 분석 과정에서 발생할 수 있는 데드락을 방지합니다. #59427 (Sean Haynes).
- S3 프록시 지원 및 터널링에서 발생하는 몇 가지 경미한 코너 케이스가 수정되었습니다. #63427 (Arthur Passos).
plain_rewritable메타데이터 스토리지가 생성 및 삭제한 디렉터리 개수와 로컬-원격 인메모리 맵에 있는 엔트리 개수를 추적하기 위한 메트릭을 추가합니다. #64175 (Julia Kartseva).- 이제 쿼리 캐시는 설정이 서로 다른 동일한 쿼리를 각각 별개의 것으로 간주합니다. 이는
limit또는additional_table_filters와 같은 설정 차이가 쿼리 결과에 영향을 미치는 경우에도 동작의 견고성을 높여 줍니다. #64205 (Robert Schulze). - 객체 스토리지에서 비표준 오류 코드
QpsLimitExceeded를 재시도 가능한 오류로 지원합니다. #64225 (Sema Checherinda). - 평균 출력 블록 크기(바이트 단위)를 제어하기 위한 새로운 설정
input_format_parquet_prefer_block_bytes를 추가하고,input_format_parquet_max_block_size의 기본값을 65409로 변경했습니다. #64427 (LiuNeng). - 사용자 config의 Settings 값은 객체 스토리지를 기반으로 하는
MergeTree테이블의 머지(merge)와 뮤테이션(mutation)에 영향을 주지 않습니다. #64456 (alesapin). - 객체 스토리지에서 비표준 오류 코드
TotalQpsLimitExceeded를 재시도 가능한 오류로 지원합니다. #64520 (Sema Checherinda). - 오픈 소스 및 ClickHouse Cloud 버전 모두의 고급 대시보드에 'Maximum concurrent network connections' 차트를 추가했습니다. #64610 (Thom O'Connor).
zeros_mt및generateRandom의 진행 상황 보고를 개선했습니다. #64804 (Raúl Marín).- 비동기 메트릭
jemalloc.profile.active를 추가하여 현재 샘플링이 활성 상태인지 여부를 표시합니다. 이는prof.active와 함께 사용하는 추가적인 활성화 메커니즘으로, 호출 스레드가 샘플링을 수행하려면 둘 다 활성 상태여야 합니다. #64842 (Unalian). allow_experimental_join_condition의 중요(important) 표시를 제거합니다. 이 표시는 혼합 버전 클러스터에서 분산 쿼리가 성공적으로 실행되지 못하게 했을 수 있습니다. #65008 (Nikita Mikhaylov).- 서버 비동기 메트릭
DiskGetObjectThrottler*및DiskGetObjectThrottler*를 추가하여 디스크 설정s3_max_get_rps및s3_max_put_rps로 정의된 초당 요청 수(rate limit)와, 디스크의 스로틀링 한도에 도달하지 않고 전송할 수 있는 현재 가능한 요청 수를 반영합니다. 이 메트릭은 제한이 설정된 각 디스크에 대해 정의됩니다. #65050 (Sergei Trifonov). bcrypt_hash를 사용해 USER를 생성할 때 검증을 추가했습니다. #65242 (Raúl Marín).PREWHERE실행 중 및 실행 후에 읽힌 행 수를 위한 프로파일 이벤트를 추가합니다. #64198 (Nikita Taranov).- 병렬 레플리카 사용 시
EXPLAIN PLAN에 쿼리를 출력하도록 했습니다. #64298 (vdimir). allow_deprecated_functions의 이름을allow_deprecated_error_prone_window_functions로 변경합니다. #64358 (Raúl Marín).file테이블 함수에서 파일 디스크립터에 대해서도max_read_buffer_size설정을 준수하도록 했습니다. #64532 (Azat Khuzhin).- 지원되지 않는 스토리지에서는 materialized view에서도 트랜잭션을 비활성화합니다. #64918 (alesapin).
- 이전 분석기에서
QUALIFY절 사용을 금지했습니다. 이전 분석기는QUALIFY를 무시했으므로 뮤테이션에서 예상치 못한 데이터 삭제가 발생할 수 있었습니다. #65356 (Dmitry Novik).
버그 수정 (공식 안정 릴리스에서 사용자가 인지할 수 있는 오동작)
- IN 및 indexHint()와 함께 사용할 때 'set' skip 인덱스가 작동하지 않던 문제를 수정했습니다. #62083 (Michael Kolupaev).
- 테이블이 adaptive granularity를 사용하지 않을 때 FINAL을 사용하는 쿼리에서 잘못된 결과가 반환되던 문제를 수정했습니다. #62432 (Duc Canh Le).
- 매개변수화된 VIEW 값 할당 시 FUNCTION 실행을 지원합니다. #63502 (SmitaRKulkarni).
- Parquet 메모리 사용량 추적을 수정했습니다. #63584 (Michael Kolupaev).
- 분산 쿼리 결과에서 데이터가 누락될 수 있었던 드문 문제를 수정했습니다. #63691 (vdimir).
- Tuple(Map(LowCardinality(String), String), ...) 타입 컬럼의 읽기 처리를 수정했습니다. #63956 (Anton Popov).
- 한정되지 않은 COLUMNS matcher의 처리 방식을 수정합니다. 입력 컬럼의 순서를 유지하고 알 수 없는 식별자의 사용을 금지합니다. #63962 (Dmitry Novik).
- 서로 다른 유형(식과 함수)의 순환 별칭에서 발생하던 Cyclic aliases 오류를 수정했습니다. #63993 (Nikolai Kochetov).
- 이 수정사항은 쿼리 파이프라인에서 각 개별 뷰마다 올바른 definer가 설정된 적절히 재정의된 컨텍스트를 사용합니다. #64079 (pufit).
- Analyzer 수정: INTERPOLATE 사용 시 발생하던 "Not found column" 오류를 수정했습니다. #64096 (Yakov Olkhovskiy).
- CREATE TABLE을 MaterializedView로 실행할 때 LOGICAL_ERROR가 발생하지 않도록 수정했습니다. #64174 (Raúl Marín).
- 이제 쿼리 캐시는 서로 다른 데이터베이스에서 실행된 동일한 두 개의 쿼리를 서로 다른 것으로 간주합니다. 이전 동작은 테이블에서 읽기 권한이 없을 때 이를 우회하는 데 악용될 수 있었습니다. #64199 (Robert Schulze).
- StatusFile의 ~WriteBufferFromFileDescriptor에서 처리되지 않은 예외 발생 시 중단될 수 있던 문제를 수정합니다. #64206 (Kruglov Pavel).
- ARRAY JOIN이 포함된 분산 쿼리에서 발생하던 중복 별칭 오류를 수정합니다. #64226 (Nikolai Kochetov).
- 문자열에서 정수로의 예기치 않은 accurateCast 동작을 수정합니다. #64255 (wudidapaopao).
- 어떤 OR 그룹에 상호 배타적인 원자식이 포함된 경우의 CNF 단순화를 수정했습니다. #64256 (Eduard Karacharov).
- 쿼리 트리 크기 검증을 수정했습니다. #64377 (Dmitry Novik).
- 논리적 오류 수정: PREWHERE가 있는 Buffer 테이블에서 잘못된 캐스트가 발생하는 문제를 해결했습니다. #64388 (Nikolai Kochetov).
- 기본 표현식이 있는 테이블에서도 CREATE TABLE AS 쿼리가 올바르게 동작하도록 수정했습니다. #64455 (Anton Popov).
- 널 허용 키가 있는 테이블에서 ORDER BY ... NULLS FIRST / LAST를 사용할 때 optimize_read_in_order 설정의 동작을 수정했습니다. #64483 (Eduard Karacharov).
- 별칭(alias)을 사용하는 GLOBAL IN.. 쿼리에서 Expression 노드 목록이 PROJECTION 이름 1개만을 기대하던 문제와 「Unknown expression or identifier」 오류를 수정했습니다. #64517 (Nikolai Kochetov).
- GROUP BY 키에 상수 CTE가 있을 때 분산 쿼리에서 발생하는 "Cannot find column" 오류를 수정합니다. #64519 (Nikolai Kochetov).
- 서식 지정자가 생성하는 문자 수가 홀수이고 마지막 문자가 0인 경우 함수 formatDateTimeInJodaSyntax의 출력이 올바르지 않던 문제를 수정했습니다. 예를 들어 이제는 SELECT formatDateTimeInJodaSyntax(toDate('2012-05-29'), 'D')이(가) 예전에는 15를 반환했지만, 이제는 올바르게 150을 반환합니다. #64614 (LiuNeng).
- -If 콤비네이터가 이미 사용된 경우 집계를 재작성하지 않습니다. #64638 (Dmitry Novik).
- 작은 버퍼(예: --max_read_buffer_size 1인 경우)에서 float에 대한 타입 추론을 수정합니다. #64641 (Azat Khuzhin).
- 식 기반 TTL이 동작하지 않을 수 있는 버그를 수정했습니다. #64694 (alesapin).
- 새 애널라이저에서 항상 참인 WHERE 및 PREWHERE 표현식을 제거하도록 수정했습니다. #64695 (Nikolai Kochetov).
- startsWith, endsWith, match, multiSearchAny 결과로 필터링할 때 토큰 기반 텍스트 인덱스(ngrambf, full_text)에 의해 데이터 파트가 과도하게 제거되던 문제를 수정했습니다. #64720 (Eduard Karacharov).
- UTF8::computeWidth FUNCTION에서 ANSI CSI 이스케이프 처리가 잘못 동작하던 문제를 수정합니다. #64756 (Shaun Struwig).
- 서브쿼리 전반에 걸쳐 ORDER BY / LIMIT BY 절이 잘못 제거되던 문제를 수정합니다. #64766 (Raúl Marín).
- 혼합 조인 조건에 포함된 Set에 대한 서브쿼리를 사용하는 비등가 조인을 (실험적으로) 수정했습니다. #64775 (lgbo).
- plain_rewritable 디스크의 로컬 캐시에서 발생하던 비정상 종료 문제를 수정했습니다. #64778 (Julia Kartseva).
- 분산 쿼리에서 Nested 컬럼에 대한 ARRAY JOIN 사용 시 컬럼을 찾을 수 없는 문제를 수정합니다. #64755를 수정합니다. #64801 (Nikolai Kochetov).
- SLRU 캐시 정책의 메모리 누수를 수정합니다. #64803 (Kseniia Sumarokova).
- S3에서 데이터를 읽는 쿼리, HTTP 프로토콜을 통한 쿼리, 비동기 insert 등 여러 종류의 쿼리에서 메모리 추적이 잘못될 수 있던 문제를 수정했습니다. #64844 (Anton Popov).
- 소스 테이블과 다른 타입의 컬럼을 가진 materialized view에서 PREWHERE로 읽는 쿼리 실행 시 발생하던 Block 구조 불일치 오류를 수정했습니다. Fixes #64611. #64855 (Nikolai Kochetov).
- 테이블에서 서브쿼리가 포함된 TTL을 사용하고, 데이터베이스가 복제되어 있으며, 병렬 레플리카와 analyzer가 함께 사용될 때 드물게 크래시가 발생하던 문제를 수정했습니다. 매우 드문 경우이지만, 서브쿼리가 포함된 TTL은 사용하지 않는 것이 좋습니다. #64858 (alesapin).
- ClickHouse/ClickHouse#54211에서 매개변수화된 VIEW에 대해 올바르게 동작하지 않던 ALTER MODIFY COMMENT 쿼리를 수정했습니다. #65031 (Nikolay Degterinsky).
- cluster_secure_connection 파라미터가 활성화된 경우 DatabaseReplicated에서 host_id를 수정했습니다. 이전에는 이 파라미터가 활성화되어 있어도 DatabaseReplicated가 클러스터 내에서 생성하는 모든 연결이 보안 연결이 아니었습니다. #65054 (Nikolay Degterinsky).
- StorageMerge에 대한 PREWHERE 최적화 적용 후 발생하던 「Not-ready Set」 오류를 수정합니다. #65057 (Nikolai Kochetov).
- File-like 스토리지에서 finalized 버퍼에 쓰지 않도록 수정했습니다. #65063 (Kruglov Pavel).
- 순환 별칭으로 인해 쿼리 실행 시간이 무한히 길어질 수 있는 문제를 수정합니다. #64849를 수정합니다. #65081 (Nikolai Kochetov).
- 새로운 analyzer에서 INTERPOLATE (alias)를 사용하는 원격 쿼리 실행 시 발생하는 「Unknown expression identifier」 오류를 수정합니다. #64636 이슈를 해결합니다. #65090 (Nikolai Kochetov).
- 집계 밖으로 산술 연산을 푸시하는 최적화를 수정합니다. 새로운 analyzer에서는 해당 최적화가 한 번만 적용되었습니다. #65104 (Dmitry Novik).
- 새 분석기에서 집계 FUNCTION 이름 재작성 문제를 수정했습니다. #65110 (Dmitry Novik).
- 클라이언트 소켓에서 요청 본문(의 일부)을 읽는 동안 수신 타임아웃이 발생하는 경우 200 OK 대신 5xx를 반환하도록 변경했습니다. #65118 (Julian Maicher).
- hedged 요청에서 발생할 수 있는 잠재적인 크래시를 수정했습니다. #65206 (Azat Khuzhin).
- Hashed 및 Hashed_Array 딕셔너리의 단락 평가에서 초기화되지 않은 숫자를 읽어 다양한 오류가 발생할 수 있는 문제를 수정합니다. #65256 (jsc0218).
- 이 PR은 상수(IN 연산자의 두 번째 매개변수)의 타입이 IN 연산자의 타입 변환 과정에서 항상 보이도록 보장합니다. 그렇지 않으면 타입 정보가 손실되어 DateTime에서 Date로의 변환과 같은 일부 변환이 실패할 수 있습니다. fix (#64487). #65315 (pn).