하위 호환되지 않는 변경 사항
쿼리 및 구문 변경
IN연산자는 이제Bool타입에 대해 정확한 값 의미론을 사용합니다. 즉, 집합의0과1만Bool값과 일치합니다. 이전에는IN집합의255보다 큰 숫자 값이 잘못해서 true로 보정되어SELECT CAST(1, 'Bool') IN (256)이1을 반환했습니다. 이제는 올바르게0을 반환합니다. #93115 (Ashrith Bandla).NOT연산자 우선순위를 SQL 표준에 맞게 수정했습니다. 이제NOT은IS NULL,BETWEEN,LIKE및 산술 연산자보다 느슨하게 결합됩니다. 예를 들어NOT (x) IS NULL은 이제(NOT x) IS NULL이 아니라NOT (x IS NULL)로 해석됩니다. 이 변경으로 인해 이전의(표준이 아닌) 동작에 의존하던 쿼리 결과가 달라질 수 있습니다. #97680 (Alexey Milovidov).- 이제
WITH표현식 목록 요소에서SELECT를 인용 부호 없는 식별자로 사용할 수 없습니다. #101059 (Aruj Bansal). IN연산자는 이제 복합 타입(Tuple,Array,Map) 내부에서 손실이 발생하는Decimal변환을 거부하므로, 동작이 최상위 스칼라 비교와 일관되게 됩니다. 이전에는 정밀도 검사가 최상위 스칼라 값에만 적용되었습니다. 예를 들어CAST('33.3', 'Decimal64(1)') IN (33.33)은 올바르게0을 반환했지만CAST(['33.3'], 'Array(Decimal64(1))') IN ([33.33])은 잘못해서1을 반환했습니다. 이제 두 경우 모두 올바르게0을 반환합니다. #101812 (Nihal Z. Miaji).
데이터 타입 변경 사항
- 이제 데이터 타입 직렬화 버전이 중첩된 데이터 타입에도 전파됩니다. 예를 들어 String 직렬화 버전
with_size_stream은 이전에는 최상위 String 컬럼과 Tuple 요소에만 적용되었지만, 이제는 Array, Map, Variant, JSON 등 중첩 타입 내부의 모든 String 타입에도 적용됩니다. 이는 설정propagate_types_serialization_versions_to_nested_types로 제어되며, 현재 기본적으로 활성화되어 있습니다. 이 변경 이후 새로 생성된 데이터 파트는 이전 버전에서 읽을 수 없지만, 기존 파트는 새 버전에서 읽을 수 있습니다. 업그레이드는 안전하지만 다운그레이드는 안전하지 않습니다. #94859 (Pavel Kruglov). QBit바이너리 직렬화의 엔디언을 리틀 엔디언 포맷을 사용하도록 수정했습니다. #101378 (Raufs Dunamalijevs).
스토리지 및 인덱스 변경 사항
- 여러 컬럼으로 구성된 정렬 키를 사용하는 프로젝션이 올바르게 인식되도록 일반 프로젝션의 메타데이터를 수정했습니다. #91352 (Amos Bird).
- 스킵 인덱스 파일이
replace_long_file_name_to_hash설정을 따르지 않던 문제를 수정했습니다. 이 문제로 인해 이름이 긴 인덱스에서 “File name too long” 오류가 발생하고 인덱스를 읽지 못하는 문제가 있었습니다. 이제 스킵 인덱스 파일 이름은 컬럼 파일과 마찬가지로max_file_name_length를 초과하면 해시 처리됩니다. 이는 하위 호환됩니다(새 서버는 기존 파트를 읽을 수 있습니다). 그러나 다운그레이드 시(또는 롤링 업그레이드 중 구버전 서버에서는) 이름이 긴 인덱스가 무시될 수 있습니다. #97128 (Raúl Marín).
제거된 기능
hypothesis스킵 인덱스 유형을 제거했습니다. 이 기능은 잘 알려지지 않은 실험적 기능으로, 실제 활용도도 제한적이었습니다. 이제INDEX ... TYPE hypothesis로 테이블을 생성하면 오류가 발생합니다. #96874 (Alexey Milovidov).- 실험적
detectProgrammingLanguage함수를 제거했습니다. #99567 (Alexey Milovidov).
설정 및 구성 변경 사항
mysql_datatypes_support_level의 기본값이 빈 값에서decimal,datetime64,date2Date32로 변경되었습니다. 이로써 기본적으로 MySQLDATE는Date32로,DECIMAL/NUMERIC은Decimal로, 그리고 정밀도가 지정된DATETIME/TIMESTAMP는DateTime64로 올바르게 매핑됩니다. 이전에는 MySQLDATE컬럼이Date로 매핑되었는데,Date는 1970-01-01 이전 날짜를 표현할 수 없어 데이터 손상이 발생했습니다. #97716 (Alexey Milovidov).
삽입 및 중복 제거 변경 사항
- 이제 async insert가 기본적으로 활성화됩니다 — ClickHouse는 기본적으로 모든 작은 삽입을 배치로 묶어 처리합니다. 이는
compatibility설정으로 제어됩니다.compatibility를 26.2보다 낮은 버전으로 설정하면 이전 기본값인false로 복원됩니다. async inserts는 여러 수준에서 켜거나 끌 수 있습니다. 구성의 사용자 profile, session, 쿼리 또는 MergeTree table 수준에서 설정할 수 있습니다. #97590 (Sema Checherinda).
시스템 테이블 변경 사항
system.query_log의skip_indexes컬럼 변경을 되돌렸습니다. #101018 (Alexey Milovidov).
기타 호환되지 않는 변경 사항
mergeTreeAnalyzeIndexes{,UUID}는 이제 정규 표현식 대신 파트 이름 배열을 받습니다. 정규 표현식은 느리기 때문입니다(실험적 기능). #98474 (Azat Khuzhin).- H3 라이브러리가 v4로 업데이트되어 길이, 면적 및 기타 메트릭 계산의 정밀도가 향상되었습니다. 새 결과가 이전 결과와 다르므로, 이 변경 사항은 하위 호환되지 않습니다. #100348 (Alexey Milovidov).
Merge테이블이 가상 컬럼(virtual columns)을 처리하는 방식이 변경되었습니다. 기본 테이블에_table또는_database가 있으면 해당 컬럼은 스토리지에서 읽고, 그렇지 않으면 읽기 단계 이후 표현식 단계를 통해 채웁니다. #101742 (Mikhail Artemenko).
새 기능
함수
- 자연 정렬용 키를 위한
naturalSortKey(s)함수를 추가했습니다. #90322 (Nazarii Piontko). - 각 지연값에 대해 숫자 배열의 정규화된 자기상관을 계산하는
arrayAutocorrelation(arr [, max_lag])함수를 추가했습니다. 정수, 부동소수점, Decimal 배열 타입을 지원합니다. #94776 (Wenyu Chen). - 이제
Map과 유사하게 경로 존재 여부를 확인할 수 있도록 JSON 타입에서has()함수가 지원됩니다. #96927 (DQ). - 텍스트 인덱스에서 직접 데이터를 읽는
mergeTreeTextIndex(database, table, index)테이블 함수를 추가했습니다. 내부 검사에 활용하거나 텍스트 인덱스 데이터에 대해 집계를 수행하는 데 사용할 수 있습니다. #97003 (Anton Popov). obfuscateQuerySQL 함수를 추가했습니다. #98305 (Xuewei Wang).- 유니코드 대소문자 접기와 발음 구별 기호 제거를 위한
caseFoldUTF8및removeDiacriticsUTF8함수를 추가했습니다. #98973 (George Larionov). - 이제
printf함수가 상수가 아닌 포맷 문자열을 지원하므로, 컬럼 값에 따라 각 행마다 서로 다른 포맷 패턴을 사용할 수 있습니다. #98991 (Yash). - 텍스트 문자열에서 검색어가 나타나는 부분을 HTML 태그(기본값
<em>/</em>)로 감싸는highlight()함수를 추가했습니다. ASCII 대소문자 구분 없는 일치, 겹치는 일치 항목의 자동 병합, 사용자 지정 여는/닫는 태그를 지원합니다. #99131 (Peng). - NFKC 정규화와 대소문자 접기를 결합한 NFKC_Casefold 유니코드 정규화를 위한
normalizeUTF8NFKCCasefold문자열 함수를 추가했습니다. #99276 (George Larionov). - 전문 검색 인덱스용
unicode_word토크나이저와tokens함수를 추가했습니다. 유니코드 단어 경계 규칙을 사용해 텍스트를 분할합니다. ASCII 단어는 연결 문자(밑줄, 콜론, 점, 작은따옴표)를 포함해 구성되며, ASCII 이외의 유니코드 문자는 단일 문자 토큰이 됩니다. 구성 가능한 불용어의 기본값은 일반적인 CJK 문장 부호입니다. #99357 (Amos Bird). - 2차원 배열(행렬)을 받아 전치하는
arrayTranspose함수를 추가했습니다. #101214 (Vitaly Baranov). - 구문 검색(연속된 토큰 시퀀스)을 위한
hasPhrase함수(별칭matchPhrase)를 추가했습니다. 검색은 브루트포스 방식이며 아직 텍스트 인덱스에서는 지원되지 않습니다. #101997 (Elmi Ahmadov). - 벡터 유사성 인덱스에서 지원되는 거리 함수로
dotProduct를 추가했습니다. 이제 모든 거리 함수에 대해 정렬 방향을 검증하여 잘못된 결과가 아무 경고 없이 반환되는 일을 방지합니다. #102254 (Renzo). - 이제
stem함수가String,FixedString,Array([Fixed]String),Nullable,LowCardinality,Const컬럼의 모든 단어와 토큰에 대해 어간 추출을 수행할 수 있습니다. #99137 (Jimmy Aguilar Mena). stem함수는 이제 실험적 기능이 아닙니다(이전에는allow_experimental_nlp_functions를 활성화해야 했습니다). #102399 (Jimmy Aguilar Mena).JSONAllValues함수가 추가되었습니다. 이 함수는JSON컬럼의 모든 값을Array(String)으로 반환하며, 값은 텍스트 형식으로 직렬화되고 경로 이름 순으로 정렬됩니다. 또한JSON컬럼의JSONAllValues표현식에 대한 텍스트 인덱스 지원도 추가되었습니다.JSONAllValues(json_column)에 텍스트 인덱스를 생성하면JSON서브컬럼에 대한 쿼리 필터링(예:json_column.key1 = 'value')에 자동으로 사용됩니다. #100730 (Anton Popov).EXTRACT연산자에 PostgreSQL 호환 단위EPOCH,DOW,DOY,ISODOW,ISOYEAR,WEEK,CENTURY,DECADE,MILLENNIUM이 추가되었습니다. 또한 이전에 오류를 발생시키던EXTRACT(WEEK FROM date)도 수정되었습니다. #100274 (Alexey Milovidov).- SQL 표준
OVERLAY함수 구문에 대해 parser sugar를 통한toDaysInMonth()함수 지원이 추가되었습니다.overlay함수는 이미 존재하며, 이번 변경으로PLACING,FROM,FOR를 구분자로 사용하는 키워드 기반 형식도 지원됩니다. #101681 (Desel72). - 이제
Date및Date32값을+연산자를 사용해Time및Time64값과 더할 수 있으며, 그 결과로DateTime또는DateTime64가 생성됩니다. 예를 들어SELECT toDate('2024-01-15') + toTime('14:30:25')는2024-01-15 14:30:25를 반환합니다. 결과는 세션 시간대에서 계산되며, 범위를 벗어난 결과는date_time_overflow_behavior설정에 따라 처리됩니다. #102421 (Nihal Z. Miaji).
SQL 및 쿼리 기능
- 매개변수의 유형이
Nullable이고 값이 지정되지 않은 경우, 이제 해당 값은NULL로 간주됩니다. #93869 (Vikash Kumar). - 이제 ClickHouse는 min/max 통계를 기반으로
SELECT쿼리에서 전체 데이터 파트를 걸러낼 수 있습니다. #94140 (zoomxi). - Materialized CTEs 지원이 추가되었습니다. 이 기능은 쿼리 실행 중 CTE를 한 번만 평가하고 결과를 임시 테이블에 저장합니다. #94849 (Dmitry Novik).
- 이제 일부 함수는 SQL에서 괄호 없이 사용할 수 있습니다. #95949 (Aly Kafoury).
JSON유형에 결합 서브컬럼 구문json.@path가 추가되었습니다. 경로에 스칼라가 있으면 리터럴 값을Dynamic으로 반환하고, 경로에 중첩 객체가 있으면 하위 객체를Dynamic으로 반환하며, 경로가 없으면NULL을 반환합니다. #98788 (Pavel Kruglov).- 서브쿼리 표현식용
SOME키워드가 추가되었습니다. 동작은ANY와 동일합니다. #99842 (Artem Kytkin). SET session_timezone의 별칭으로SET TIME ZONE 'tz'지원이 추가되었습니다. #99883 (phulv94).- SQL 표준
VALUES절을FROM의 테이블 표현식으로 사용할 수 있도록 지원이 추가되었습니다. 예:SELECT * FROM (VALUES (1, 'a'), (2, 'b')) AS t(id, val). #100143 (Desel72). TO범위 한정자가 포함된 SQL 표준 복합 인터벌 리터럴 지원이 추가되었습니다. 예:INTERVAL '1:30' HOUR TO MINUTE. 내부적으로는 인터벌의 합으로 분해됩니다. #100453 (Desel72).- ordered 및 unordered 모드용
SYSTEM FLUSH OBJECT STORAGE QUEUE db.table PATH 'x'명령이 추가되었습니다. #100709 (Bharat Nallan).
테이블 엔진 및 스토리지
- Keeper 기반 스냅샷 진행 상태 추적과 함께
Paimon테이블 엔진에 대한 증분 읽기 지원이 추가되었으며,paimon_target_snapshot_id를 통한 특정 스냅샷 델타 읽기도 포함됩니다. #93655 (XiaoBinMu). DatabaseReplicated에 보조 ZooKeeper 지원이 추가되었습니다. #95590 (RinChanNOW).- Iceberg v3 나노초 타임스탬프 타입(
timestamp_ns및timestamptz_ns) 읽기 지원이 추가되었으며, 각각DateTime64(9)및DateTime64(9, 'UTC')로 매핑됩니다. 이를 통해 ClickHouse는 스키마에 이러한 타입이 포함된 Iceberg 데이터를 읽을 수 있습니다. 다만 이는 Iceberg v3 전체를 지원한다는 의미는 아니며, 이러한 타입으로 Iceberg v3에 쓰기를 지원하는 것도 아닙니다. #97132 (Dmitry Kovalev). - Iceberg 테이블용
ALTER TABLE ... EXECUTE expire_snapshots('<timestamp>')가 추가되었습니다. #97904 (murphy-4o). - 메타데이터만 읽기 위해 파일을 다시 다운로드할 필요를 없애 읽기 성능을 개선하는 Parquet 메타데이터용 새 SLRU 캐시가 추가되었습니다. #98140 (Grant Holly).
JSONAllPaths를 사용하는 JSON 컬럼에 대해bloom_filter,tokenbf_v1,ngrambf_v1,text(역색인) 인덱스 타입과 함께 MergeTree 스킵 인덱스 지원이 추가되어, 각 granule에 존재하는 JSON 경로 집합을 기준으로 granule 스키핑이 가능해졌습니다. #98886 (Pavel Kruglov).- 삽입 순서에 따라 데이터를 재구성하는
commit_order프로젝션 인덱스가 추가되었습니다. #99004 (Mikhail Artemenko). - MergeTree의
Map컬럼에 버킷 직렬화가 추가되었습니다(map_serialization_version = 'with_buckets'). 키는 해시 기반 버킷으로 분할되므로 단일 키(m['key'])를 읽을 때 전체 컬럼 대신 하나의 버킷만 읽게 되어, 맵 크기에 따라 단일 키 조회 성능이 2~49배 향상됩니다. 버킷 수와 버킷팅 전략은 새로운 MergeTree 설정map_serialization_version,max_buckets_in_map,map_buckets_strategy,map_buckets_coefficient,map_buckets_min_avg_size로 제어할 수 있습니다.map_serialization_version_for_zero_level_parts설정은 삽입 시 쓰기 오버헤드를 피하기 위해 기본 직렬화를 유지하고, 병합된 파트에는 버킷을 사용하도록 합니다.mapKeys/mapValues에 대한 스킵 인덱스는 버킷 직렬화와 함께 지원되며, 버킷을 사용할 수 있을 때optimize_functions_to_subcolumns는m['key']를 키별 서브컬럼 읽기로 재작성합니다. #99200 (Pavel Kruglov).
삽입 및 중복 제거
- squashing에서
max_insert_block_size_rows,max_insert_block_size_bytes,min_insert_block_size_rows,min_insert_block_size_bytes에 대한 새로운 동작이 구현되었으며, 이 동작은 호환성 설정use_strict_insert_block_limits로 제어됩니다. #94207 (Kirill Kopnev).
설정 및 구성
- 테이블을 읽기 전용으로 표시해 삽입과 수정을 방지하는
table_readonlyMergeTree 설정이 추가되었습니다. #97652 (Alexey Milovidov). use_partition_pruning설정(별칭use_partition_key)이 추가되었습니다. 파티션 키 기반 파티션 프루닝을 비활성화하려면 이 값을false로 설정하십시오. #97888 (Nihal Z. Miaji).- 이제
<protocols>의 각type=http항목에서 별도의<http_handlers_*>구성 섹션을 가리키는 사용자 지정<handlers>키를 지정할 수 있으므로, 포트별로 서로 다른 HTTP 라우팅 규칙을 적용할 수 있습니다. #98414 (Amos Bird). replicated_fetches_min_part_level및replicated_fetches_min_part_level_timeout_seconds의 두 MergeTree 설정이 추가되었습니다. 이 설정을 사용하면 레플리카가 피어에서 새로 삽입된(머지되지 않은) 파트를 가져오는 작업을 건너뛸 수 있어, 대량 수집 중 복제 오버헤드를 줄일 수 있습니다. #98625 (tanner-bruce).restore_access_entities_with_current_grants서버 설정이 추가되었습니다. 이 설정을 활성화하면 복원된 사용자/역할의 권한 부여 범위가 복원을 수행하는 사용자가 부여할 수 있는 권한으로 제한되며(GRANT CURRENT GRANTS와 동일한 의미),ACCESS_DENIED오류로 실패하지 않습니다. #98795 (pufit).skip_unavailable_shards가 활성화된 경우 조용히 건너뛸 수 있는 세그먼트 수를 제한하는max_skip_unavailable_shards_num및max_skip_unavailable_shards_ratio설정이 추가되었습니다. 사용 불가능한 세그먼트의 수 또는 비율이 구성된 임계값을 초과하면, 조용히 불완전한 결과를 반환하는 대신 예외가 발생합니다. #99369 (Alexey Milovidov).- 공개 ClickHouse 서비스를 오남용으로부터 보호하기 위해 정규화된 쿼리 해시 기반 쿼터가 구현되었습니다.
NORMALIZED_QUERY_HASH는 쿼터 키 유형으로 지원되며, 고유한 각 정규화된 쿼리마다 별도의 쿼터 버킷을 사용하므로CREATE QUOTA q KEYED BY normalized_query_hash는 서로 다른 각 쿼리를 독립적으로 추적합니다.QUERIES_PER_NORMALIZED_HASH는 쿼터 리소스 유형으로 지원되며, 인터벌 내에서 단일 정규화된 쿼리의 최대 실행 횟수를 제한하므로MAX queries_per_normalized_hash = 100은 하나의 쿼리 패턴이 100회를 초과해 실행되지 않도록 합니다. #99586 (Alexey Milovidov). - 이제
auto_statistics_typesMergeTree 설정의 기본값이minmax, uniq이므로, 새 테이블의 적합한 모든 컬럼에 대해 minmax 및 uniq 통계가 자동으로 생성됩니다. 또한materialize_statistics_on_insert의 기본값이false로 변경되어, 통계는 삽입 시점이 아니라 머지 중에 생성되므로 삽입 오버헤드를 줄일 수 있습니다. 이전 동작으로 되돌리려면materialize_statistics_on_insert = 1로 설정하십시오. #101275 (Han Fei). - 레플리카 간 복제 지연으로 인한 누락 데이터를 줄이기 위해 materialized view 종속성 체인용
prefer_dependency_replica갱신 설정이 추가되었습니다. #101591 (Seva Potapov).
인증
- LDAP 클라이언트가 리퍼럴을 따를지 제어하는 서버별 LDAP 구성 옵션
<follow_referrals>(기본값false)이 추가되었습니다. 리퍼럴 추적을 비활성화하면 Active Directory 도메인 루트 base DN에서 검색할 때 발생하는 timeout 및 중단 현상을 방지할 수 있으며, 로그 잡음도 줄어듭니다. #96765 (paf91).
시스템 테이블
- 모든 히스토그램 메트릭(예: S3/Azure 지연 시간, Keeper 요청 처리 단계의 소요 시간)을 주기적으로 스냅샷하는 새로운 시스템 테이블
system.histogram_metric_log가 추가되었습니다. 더 높은 유연성과 Prometheus 데이터 모델과의 호환성을 위해system.histogram_metrics의value컬럼은 이제Float64를 사용합니다. #103046 (Miсhael Stetsyuk).
실험적 기능
- ALP 부동소수점 압축 코덱을 추가했습니다(ALP_rd 폴백 없이, 압축할 수 없는 double에는 적용되지 않음). #91362 (Nazarii Piontko).
- JSON 컬럼용 실험적 지연 실행 type hint를 추가했습니다.
allow_experimental_json_lazy_type_hints를 통해 활성화하면, type hint만 추가하거나 수정하는ALTER TABLE ... MODIFY COLUMN json JSON(path TypeName)은 과거 데이터를 다시 쓰지 않고 메타데이터 전용 작업으로 즉시 완료됩니다. type hint는 기존 파트에는 쿼리 시점에 적용되며, INSERT 및 백그라운드 머지 중에 구체화됩니다. #97412 (tanner-bruce). polyglot라이브러리를 사용해 외부 SQL 방언을 지원하도록 했습니다. #99496 (Alexey Milovidov).- 조인 재정렬에 사용되는 통계를 무작위화하는
query_plan_optimize_join_order_randomize설정을 추가했습니다. 테스트에 유용합니다. #100643 (Vladimir Cherkasov). - ClickHouse에 AI 함수 지원을 추가하여 SQL을 사용해 OpenAI 및 Anthropic 엔드포인트를 호출할 수 있도록 했습니다.
aiGenerate는 그 첫 번째 함수입니다. #100831 (George Larionov). - ClickHouse에서 LLM API를 활용할 수 있도록 AI 함수
aiClassify,aiExtract,aiTranslate를 추가했습니다. #100832 (George Larionov). - Azure 기반 데이터 레이크에 대한 Delta Kernel 지원을 추가했습니다. #102202 (Smita Kulkarni).
성능 개선
JOIN 성능
HashJoin및ConcurrentHashJoin에 소규모 개선 사항이 적용되었습니다. #96663 (Yarik Briukhovetskyi).- 옵티마이저 통계를 기반으로
ANTI,SEMI,FULL조인의 양쪽 입력을 스왑할 수 있도록 지원을 추가했습니다. #97498 (Hechem Selmi). - 쓰기 전에
JoinUsedFlags가 설정되었는지 확인하여RIGHT및FULL조인에서 캐시 경합을 줄였습니다. #99274 (Hechem Selmi). - direct-index 해시 테이블을 사용해 값 범위가 작은
Int32및Int64키에 대한 해시 조인 속도를 높였습니다. #99275 (Hechem Selmi).
쿼리 최적화
- 큰 다각형에 대한
pointInPolygon의 granule 스키핑을 최적화하고, 이전에 프라이머리 키 프루닝 중 예외를 발생시키던pointInPolygon인덱스 분석 문제를 수정했습니다. #91633 (Nihal Z. Miaji). - 이제 프로젝션을 읽을 때
optimize_read_in_order설정이 적용됩니다. #95885 (Andrey Zvonov). - 텍스트 인덱스 딕셔너리에서 데이터를 읽는 과정을 소폭 최적화하여 텍스트 인덱스 분석의 전반적인 성능을 개선했습니다. #97519 (Anton Popov).
- 인덱싱된 컬럼과 인덱싱되지 않은 컬럼이 함께 포함된 결합 조건이 있는 쿼리에서 텍스트 인덱스 분석 성능을 개선했습니다. 이전에는 이런 경우 인덱스 분석 중 조기 종료 최적화가 잘못 비활성화되었습니다. #98096 (Anton Popov).
- 매우 긴 배열 또는 맵을 생성하는 상수 표현식이 있는 쿼리의 성능을 개선했습니다. #98287 (Alexey Milovidov).
DateTime64프라이머리 키를 정수 상수와 비교할 때의 키 조건 분석을 수정했습니다. 이전에는 이런 경우 granule 프루닝이 전혀 수행되지 않았습니다. #98410 (Amos Bird).- 이제
optimize_syntax_fuse_functions설정이 기본적으로 활성화됩니다. #98424 (Alexey Milovidov). - 이제 프레디케이트에 비교 연산자(
=,<,>,!=)가 포함되고 파티션 키가 결정적 함수 체인으로 감싸져 있으면 파티션 프루닝이 허용됩니다(예:PARTITION BY x인 경우cityHash64(x) % 5 > 2,toYYYYMM(x) < 2026,toYYYYMM(x) = 2026,toYYYYMM(x) != 2026같은 프레디케이트는 모두 파티션 키를 사용해 프루닝합니다). #98432 (Nihal Z. Miaji). - 이제
CAST대상 유형이Nullable이고 변환이 단조적이면 read-in-order 최적화와 프라이머리 키 프루닝이 허용됩니다. 예를 들어PRIMARY KEY x일 때 ClickHouse는ORDER BY x::Nullable(UInt64)에는 read-in-order 최적화를,WHERE x::Nullable(UInt64) > 500000같은 프레디케이트에는 프라이머리 키 프루닝을 사용할 수 있습니다. #98482 (Nihal Z. Miaji). - 정수형 컬럼을 부동소수점 리터럴과 비교할 때 이제 인덱스 프루닝과 필터 pushdown이 허용됩니다. 예를 들어
WHERE x < 10.5같은 프레디케이트는 이제 프라이머리 키를 사용해 프루닝할 수 있으며,prime < 1e9또는number < 1e5같은 필터는 무제한 실행을 유발하는 대신primes()및numbers()테이블 함수로 pushdown됩니다. #98516 (Nihal Z. Miaji). ^(abc-1|abc-2)와 같이 리터럴 문자열에 대한 정규식 대안을 사용해 MergeTree 프라이머리 키 컬럼을 필터링하는 쿼리는, 대안들이 공통 접두사를 공유하는 경우 이제 프라이머리 키 프루닝을 사용할 수 있습니다. #98988 (Yash).INTERSECT ALL과EXCEPT ALL을 최적화했습니다. #99097 (Raufs Dunamalijevs).- 역순 읽기에 대해
read_in_order_use_virtual_row최적화 지원을 추가했습니다. #99198 (Vladimir Cherkasov). - 단일 딕셔너리를 사용하는
LowCardinality컬럼의 불연속 쿼리 성능을 개선했습니다. #99285 (Ivan Babrou). - 코어 수가 많은 머신에서 집계가 포함된 짧은 쿼리의 성능이 오히려 떨어지던 문제를 수정했습니다. 쿼리가 적은 수의 마크를 읽는 경우, 이제 파이프라인이 집계 후
max_threads까지 확장되지 않으므로 대부분 비어 있는 스트림으로 인한 오버헤드를 줄입니다. #99493 (Alexey Milovidov). - 읽기 작업 크기를 적절히 선택하여 병렬 레플리카를 사용하는 쿼리의 성능을 개선했습니다. #99801 (Nikita Taranov).
ORDER BY접두사에 모든GROUP BY키가 포함되면, 중복된 후행ORDER BY요소를 제거하도록 했습니다. #100157 (Alexey Milovidov).LIMIT절을UNION ALL내부로 푸시다운하여 쿼리를 최적화했습니다. #100364 (Alexey Milovidov).ORDER BY에서String및FixedString컬럼 비교를 위한 JIT 컴파일 지원을 추가하여, 문자열 비중이 높은 정렬 키에서 머지 단계의 정렬 성능을 6–17% 개선했습니다. #100577 (Raúl Marín).- 새로운
read_in_order_use_virtual_row_per_block설정과 함께read_in_order_use_virtual_row를 활성화하면, 이제 MergeTree에서 각 block을 읽은 뒤 가상 행 경계 정보가 출력됩니다. 이를 통해WHERE/PREWHERE/JOIN으로 데이터가 완전히 필터링된 파트에 대해 머지가 스트림 중간에 소스 우선순위를 다시 조정할 수 있습니다. #100603 (Vladimir Cherkasov). - 병렬 레플리카로 실행되는 단순 뷰(기반 MergeTree 테이블 위)의 쿼리를 더 효율적으로 병렬화하도록 개선했습니다. #100815 (Igor Nikonov).
parallel_replicas_allow_view_over_mergetree=1일 때 단순 뷰(MergeTree테이블 위의 적격한UNION ALL뷰 포함)에 대한 병렬 레플리카 지원을 추가했습니다. 이 경우 내부 쿼리가 아니라 뷰의 외부 쿼리를 병렬화하므로, 노드 전반에서 쿼리 병렬화가 향상됩니다. #100958 (Igor Nikonov).- 쿼리 계획에
IN필터가 포함된 경우full_sorting_merge에서 프라이머리 키 순서 읽기를 최적화했습니다. #101261 (Nikita Taranov). - 값이 이스케이프된 문자열(예:
'{\'key\':1}')로 전달될 때Map,Array,Tuple컬럼의INSERT VALUES성능을 개선하여 SQL 표현식 파서로의 불필요한 폴백을 방지했습니다. #102119 (Joanna Hulboj).
함수 및 집계 성능
levenshteinDistance함수의 성능을 개선했습니다. #94543 (Joanna Hulboj).- 요소별 함수 호출을 피하도록 배치 Decimal 유형 변환을 최적화했습니다. #95923 (Konstantin Bogdanov).
LIKE쿼리의 성능을 개선했습니다. #98149 (Elmi Ahmadov).- aggregate state를 통한 행별 store-forwarding 대신 로컬 누산기를 사용해
avgWeighted집계 함수를 최적화했으며,Nullable입력에서 성능이 최대 27% 향상되었습니다. #98793 (Antonio Andelic). - 내부 루프를 디버추얼라이즈하여
Float64컬럼에 대한var*Stable및stddev*Stable함수의 속도를 높였습니다. 이에 따라 부동소수점 결과를 ULP 수준에서 바꿀 수 있는 컴파일러 최적화(FMA/레지스터)가 가능해집니다. #99460 (Riyane El Qoqui). - 32/64바이트 입력에 대해 최적화된 Firedancer base58 인코딩을 사용하도록 했으며(
base58Encode에는 자동 적용), 디코딩 결과가 32/64바이트인 경우 최적화된 base58 디코딩도 사용할 수 있도록 했습니다(base58Decode('...', 32)로 명시). #99461 (Joanna Hulboj). - 불필요한 메모리 shift를 제거해
cutURLParameter함수를 최적화했습니다. #100218 (Nikita Semenov). - dragonbox 호환 반올림을 적용해
itoafast path를 확장함으로써, 큰 정수값에 대한 float-to-string 변환 속도를 높였습니다. #100649 (Raúl Marín). - dragonbox를 zmij로 대체해 float-to-string 변환 속도를 1.5배~3배 높였습니다. #100650 (Raúl Marín).
- 소프트웨어 나눗셈을 Barrett reduction으로 대체하고 변환 루프를 언롤링해
Int128/UInt128의 문자열 변환 속도를 높였습니다. #100671 (Raúl Marín). UniqExactSet병렬 머지에서 불필요한 스레드 생성을 방지했습니다. #100686 (Jiebin Sun).UniqExactSet에 배치 병렬 머지를 추가했습니다. #100687 (Jiebin Sun).
스토리지 및 I/O 성능
- 완료된 뮤테이션이 있는 ReplicatedMergeTree 테이블에서 읽기 전용 작업 중 발생하는 lock 경합을 줄였습니다. #95771 (Eduard Karacharov).
- 이제 Iceberg는 테이블 생성 시
iceberg_metadata_async_prefetch_period_ms를 설정해 메타데이터를 캐시에 비동기적으로 미리 채울 수 있습니다. 이제 Iceberg 테이블에 대한SELECT쿼리에서iceberg_metadata_staleness_ms매개변수를 지정할 수 있으며, 이를 통해 메타데이터가 지정된 staleness보다 최신이면 ClickHouse가 캐시된 메타데이터 버전을 사용하고, 그렇지 않으면 최신 메타데이터를 가져오기 위해 원격 Iceberg 카탈로그를 조회합니다. 이를 통해 요청 처리 중 Iceberg 카탈로그 호출을 없앨 수 있어 눈에 띄는 성능 향상을 기대할 수 있습니다. #96191 (Arsen Muk). - 이제 S3Queue ordered 모드는 S3
ListObjectsV2StartAfter를 사용해 전체 prefix 이력을 다시 나열하지 않으므로ListObjects호출 수를 줄입니다. #96370 (Venkata Vineel). - YTsaurus 테이블 엔진에서 병렬 읽기를 지원합니다. #97343 (MikhailBurdukov).
- 데이터 레이크의 성능을 개선했습니다. 이전 버전에서는 객체 스토리지에서 읽을 때 파이프라인 크기가 처리 스레드 수에 맞게 조정되지 않았습니다. #99548 (Alexey Milovidov).
- 사용자 공간 페이지 캐시를 통해 원격 파일을 읽을 때 프리페치를 허용했습니다. #99919 (Alexey Milovidov).
deduplicate_insert=enable일 때(26.2부터 기본값) 발생하던 중대한 INSERT 성능 회귀를 수정했습니다. 이를 위해 데이터 hash 계산을 squashing 단계가 아니라 싱크 단계로 미루고,updateHashWithValueRange를 사용한 배치 컬럼 hashing을 적용해 22개 컬럼으로 이루어진 500만 행 기준 오버헤드를 약 2.5초에서 약 0.5초로 줄였습니다. #101494 (Sema Checherinda).
메모리 최적화
- 동기 삽입에서는 메모리 절약을 위해 이제 원본 블록(중복 제거에 필요함)을 생략할 수 있습니다. #96661 (Sema Checherinda).
- 특정 시나리오에서 병렬 윈도우 함수와 대규모 배열을 사용하는
arrayFold워크로드의 성능이 개선되고 메모리 사용량이 줄었습니다. 또한 해당 쿼리에서 페이지 폴트 부담을 줄이고, 엄격한 메모리 제한하에서 안정성을 높일 수 있습니다. #98892 (filimonov).
개선 사항
쿼리 및 SQL
- 이제 뷰에서 집계 프로젝션이 올바르게 지원됩니다. #88798 (Amos Bird).
optimize_aggregators_of_group_by_keys가 이제GROUPING SETS쿼리에서 집계 함수를 올바르게 최적화합니다. #93935 (Xiaozhe Yu).join_use_nulls사용 시OUTER를INNER조인 최적화로 변환하는 기능이 추가되었습니다. #95968 (Vladimir Cherkasov).cast_keep_nullable가Dynamic/JSON타입에서도 동작하도록 확장되었습니다. 이 설정이 적용되면Nullable이 될 수 있는 타입에서NULL을 캐스팅할 때NULL을 반환하며, 그렇지 않으면NULL에서CANNOT_INSERT_NULL_IN_ORDINARY_COLUMN오류가 발생합니다. #96504 (Seva Potapov).CREATE USER에ROLE절이 추가되었습니다. #97074 (Vitaly Baranov).- 지연된 필터에 대한 정보가
EXPLAIN쿼리 출력에 별도 항목으로 추가되었습니다(FINAL과 함께 row policies/PREWHERE를 사용할 때). #97374 (Yarik Briukhovetskyi). FROM절에서 괄호로 묶은 테이블 조인 표현식을 지원합니다. 예:SELECT * FROM (t1 CROSS JOIN t2). #97650 (Alexey Milovidov).- 분산 인덱스 분석 중 데이터 스키핑 인덱스를 적용합니다. #97767 (Azat Khuzhin).
- 이제 테이블의 정렬 키는
toDate(time)와 같은 표현식이 될 수 있으며, 이러한 표현식을 지연하지 않을지에 대한 결정은 해당 표현식이 필터의 일부일 때 내려집니다. #98237 (Yarik Briukhovetskyi). - 이제 조인 순서 최적화기가 기존 조인 조건에서 전이적 동등 조인 프레디케이트를 추론합니다. 예를 들어
A.x = B.x AND B.x = C.x가 주어지면A.x = C.x라는 동치 관계를 인식하여, 최적화기가 전이적으로 연결된 테이블 간 Direct JOIN을 고려할 수 있습니다. 이를 통해 스타 및 스노우플레이크 스키마에서 계획 품질이 향상될 수 있습니다. 이 기능은 새로운enable_join_transitive_predicates설정으로 제어되며 기본적으로 비활성화되어 있습니다. #98479 (Alexander Gololobov). apply_row_policy_after_final또는apply_prewhere_after_final이 활성화되면, 이제 row policies와PREWHERE의 복합AND조건을 분해해 프라이머리 키 인덱스 분석용 정렬 키 원자를 추출합니다. 이전에는 지연된 필터에 정렬 키 프레디케이트와 비정렬 키 프레디케이트가 혼합되어 있으면(예:x > 1 AND y != 'foo') 전체 표현식이 인덱스 분석에서 제외되었습니다. #98513 (Yarik Briukhovetskyi).- 이제 “alive”(연결 가능한) 레플리카만 분산 인덱스 분석에 참여합니다. #98521 (Azat Khuzhin).
- 자동 병렬 레플리카 휴리스틱에 사용되는 노드 수를 실제 클러스터의 노드 수로 제한했습니다(
max_parallel_replicas설정만 기준으로 하지 않음). #98668 (Nikita Taranov). - 분산 인덱스 분석을 위해 헤지드 요청과 비동기 읽기를 구현했습니다. #98724 (Azat Khuzhin).
- 분산 인덱스 분석에서
SAMPLE절 지원이 추가되었습니다. #98931 (Azat Khuzhin). multiply에 단조성 지원이 추가되어key * constant표현식에 대해 프라이머리 키 프루닝이 가능해졌습니다. #98983 (Amos Bird).- 분석기 오류 메시지에서 더 이상 테이블의 모든 컬럼을 덤프하지 않습니다(기존에는 150KB+ 크기의 예외가 생성될 수 있었습니다). 이제 컬럼 목록은 최대 10개로 제한됩니다. #99002 (Yash).
- 조인이 포함된 하위 쿼리의 컬럼 통계가 이제 올바르게 반환되므로, 상위 쿼리에서 이를 조인 재정렬에 사용할 수 있습니다. #99096 (Alexander Gololobov).
- 이제 컬럼 유형을 지정하지 않아도
ALTER TABLE MODIFY COLUMN x TTL ...을 사용할 수 있습니다. #99208 (Nikolay Degterinsky). EXPLAIN PLAN pretty=1출력이 개선되었습니다. 최상위 쿼리의 출력 컬럼을 표시하고, 예상 결과 행 수 및 로컬리티와 함께 조인 릴레이션 레이블/기호를 보여주며, 조인/소스 단계별 출력 컬럼도 포함합니다. #99462 (Kirill Kopnev).- 모든 기반 분산/원격 테이블에 존재하지 않는 컬럼을 쿼리할 때
merge()테이블 함수가UNKNOWN_IDENTIFIER오류로 실패하던 문제가 수정되었습니다. #99833 (Alexey Milovidov). - 조건이 CNF가 아닐 때는 옵티마이저에서 더 이상
ConditionSelectivityEstimator를 사용하지 않습니다(예:where a = 0처럼 통계가 도움이 되지 않는 단일 조건). #100110 (Han Fei). - 이제 파티션 프루닝 후에
distributed_index_analysis_min_indexes_bytes_to_activate가 적용됩니다. #100477 (Azat Khuzhin). - 이제
EXPLAIN PIPELINE이 원격 파이프라인 조각도 포함할 수 있도록distributed=1설정을 지원합니다. #100513 (Nikita Taranov). - 이제
use_partition_pruning = 0은 파티션 키 기반 프루닝을 비활성화할 뿐 아니라, 파티션 키 컬럼에 대한MinMax인덱스 프루닝과 count 최적화도 비활성화합니다. #100904 (Nihal Z. Miaji). - 이제
EXPLAIN [PLAN] pretty=1이 표현식을 사람이 읽기 쉬운 형태로 출력합니다. #100927 (Kirill Kopnev). - 이제
accurateCastOrNull과accurateCastOrDefault가널 허용요소를 포함한 중첩튜플을 비롯해Tuple대상 타입을 지원합니다. 이전에는Tuple이Nullable내부에 올 수 없었기 때문에 이 함수들이Tuple대상을 거부했습니다. #100942 (Nihal Z. Miaji). - 이제
SELECT쿼리 앞의WITH절에서 후행 쉼표를 사용할 수 있습니다. #101093 (Aruj Bansal). - 프레디케이트의 선택도가 충분히 높을 때, FINAL이 있는 ReplacingMergeTree에서 컬럼을 지연 머티리얼라이즈하도록 구현했습니다. #101647 (Nikolai Kochetov).
- 통계 정보가 없는 조건의 기본 선택도 추정값을 업계 표준 휴리스틱에 맞게 개선했습니다.
LIKE조건의 선택도는 0.1, 알 수 없는 조건의 선택도는 0.33으로 추정합니다. #101653 (Alexander Gololobov). - VIEW에 더 많은 최적화를 적용할 수 있도록 쿼리 트리에서 VIEW 서브쿼리를 인라인화했습니다. #100830 (Dmitry Novik).
함수
- 이제
JSONExtract함수에서 네이티브 JSON/Object 입력을 사용할 수 있습니다. #96711 (Fisnik Kastrati). - 와일드카드 의미를 고려해
LIKE패턴을 토큰화하는tokensForLikePatternSQL 함수가 도입되었습니다.%와_는 와일드카드로 처리되고, 이스케이프된 와일드카드(\%,\_)는 리터럴로 처리되며, 이스케이프되지 않은 와일드카드에 인접한 토큰은 제외됩니다. #97872 (Amos Bird). - 지정된 날짜가 속한 월의 일 수를 반환하는
toDaysInMonth()함수가 구현되었습니다. #99227 (Vitaly Baranov). unicodeWord토크나이저의 이름이asciiCJK로 변경되었습니다. #100956 (George Larionov).- SQL 표준
OVERLAY함수 구문에 대해 파서 수준의 문법적 편의 구문이 추가되었습니다.overlay함수는 이미 존재하며, 이번 변경으로PLACING,FROM,FOR를 구분자로 사용하는 키워드 기반 형식도 지원합니다. #101681 (Desel72). - 이제
ngrams함수는 유효하지 않은 ngram 길이를 거부합니다. 예를 들어SELECT ngrams('abc', 0)는 이제 오류를 반환합니다. #101922 (Robert Schulze). LIKE최적화에array토크나이저 지원이 추가되었습니다. #102880 (Elmi Ahmadov).
테이블 엔진 및 스토리지
- 높은 머지 부하에서 정리 지연을 방지하기 위해 MergeTree 전용 cleanup 스레드를 추가했습니다. #91574 (Amos Bird).
- 이제
DELETE TTL규칙이 있는 테이블에서도 수직 병합 알고리즘을 사용할 수 있습니다. #97332 (murphy-4o). - 이제
prewarm_mark_cache설정이 활성화되면 보조 인덱스의 마크도 예열됩니다(데이터 파트 fetch 중 및 테이블 시작 시 인덱스 마크 캐시에 로드됨). #97772 (Anton Popov). - 이제 텍스트 인덱스를
Nullable([Fixed]String)및Array(Nullable([Fixed]String))컬럼에 생성할 수 있습니다. #98118 (Jimmy Aguilar Mena). - ordinary shared merge tree에서
DROP DATABASE수행 시 백그라운드 머지를 조기에 취소합니다. #98161 (Shaohua Wang). - INSERT 중 프로젝션 파트를 동기적으로 완료할 수 있도록
finalize_projection_parts_synchronously설정을 추가했습니다. 이를 통해 프로젝션이 많은 테이블에서 피크 메모리 사용량을 줄이면서도, 기본적으로는 기존 비동기 동작을 유지합니다. #98228 (Amos Bird). share_nested_offsetsMergeTree 설정(기본값true)을 추가했습니다. 이 값을false로 설정하면 점 표기 이름(예:n.a,n.b)을 가진 배열 컬럼은 레거시 Nested 의미 체계에 따라 오프셋 파일을 공유하고 배열 크기가 같은지 검증하는 대신, 서로 독립적인 컬럼으로 처리됩니다. #98416 (Amos Bird).- 머지를 병렬로 미리 취소하도록 하여
TRUNCATE DATABASE TABLES LIKE를 최적화했습니다. #98597 (Shaohua Wang). - 잠금을 획득하지 않고 태스크 리소스를 해제하도록 하여
MergeTreeBackgroundExecutor의 잠금 경합을 줄였습니다. #98604 (Dmitry Novik). - 이제
TRUNCATE DATABASE도 쿼리 취소에 응답합니다. #98828 (Shaohua Wang). - merge tree 설정을 변경한 후 statistics cache를 다시 시작하도록 했습니다. #98520 (Han Fei).
- Compact 파트 내에서 압축된 블록을 구성하는 방식을 제어하는
compress_per_column_in_compact_partsMergeTree 설정을 추가했습니다.true(기본값, 현재 동작 유지)인 경우 각 컬럼이 새 압축 블록에서 시작하므로 선택적 압축 해제가 가능합니다.false인 경우 하나의 granule 내 모든 컬럼이 같은 압축 블록에 함께 저장되므로, 항상 모든 컬럼을 읽는 workload에서 압축률과 읽기 성능이 향상됩니다. #101114 (Amos Bird). - 텍스트 인덱스는 이제 일반 제공 상태이며,
compatibility설정과 관계없이 계속 활성화됩니다. 이에 따라 백업 복원 중이거나 호환성 모드로 실행할 때 예기치 않게 비활성화되는 일을 방지합니다. #101518 (Nikita Fomichev). IN연산자와 함께mapValues(map)에 생성된 텍스트 인덱스를 지원합니다. #99286 (Anton Popov).- 동일한 쿼리에서 동시에 사용되는 여러 텍스트 인덱스에 대한 분석을 개선했습니다. 이제 텍스트 인덱스의 직접 읽기 최적화에
use_skip_indexes_on_data_read설정이 더 이상 필요하지 않습니다. #102255 (Anton Popov). HINT모드를 통해hasPhrase함수에 대한 text index 분석 지원이 추가되었습니다. #102438 (Elmi Ahmadov).- 이제 MinMax 컬럼 통계는 최소값과 최대값을
Float64대신Field(타입 포함)로 저장합니다. 직렬화된 포맷에는 값과 함께 컬럼 타입 이름도 포함됩니다. 통계 파일 버전은 V2로 올라갔으며, 이전 버전에서 작성된 파일은 재구체화가 필요합니다(ALTER TABLE ... MATERIALIZE STATISTICS ALL). #100605 (Han Fei).
데이터 레이크
DataLakeCatalog의 상태를 확인하기 위한 새 쿼리를 추가했습니다. #94690 (Smita Kulkarni).- Unity 카탈로그용 Iceberg 쓰기를 개선했습니다. #98162 (Konstantin Vedernikov).
- 코드 유지 관리 시 오류가 발생할 가능성을 줄이기 위해
IcebergManifestFile의 엔터티를 재구성했습니다(일부 manifest 파일 캐싱 문제도 함께 수정). #98231 (Daniil Ivanik). - Iceberg
ALTER TABLE ... EXECUTE expire_snapshots(...)의 인수 지원을 확장했습니다. #99130 (murphy-4o). - 카탈로그를 사용하는 Iceberg 삽입 인터페이스를 변경했습니다.
storage_catalog_type,storage_aws_access_key_id및 유사한 설정은 Deprecated 처리했습니다. #100334 (Konstantin Vedernikov). - 스토리지 경로와 메타데이터 경로를 혼용해 발생하던 Iceberg의 일관되지 않은 경로 처리 문제를 수정했습니다. 또한 Iceberg 테이블이 URL 또는 절대 경로 형태의 테이블 위치만 기록하도록 강제하고, Azure에서 파일 크기를 계산하기 위한 폴백을 추가했으며, Spark와 호환되는 방식으로
version-hint.txt를 처리하고, 경로 타입을 서로 혼동하기 어렵도록 타입 수준 추상화를 도입했으며, position delete 사용도 수정했습니다. #100420 (Daniil Ivanik). show_data_lake_catalogs_in_system_tables가 비활성화된 경우 “Maybe you meant …” 테이블 힌트를 위해 원격 데이터 레이크 카탈로그 전체를 스캔하지 않도록 했습니다. #100452 (Alsu Giliazova).- 이제 Iceberg 데이터 파일을 파싱하는 데 사용되는 객체 정보에 manifest 파일에서 파싱한 파일 행 수와 바이트 단위 파일 크기가 포함됩니다. #100645 (Daniil Ivanik).
- 가상 컬럼(virtual columns)을 사용하는 Delta Lake 프루너를 추가했습니다. #101634 (Konstantin Vedernikov).
S3 및 객체 스토리지
- 테이블의 컬럼 정의 해시를 S3 경로에 삽입하는 S3 테이블 엔진용
{_schema_hash}placeholder를 추가했습니다. #98265 (Miсhael Stetsyuk). - S3 엔드포인트에 virtual/path 스타일을 강제하는 새 옵션을 추가했습니다. #102378 (Konstantin Vedernikov).
설정 및 구성
- 이제
users_xml구성에서 여러 인증 메서드를 지정할 수 있습니다. #91998 (Flip-Liquid). - 이제 복제된 데이터베이스로 생성된 cluster에 대해
internal_replication설정을 지정할 수 있습니다. #97228 (Pervakov Grigorii). allow_nullable_tuple_in_extracted_subcolumns설정이 추가되었습니다. 이 설정은Tuple,Variant,Dynamic,JSON에서 추출한Tuple(...)서브컬럼을Nullable(Tuple(...))로 반환할지(누락된 행은NULL) 또는Tuple(...)로 반환할지(누락된 행은 기본 tuple 값) 제어합니다. 기본적으로 비활성화되어 있으며, server를 재시작해야만 변경할 수 있습니다. #97299 (Nihal Z. Miaji).- 이제
type_json_allow_duplicated_key_with_literal_and_nested_object가 기본적으로 활성화되어, ClickHouse가 원본 데이터{"a" : 42, "a.b" : 42}에서 생성할 수 있는{"a" : 42, "a" : {"b" : 42}}와 같은 JSON을 파싱할 때 발생하는 중복 키 관련 오류를 방지합니다. #97423 (Pavel Kruglov). - 컬럼 통계(column statistics)는 이제 일반 제공 상태입니다.
allow_experimental_statistics설정(기본값false)은allow_statistics(기본값true)로 대체되어 더 이상 사용되지 않으며,allow_statistics_optimize는 beta에서 일반 제공으로 승격되었고, ClickHouse는 새 컬럼에 대해minmax및uniq통계를 생성합니다(MergeTree settingauto_statistics_types). 또한 INSERT 성능 저하를 방지하기 위해materialize_statistics_on_insert는 이제 기본적으로 비활성화됩니다. #97487 (Han Fei). enable_parallel_replicas와automatic_parallel_replicas_mode의 관계를 명확히 했습니다. 쿼리는enable_parallel_replicas > 0인 경우에만 병렬 레플리카를 사용할 수 있습니다.automatic_parallel_replicas_mode=1이면 수집된 통계를 기반으로 계획 단계에서 결정되며,automatic_parallel_replicas_mode=0이면 통계와 관계없이 지원되는 모든 쿼리에 병렬 레플리카가 사용됩니다. 병렬 레플리카를 사용하는 Distributed insert-select는 항상automatic_parallel_replicas_mode=0인 것처럼 동작합니다. #97517 (Nikita Taranov).- impersonate 기능(EXECUTE AS target_user)이 기본적으로 활성화되었습니다. #97870 (Vitaly Baranov).
access_control_improvements.disallow_config_defined_profiles_for_sql_defined_users설정이 추가되었습니다(기본적으로 허용됨). 이 설정은 SQL로 정의된 사용자에 대해 구성에서 정의된 settings profiles(defaultprofile 제외)을 사용하는 것을 금지합니다. #98662 (Alexander Tokmakov).Variant및Dynamic의 타입 불일치 시 동작을 제어하는 설정이 추가되었습니다(throw또는 null 반환). #99085 (Bharat Nallan).- 실행형 UDFs의 기본
stderr_reaction이throw에서log_last로 변경되었습니다. stderr에 경고를 기록하는 UDFs는 이제 종료 코드가 0이면 더 이상 실패하지 않으며, 종료 코드 예외에는 이제 stderr 내용이 포함됩니다. #99232 (Xu Jia). input_format_column_name_matching_mode설정이 추가되어 입력 형식별로 서로 다른 대소문자 구분 방식을 사용할 수 있습니다. #99346 (manerone).- 시스템 테이블에는 자동 통계가 더 이상 활성화되지 않습니다. 이들에서는 자동 통계의 효과가 거의 없기 때문입니다. #102862 (Han Fei).
시스템 테이블과 모니터링
- 쿼리 실행 중 사용된 데이터 스키핑 인덱스가 이제
system.query_log의 새로운skip_indices컬럼에 기록됩니다. #99793 (Grant Holly). system.part_log에projections_duration_ms컬럼이 추가되었으며, 이 컬럼에는 프로젝션별 머지/재구축 소요 시간이 밀리초 단위로 기록됩니다. #98292 (Amos Bird).information_schema.tables에 컬럼 별칭INDEX_LENGTH가 추가되었습니다. #101705 (Robert Schulze).information_schema.tables는 이제 비활성 테이블 파트를 무시하므로, 표시되는 테이블 크기 값이 더 현실적으로 나타납니다. #101706 (Robert Schulze).
ClickHouse Keeper
find_super_nodes가 더 이상 첫 번째 슈퍼 노드의 하위 항목을 순회하다가 멈추지 않으므로, 2개 이상의 슈퍼 노드를 찾을 수 있게 되었습니다. #97819 (pufit).- 전송 스레드가 종료될 때까지 기다리는 대신, 종료 처리가 시작되면 즉시 ZooKeeper 세션을 만료된 상태로 표시합니다. 이를 통해 다른 스레드가 지연 없이 새 세션을 생성할 수 있습니다. #99102 (Raúl Marín).
- 이미 연결이 끊어진 세션에 대한 오래된 Keeper 요청을 건너뛰어 불필요한 Raft 왕복을 방지합니다. 추적하는 완료된 세션 수는
max_finished_sessions_cache_sizecoordination 설정으로 제한됩니다. #99246 (Antonio Andelic). - 잠금 경합으로 인해 Keeper
mntr명령이 멈추는 문제를 방지합니다. #99472 (Antonio Andelic). - 콜백 호출과 읽기 요청 디스패치를 뮤텍스 범위 밖에서 수행하도록 해 Keeper 디스패처의 잠금 경합을 줄였으며, 관측성을 위해 프로파일링된 잠금 가드도 추가했습니다. #99751 (Antonio Andelic).
메모리 관리
- 캐시 아레나의 분리를 제어하기 위한
use_separate_cache_arena구성 매개변수를 추가했습니다. #100664 (Seva Potapov).
데이터 포맷
- 텍스트 출력 형식에서
FixedString값 뒤의 null byte를 제거하는output_format_trim_fixed_string설정이 추가되었습니다. #97558 (NeedmeFordev). - 동일한 컬럼에 서로 다른 Geo 타입이 포함된 GeoParquet 파일을 파싱할 수 있게 되었습니다. #97851 (Mark Needham).
- 이제 바이너리
AggregateFunctionstate를 역직렬화할 때 전체 입력을 모두 소비해야 합니다. 불필요한 후행 바이트가 추가로 있으면, 잘못된 state 데이터를 허용하는 대신 ClickHouse가 예외를 발생시킵니다. #98786 (Nihal Z. Miaji). - 이제 ClickHouse 인터벌 데이터 타입을 Arrow 형식으로 쓸 수 있습니다. #99519 (Peter Nguyen).
- Arrow 및 Parquet 포맷에서 UUID 데이터 타입을 가져오고 내보내는 네이티브 지원이 추가되었으며, 최상위 UUID에 대한 자동 논리 추론과 중첩 UUID에 대한 명시적 schema 힌트 지원이 포함됩니다. #99521 (Ivan).
- Parquet 파일의 마지막 block 끝에 padding이 누락되어도 허용하도록 개선되었습니다. #99857 (Seva Potapov).
- 이제 Arrow encoder를 통해 UUID를 Parquet로 내보낼 때 올바른 UUID 타입 annotation이 포함되므로, 파일을 다시 읽을 때
FixedString(16)데이터를 수동으로 cast할 필요가 없어졌습니다. #100150 (Ivan). - Apache Arrow
StringView및BinaryView데이터 타입을 ClickHouseString컬럼으로 가져오는 네이티브 지원이 추가되어 Arrow 기반 수집과의 호환성이 향상되었습니다. #100762 (Ivan). Arrow,ArrowStream,ORC, 그리고 레거시Parquet포맷에서Nullable(Tuple)지원이 추가되었습니다. #101272 (Nihal Z. Miaji).
이름이 지정된 컬렉션과 딕셔너리
- PostgreSQL 딕셔너리 소스에서 허용되는 키에
sslmode를 추가하여 PostgreSQL 딕셔너리 연결의 SSL 모드를 구성할 수 있게 했습니다(예: 기본적으로 SSL을 강제하는 AWS RDS). #98014 (mcalfin). - 딕셔너리 소스의 의존성인 이름이 지정된 컬렉션이 삭제되지 않도록 했습니다. #98127 (Pablo Marcos).
- 딕셔너리 속성으로
Map및JSON/Object타입을 지원하도록 추가했습니다. 이제 딕셔너리는 FLAT 및 HASHED 레이아웃 모두에서Map(String, String),Map(String, Array(String)),JSON,Nullable(JSON)을 포함한 복합 타입을 저장하고 조회할 수 있습니다. #98627 (yanglongwei). - 이제
SYSTEM RELOAD DICTIONARIES가 위상 순서대로 딕셔너리를 다시 로드하므로, 다른 딕셔너리를 소스로 사용하는 딕셔너리도 다시 로드 후 최신 데이터를 참조할 수 있습니다. #98356 (Alexey Milovidov). - 캐시 딕셔너리는 더 이상
hasKeys에서 exclusive lock을 사용하지 않으며, 캐시 읽기에는 shared lock을 사용해 lock 경합을 줄였습니다. #100796 (liuguangliang).
기타 개선 사항
- 사용자가 필요한 모든 컬럼을 볼 수 없는 경우
ACCESS_DENIED힌트에 더 이상 컬럼 이름이 표시되지 않으며, 데이터베이스/테이블 이름은 계속 힌트에 표시됩니다. #91067 (filimonov). - 임의 호스트의 IP가 아니라 로컬 server의 호스트명 IP가 변경되면 cluster 구성을 다시 로드합니다. #93726 (Zhigao Hong).
- 크래시 발생 시 비동기 로깅 버퍼를 플러시합니다. #97836 (Azat Khuzhin).
- access control 중 잠금 사용을 줄였습니다. #97894 (Nikita Taranov).
- ClickStack을 버전 2.20.0으로 업데이트했습니다. #98252 (Aaron Knudtson).
- server의 환경 변수 접근을 방지하기 위해 내장 클라이언트(SSH 및 WebSocket protocol)에서 AI SQL generation(
??명령)을 비활성화합니다. #100290 (Alexey Milovidov). - RabbitMQ storage 사용 시 손상된 메시지에 NACK를 반환합니다. #102157 (Seva Potapov).
버그 수정
모든 버그 수정 사항 (클릭하여 펼치기)
모든 버그 수정 사항 (클릭하여 펼치기)