하위 호환되지 않는 변경 사항
JSON 및 데이터 포맷 변경
스토리지 및 파티셔닝
함수 개선 사항
데이터 타입 개선 사항
성능 및 리소스 관리
- 이전에는
BACKUP 쿼리, 머지 및 뮤테이션이 로컬(max_local_read_bandwidth_for_server 및 max_local_write_bandwidth_for_server) 및 원격(max_remote_read_network_bandwidth_for_server 및 max_remote_write_network_bandwidth_for_server) 트래픽에 대해 서버 전역 스로틀러를 사용하지 않고, 전용 서버 설정(max_backup_bandwidth_for_server, max_mutations_bandwidth_for_server, max_merges_bandwidth_for_server)에 의해서만 속도가 제한되었습니다. 이제는 두 유형의 스로틀러를 동시에 사용합니다. #81753 (Sergei Trifonov).
- 기본적으로
true로 설정되면 cluster function에서 아카이브를 처리하는 성능을 높이는 새로운 설정 cluster_function_process_archive_on_multiple_nodes이 추가되었습니다. 이전 버전에서 아카이브와 함께 cluster function을 사용하는 경우, 25.7+로 업그레이드할 때 호환성을 유지하고 오류를 방지하려면 false로 설정해야 합니다. #82355 (Kseniia Sumarokova).
- 이전
concurrent_threads_scheduler의 기본값은 round_robin이었으나, 단일 스레드 쿼리(예: INSERT)가 많을 때는 공정하지 않은 것으로 확인되었습니다. 이번 변경으로 더 안전한 대안인 fair_round_robin scheduler가 기본값이 됩니다. #84747 (Sergei Trifonov).
- lazy materialization은 분석기와 함께 사용할 때만 활성화되며, 이는 분석기 없이 유지 관리해야 하는 상황을 피하기 위한 것입니다. 분석기 없이 사용할 경우 일부 문제가 발생할 수 있습니다(예: conditions에서
indexHint()를 사용하는 경우). #83791 (Igor Nikonov).
스키마 및 SQL 구문
- 삽입 가능한 컬럼이 없는 테이블은 생성할 수 없도록 합니다. #81835 (Pervakov Grigorii).
- 점이 포함된 식별자가 복합 식별자로 파싱되지 않도록, 기본 표현식에서는 해당 식별자를 backticks로 감싸야 합니다. #83162 (Pervakov Grigorii).
- PostgreSQL 스타일의 Heredoc 구문인
$tag$ string contents... $tag$를 지원합니다. 이는 dollar-quoted string literal이라고도 합니다. 이전 버전에서는 tag에 대한 제약이 더 적어 구두점과 공백을 포함한 임의의 문자를 사용할 수 있었습니다. 이로 인해 달러 문자로 시작할 수도 있는 식별자와 파싱 모호성이 발생했습니다. 한편 PostgreSQL은 tag에 단어 문자만 허용합니다. 이 문제를 해결하기 위해 이제 Heredoc tag에는 단어 문자만 포함할 수 있도록 제한합니다. #84731을 해결합니다. #84846 (Alexey Milovidov).
보안 및 권한
SYSTEM RESTART REPLICAS는 SHOW TABLES 권한이 있는 데이터베이스의 레플리카만 다시 시작합니다. 이전에는 해당 데이터베이스에 대한 접근 권한이 없어도, 테이블이 동시에 삭제되는 동안 이 쿼리로 Lazy 데이터베이스의 테이블이 깨어나는 문제가 있었습니다. #83321 (Alexey Milovidov).
azureBlobStorage, deltaLakeAzure, icebergAzure 함수는 이제 AZURE 권한을 올바르게 검증합니다. 이제 모든 cluster 변형 함수(-Cluster 함수)는 대응하는 비클러스터 함수 기준으로 권한을 확인합니다. 권한 오류를 방지하려면 -Cluster 함수를 호출하는 사용자에게 적절한 privilege가 부여되어 있는지 확인하십시오(예: GRANT S3 ON *.* TO user). 또한 icebergLocal 및 deltaLakeLocal 함수는 이제 FILE 권한 검사도 적용합니다. #84938 ([Nikita Mikhaylov](https://github.com/nikitamikhaylov
새 기능
데이터 타입
- 새 데이터 타입
Time ([H]HH:MM:SS) 및 Time64 ([H]HH:MM:SS[.fractional])와 함께, 일부 기본 CAST 함수와 다른 데이터 타입을 다루기 위한 함수가 추가되었습니다. 레거시 함수 ToTime와의 호환성을 위한 설정도 추가되었습니다. #81217 (Yarik Briukhovetskyi).
함수
NumericIndexedVector를 추가했습니다. 이 기능은 비트 슬라이싱 및 roaring-bitmap 압축을 기반으로 하는 새로운 벡터 데이터 구조이며, 생성, 분석, 원소별 산술 연산을 위한 20개 이상의 함수도 함께 제공합니다. 희소 데이터에서 Storage를 줄이고 조인, 필터, 집계 속도를 높일 수 있습니다. #70582와 VLDB 2024의 T. Xiong 및 Y. Wang의 "Large-Scale Metric Computation in Online Controlled Experiment Platform" paper를 구현합니다. #74193 (FriendLey).
- 재무 관련 함수를 추가했습니다:
financialInternalRateOfReturnExtended (XIRR), financialInternalRateOfReturn (IRR), financialNetPresentValueExtended (XNPV), financialNetPresentValue (NPV). #81599 (Joanna Hulboj).
- 두 Polygon이 교차하는지 확인하는 지리공간 함수
polygonIntersectsCartesian 및 polygonIntersectsSpherical를 추가했습니다. #81882 (Paul Lamb).
lag 및 lead 윈도우 함수를 지원합니다. #9887을 해결했습니다. #82108 (Dmitry Novik).
- sRGB와 OkLCH 색 공간 간 색상 변환을 위한 함수
colorSRGBToOkLCH 및 colorOkLCHToSRGB가 추가되었습니다. #83679 (Fgrtue).
- 이제
JSONExtractCaseInsensitive(및 JSONExtract의 다른 변형)을 사용해 대소문자를 구분하지 않는 JSON 키 조회를 할 수 있습니다. #83770 (Alistair Evans).
- 새로운 함수
nowInBlock64가 추가되었습니다. #84178 (Halersson Paris).
- DateTime 값을 UUIDv7로 변환하는
dateTimeToUUIDv7 함수를 추가했습니다. 사용 예시: SELECT dateTimeToUUIDv7(toDateTime('2025-08-15 18:57:56'))는 0198af18-8320-7a7d-abd3-358db23b9d5c를 반환합니다. #84319 (samradovich).
- 지정된 시작 timestamp, 종료 timestamp, 간격으로 정의된 시간 그리드에 맞춰 데이터를 리샘플링하고, 각각 PromQL과 유사한
deriv 및 predict_linear을 계산하는 timeSeriesDerivToGrid 및 timeSeriesPredictLinearToGrid 집계 함수를 추가했습니다. #84328 (Stephen Chi).
timeSeriesRange 및 timeSeriesFromGrid 함수를 추가했습니다. #85435 (Vitaly Baranov).
시스템 테이블
Iceberg 및 DeltaLake
MergeTree와 스토리지
- 이제
_table 가상 컬럼은 Merge type 테이블뿐 아니라 모든 테이블에서 지원됩니다. #63665 (Xiaozhe Yu).
Float32 및 Float64 유형의 컬럼에 대해, 손실이 있지만 오류 범위가 제한된 압축 코덱으로 SZ3가 추가되었습니다. #67161 (scanhex12).
MergeTree 계열 테이블에 경량 업데이트 지원이 추가되었습니다. 경량 업데이트는 새 구문 UPDATE <table> SET col1 = val1, col2 = val2, ... WHERE <condition>으로 사용할 수 있습니다. 또한 lightweight_delete_mode = 'lightweight_update'로 설정해 활성화할 수 있는, 경량 업데이트 기반의 경량한 삭제 구현도 추가되었습니다. #82004 (Anton Popov).
- MergeTree 계열 테이블에서
_part_granule_offset 가상 컬럼을 지원합니다. 이 컬럼은 각 행이 해당 data part 내에서 속한 granule/mark의 0부터 시작하는 인덱스를 나타냅니다. 이로써 #79572가 해결되었습니다. #82341 (Amos Bird).
프로토콜 및 클라이언트 지원
SQL 및 쿼리 기능
포맷
format_schema의 소스를 정의하는 format_schema_source 설정이 추가되었습니다. #80874 (Tuan Pham Anh).
- 새로운 출력 형식으로
Hash가 추가되었습니다. 이 형식은 결과의 모든 컬럼과 행에 대해 단일 해시 값을 계산합니다. 예를 들어 데이터 전송이 병목이 되는 사용 사례에서 결과의 "fingerprint"를 계산할 때 유용합니다. 예시: SELECT arrayJoin(['abc', 'def']), 42 FORMAT Hash는 e5f9e676db098fdb9530d2059d8c23ef를 반환합니다. #84607 (Robert Schulze).
서버 구성 및 워크로드 관리
클라우드 스토리지
AzureBlobStorage에서 client_id 및 tenant_id로 인증할 수 있도록 extra_credentials가 추가되었습니다. #84235 (Pablo Marcos).
Keeper
실험적 기능
테이블 엔진 및 테이블 함수
텍스트 인덱스 개선 사항
- 텍스트 인덱스 검색을 위한 범용 함수
searchAny와 searchAll을 추가했습니다. #80641 (Elmi Ahmadov).
- 이제 텍스트 인덱스에서
string 토크나이저를 지원합니다. #81752 (Elmi Ahmadov).
text 인덱스의 기본 인덱스 세분화 수준 값을 64로 변경했습니다. 이 변경으로 내부 벤치마크에서 평균적인 테스트 쿼리의 예상 성능이 향상됩니다. #82162 (Jimmy Aguilar Mena).
- 256비트 비트맵은 상태의 출력 레이블을 정렬된 순서로 저장하지만, 출력 상태는 해시 테이블에 나타나는 순서대로 디스크에 저장됩니다. 따라서 디스크에서 읽는 동안 레이블이 잘못된 다음 상태를 가리킬 수 있습니다. #82783 (Elmi Ahmadov).
- 현재 FST 트리는 디스크에 압축 없이 저장됩니다. 이로 인해 디스크에 쓰거나 디스크에서 읽을 때 성능이 저하되거나 더 높은 I/O 대역폭이 필요할 수 있습니다. #83093 (Elmi Ahmadov).
기능 성숙도 업데이트
성능 개선
쿼리 실행 및 집계
-If 집계 함수 조합자에 사소한 최적화를 적용했습니다. #78454 (李扬).
- 메모리 효율적인 집계 중 일부 버킷을 순서와 무관하게 전송할 수 있도록 하는 새로운 로직을 추가했습니다(설정
enable_producing_buckets_out_of_order_in_aggregation으로 제어되며, 기본적으로 활성화되어 있습니다). 일부 집계 버킷의 머지에 다른 버킷보다 훨씬 더 오래 걸릴 때, 그동안 initiator가 더 높은 버킷 ID를 가진 버킷을 머지할 수 있어 성능이 향상됩니다. 단점은 메모리 사용량이 다소 증가할 수 있다는 점이지만, 영향은 크지 않을 것으로 예상됩니다. #80179 (Nikita Taranov).
TOTALS 단계 이후의 파이프라인을 멀티스레드로 처리하도록 변경했습니다. #80331 (UnamedRus).
- 집계 쿼리에
NOT NULL 컬럼에 대한 COUNT() 함수 하나만 포함된 경우, 집계 로직이 해시 테이블 프로빙 중 완전히 인라인됩니다. 이로써 집계 state를 할당하고 유지할 필요가 없어져 메모리 사용량과 CPU 오버헤드가 크게 줄어듭니다. 이는 #81982를 부분적으로 해결합니다. #82104 (Amos Bird).
- 여러 문자열 또는 숫자 컬럼으로 그룹화할 때 직렬화된 키를 열 지향 방식으로 계산합니다. #83884 (李扬).
-If 조합자에 addManyDefaults를 구현했습니다. #83870 (Raúl Marín).
JOIN 최적화
- JOIN 입력 및 출력 블록의 최소 블록 크기(행 수 기준)를 제어하는 새로운 설정
min_joined_block_size_rows를 추가했습니다(min_joined_block_size_bytes와 유사하며 기본값은 65409). 조인 알고리즘이 이를 지원하는 경우 작은 블록은 병합됩니다. #81886 (Nikita Taranov).
- 키 컬럼이 1개뿐인 일반적인 경우 해시 맵을 추가로 순회하는 루프를 제거해
HashJoin 성능을 최적화했습니다. 또한 값이 항상 true/false인 경우 null_map 및 join_mask 검사도 제거했습니다. #82308 (Nikita Taranov).
- #82308의
null_map 및 JoinMask 최적화를 여러 OR 조건이 있는 JOIN에도 적용했습니다. 또한 KnownRowsHolder 데이터 구조도 최적화했습니다. #83041 (Nikita Taranov).
- 플래그에 접근할 때마다 해시를 계산하지 않도록 조인 플래그에 일반
std::vector<std::atomic_bool>를 사용합니다. #83043 (Nikita Taranov).
max_joined_block_rows를 해시 JOIN 메인 루프 밖에서 처리합니다. ALL JOIN의 성능이 소폭 향상됩니다. #83216 (Nikolai Kochetov).
HashJoin이 lazy 출력 모드를 사용할 때는 결과 컬럼에 대한 메모리를 사전에 할당하지 않습니다. 이는 특히 일치 개수가 적을 때 비효율적입니다. 또한 조인이 완료되면 정확한 일치 개수를 알 수 있으므로 더 정확하게 미리 할당할 수 있습니다. #83304 (Nikita Taranov).
- 오른쪽이 조인 키 컬럼에 의해 함수적으로 결정되는 경우(모든 행이 고유한 조인 키 값을 가짐), 모든
LEFT/INNER JOIN은 자동으로 RightAny로 변환됩니다. #84010 (Nikita Taranov).
Join 모드에서 patch parts 적용 성능을 개선했습니다. #85040 (Anton Popov).
분산 쿼리 개선 사항
- 블록의 압축/압축 해제 및 직렬화/역직렬화를 네트워크 연결당 단일 스레드가 아니라 파이프라인 스레드로 오프로드하는 옵션이 도입되었습니다. 이 기능은
enable_parallel_blocks_marshalling 설정으로 제어됩니다. 이 옵션은 initiator 노드와 원격 노드 사이에 상당한 양의 데이터를 전송하는 분산 쿼리의 속도를 높일 수 있습니다. #78694 (Nikita Taranov).
- 각 세그먼트에서
INSERT SELECT가 독립적으로 실행되는 모드에서는 병렬 분산 INSERT SELECT가 기본적으로 활성화됩니다. 자세한 내용은 parallel_distributed_insert_select 설정을 참조하십시오. #80425 (Igor Nikonov).
- 네이티브 프로토콜에서 로그와 profile events를 압축합니다. 100개 이상의 레플리카가 있는 클러스터에서는 비압축 profile events가 초당 1..10 MB를 차지하며, 느린 인터넷 연결에서는 진행 표시줄이 느리게 반응합니다. 이 변경으로 #82533 문제가 해결됩니다. #82535 (Alexey Milovidov).
- 각 세그먼트에서 INSERT SELECT가 독립적으로 실행되는 모드에서는 병렬 분산
INSERT SELECT가 기본적으로 활성화됩니다. 자세한 내용은 parallel_distributed_insert_select 설정을 참조하십시오. #83040 (Igor Nikonov).
- 병렬 레플리카의 최소 작업 크기 계산을 수정했습니다. #84752 (Nikita Taranov).
인덱스 개선 사항
- 벡터 유사성 인덱스를 사용하는 벡터 검색 쿼리는 저장소 읽기와 CPU 사용량이 줄어들어 더 짧은 지연 시간으로 완료됩니다. #79103 (Shankar Iyer).
- 인덱스로 필터링하는 다른 메서드와 동작을 맞추기 위해
filterPartsByQueryConditionCache에서 merge_tree_min_{rows,bytes}_for_seek를 반영합니다. #80312 (李扬).
- 세분화 수준이 더 높은 MinMax 인덱스를 먼저 처리합니다. #75381을 해결합니다. #83798 (Maruth Goyal).
- 이제
column이 Array 유형이 아닐 때 has([c1, c2, ...], column) 같은 조건에도 블룸 필터 인덱스를 사용합니다. 이로써 이러한 쿼리의 성능이 향상되어 IN 연산자만큼 효율적으로 처리됩니다. #83945 (Doron David).
- 파일 크기가 작은 순서대로 인덱스를 처리합니다. 그 결과, 인덱스 순서는 MinMax 인덱스와 벡터 인덱스(각각 단순성과 선택도 때문)를 우선하고, 이후에는 작은 인덱스를 우선합니다. MinMax/벡터 인덱스 내에서도 더 작은 인덱스를 우선합니다. #84094 (Maruth Goyal).
- 이전에는 텍스트 인덱스 데이터가 여러 세그먼트로 분리되었습니다(기본적으로 각 세그먼트의 크기는 256 MiB였습니다). 이렇게 하면 텍스트 인덱스를 빌드할 때 메모리 사용량을 줄일 수 있지만, 디스크 공간 요구량이 늘어나고 쿼리 응답 시간이 증가할 수 있습니다. #84590 (Elmi Ahmadov).
서브쿼리 최적화
- 동치 클래스를 사용해 중복
JOIN 연산을 제거함으로써 상관 서브쿼리에 대해 생성된 계획을 최적화했습니다. 상관 컬럼 전체에 대해 동등한 표현식이 있으면 query_plan_correlated_subqueries_use_substitution 설정이 활성화된 경우 CROSS JOIN이 생성되지 않습니다. #82435 (Dmitry Novik).
- 상관 서브쿼리가
EXISTS 함수의 인수로 사용될 때 필요한 컬럼만 읽도록 개선했습니다. #82443 (Dmitry Novik).
Azure Blob Storage 개선 사항
azureBlobStorage 테이블 엔진은 이제 가능할 때 관리형 아이덴티티 인증 토큰을 캐시하고 재사용하여 스로틀링을 방지합니다. #79860 (Nick Blakely).
- Azure blob storage용 curl HTTP 클라이언트를 poco HTTP 클라이언트로 대체했습니다. 이 클라이언트에 대해 S3의 설정을 반영한 여러 설정도 도입했습니다. Azure와 S3 모두에 더 짧은 연결 timeout도 도입했습니다. Azure profile events와 메트릭에 대한 내부 검사도 개선했습니다. 새 클라이언트는 기본적으로 활성화되어 있으며, Azure Blob Storage 기반 콜드 쿼리의 지연 시간을 크게 개선합니다.
azure_sdk_use_native_client=false를 설정하면 기존 Curl 클라이언트로 되돌릴 수 있습니다. #83294 (alesapin).
스토리지 엔진 개선 사항
- Redis 및 KeeperMap 스토리지의 키 기반 필터가 수정되었습니다. #81833 (Pervakov Grigorii).
ATTACH PARTITION이 더 이상 모든 캐시를 삭제하지 않게 되었습니다. #82377 (Alexey Milovidov).
- 높은 동시 부하에서 락 경합을 줄이기 위해 스토리지 스냅샷 데이터를 생성하는 동안 락을 유지하지 않도록 했습니다. #83510 (Duc Canh Le).
- 임시 파트를 제거하는 데는 시간이 걸릴 수 있으며(특히 S3의 경우), 현재는
MergeTreeBackgroundExecutor에서 전역 락을 잡은 상태로 이 작업을 수행합니다. 연결 손실로 인해 모든 테이블을 다시 시작해야 하고 백그라운드 작업이 끝날 때까지 기다리는 경우, 테이블이 1시간 동안 readonly 모드에 머무를 수도 있습니다. 하지만 cancel을 호출할 때는 이 락이 필요하지 않은 것으로 보입니다. #84311 (Alexander Tokmakov).
포맷 개선 사항
- 새로운 Parquet 리더 구현을 추가했습니다. 일반적으로 더 빠르며, 페이지 수준 필터 푸시다운과
PREWHERE를 지원합니다. 현재는 실험적 기능입니다. 활성화하려면 input_format_parquet_use_native_reader_v3 설정을 사용하십시오. #82789 (Michael Kolupaev).
- 파싱 오류가 없을 때 직렬화기를 재사용하도록 하여 ProtobufSingle 입력 형식의 성능을 개선했습니다. #83613 (Eduard Karacharov).
데이터 타입 및 직렬화 최적화
파이프라인 및 실행 개선 사항
메모리 및 리소스 최적화
쿼리 계획 및 분석
로깅 개선 사항
함수 최적화
- 임시 데이터를 제거해
largestTriangleThreeBuckets를 최적화했습니다. #84479 (Alexey Milovidov).
- 여러 문자열 처리 함수의 구현을 최적화하고 단순화했습니다. 또한 여러 함수의 잘못된 문서 설명도 수정했습니다. 참고: String 컬럼 및 String 컬럼을 포함하는 복합 타입에서
byteSize의 출력은 빈 문자열당 9바이트에서 8바이트로 변경되었으며, 이는 정상적인 동작입니다. #85063 (Alexey Milovidov).
Keeper 개선 사항
데이터 레이크 개선 사항
개선 사항
접근 제어 및 보안
- 소스에 대해 두 가지 새로운 접근 유형인
READ와 WRITE를 도입하고, 소스 관련 기존 접근 유형은 모두 지원 중단했습니다. 이전에는 GRANT S3 ON *.* TO user를 사용했지만, 이제는 GRANT READ, WRITE ON S3 TO user를 사용합니다. 또한 이를 통해 소스별 READ 권한과 WRITE 권한을 분리할 수 있습니다. 예: GRANT READ ON * TO user, GRANT WRITE ON S3 TO user. 이 기능은 access_control_improvements.enable_read_write_grants 설정으로 제어되며, 기본적으로 비활성화되어 있습니다. #73659 (pufit).
CREATE USER 쿼리에서 사용자 이름에 매개변수를 사용할 수 있도록 했습니다. #81387 (Diskein).
- 코어 덤프에 민감한 데이터가 포함되지 않도록 했습니다. AWS 라이브러리와 호환되는
AwsNodumpMemoryManager와 STL과 호환되는 JemallocNodumpSTLAllocator라는 두 가지 메모리 할당자를 추가했습니다. 둘 다 Jemalloc 메모리 할당자를 감싼 래퍼입니다. 이들은 Jemalloc의 extent hook과 madvise를 사용해 메모리 페이지를 "dump 제외"로 표시합니다. S3 자격 증명, 사용자 자격 증명, 일부 쿼리 데이터에 사용됩니다. #82441 (Miсhael Stetsyuk).
- 이제 ephemeral user가 생성한 뷰는 실제 사용자의 복사본을 저장하므로, ephemeral user가 삭제된 뒤에도 더 이상 무효화되지 않습니다. #84763 (pufit).
- 외부 인증의
forward_headers를 대소문자를 구분하지 않고 일치시키도록 했습니다. #84737 (ingodwerust).
GRANT READ/WRITE의 소스 유형과 GRANT TABLE ENGINE의 테이블 엔진을 판별할 수 있도록 system.grants에 parameter 컬럼을 추가했습니다. #85643 (MikhailBurdukov).
백업 및 복원
데이터 무결성 및 검증
Iceberg 테이블 엔진
DeltaLake 테이블 엔진
DeltaLake 테이블 엔진 개선: delta-kernel-rs에는 이번 PR에서 구현된 ExpressionVisitor API가 있으며, 이 API를 파티션 컬럼 표현식 변환에 적용했습니다(기존 코드에서 사용하던 delta-kernel-rs의 오래된 Deprecated 방식을 대체합니다). 앞으로 이 ExpressionVisitor를 통해 통계 기반 프루닝과 일부 delta-lake 고유 기능도 구현할 수 있습니다. 또한 이번 변경은 DeltaLakeCluster 테이블 엔진에서 파티션 프루닝을 지원하기 위한 목적도 있습니다(파싱된 표현식의 결과인 ActionsDAG는 데이터 경로와 함께 initiator에서 직렬화되어 전송됩니다. 프루닝에 필요한 이런 정보는 데이터 파일 목록의 메타정보로만 제공되며, 이 목록 처리는 initiator에서만 수행되지만 실제 적용은 각 읽기 server에서 이루어져야 하기 때문입니다). #81136 (Kseniia Sumarokova).
- 데이터 레이크 cluster 함수에서 파티션 프루닝 문제를 수정했습니다. #82131 (Kseniia Sumarokova).
- DeltaLakeCluster 테이블 함수에서 파티션된 데이터를 읽는 문제를 수정했습니다. 이 PR에서는 cluster 함수 protocol 버전을 올려 initiator에서 레플리카로 추가 정보를 전송할 수 있도록 했습니다. 이 추가 정보에는 파티션 컬럼(향후에는 생성 컬럼 등 다른 항목도 포함)을 파싱하는 데 필요한 delta-kernel 변환 표현식이 포함됩니다. #82132 (Kseniia Sumarokova).
- 이제 Datalake 데이터베이스가 더 유용한 exception을 발생시킵니다. #81211을 수정했습니다. #82304 (alesapin).
- storage
DeltaLake에 내부 delta-kernel-rs 필터링(통계 및 파티션 프루닝)을 구현했습니다. #84006 (Kseniia Sumarokova).
- 디버깅 시 test 로그 레벨에서도 expression visitor 로그가 지나치게 장황할 수 있으므로, 이를 끌 수 있는 설정
delta_lake_enable_expression_visitor_logging을 추가했습니다. #84315 (Kseniia Sumarokova).
- 테이블 엔진
DeltaLake에서 특정 snapshot version을 읽을 수 있도록 설정 delta_lake_snapshot_version을 추가했습니다. #85295 (Kseniia Sumarokova).
데이터 레이크 통합
- 비동기 요청을 통해 데이터 카탈로그에서의 테이블 목록 조회를 가속합니다. #81084 (alesapin).
- Glue catalog에서
TimestampTZ를 지원합니다. 이 변경으로 #81654가 해결됩니다. #83132 (scanhex12).
- FormatParserGroup을 서로 독립적인 두 개의 struct로 분리합니다. 첫 번째는 공유 컴퓨트 및 IO 리소스를, 두 번째는 공유 filter 리소스(filter ActionDag, KeyCondition)를 담당합니다. 이는 서로 다른 스레드에서 이러한 구조를 더 유연하게 공유해 사용할 수 있도록 하기 위한 것입니다. #83997 (Daniil Ivanik).
- Azure 구성에 누락된
partition_columns_in_data_file을 추가합니다. #85373 (Arthur Passos).
- system.tables에 데이터 레이크 테이블을 추가할지 관리하는
show_data_lake_catalogs_in_system_tables 플래그를 추가하여 #85384를 해결합니다. #85411 (Smita Kulkarni).
S3 및 객체 스토리지
s3_plain_rewritable를 데이터베이스 디스크로 사용할 수 있도록 moveFile 및 replaceFile 메서드를 구현했습니다. #79424 (Tuan Pham Anh).
max_remote_read_network_bandwidth_for_server 및 max_remote_write_network_bandwidth_for_server 스로틀링 관련 문제를 방지하기 위해 S3 읽기 및 쓰기 요청을 전체 S3 요청 단위가 아니라 HTTP 소켓 수준에서 스로틀링합니다. #81837 (Sergei Trifonov).
- 이 PR은
s3_slow_all_threads_after_network_error 구성이 활성화된 경우 S3 재시도 메커니즘에 지터를 도입합니다. #81849 (zoomxi).
- 명시적으로 제공된 IAM role을 사용하는 AWS S3 인증을 구현했습니다. GCS용 OAuth도 구현했습니다. 이러한 기능은 최근까지 ClickHouse Cloud에서만 사용할 수 있었지만 이제 오픈 소스로 공개되었습니다. 객체 스토리지의 연결 매개변수 직렬화 등 일부 인터페이스도 동기화했습니다. #84011 (Alexey Milovidov).
- 외부 집계/정렬에 모든 스토리지 정책(즉, S3와 같은 객체 스토리지)을 사용할 수 있도록 했습니다. #84734 (Azat Khuzhin).
- 제거된 모든 객체를 수집해 객체 스토리지 삭제 작업을 한 번만 수행합니다. #85316 (Mikhail Artemenko).
S3Queue 테이블 엔진
Kafka 통합
ClickHouse Keeper 개선 사항
- Keeper 개선 사항: 백그라운드 스레드에서 changelog 파일을 디스크 간에 이동합니다. 이전에는 changelog를 다른 디스크로 이동하면 이동이 완료될 때까지 Keeper 전체가 차단되었습니다. 이로 인해 이동 작업이 오래 걸리는 경우(예: S3 디스크로 이동) 성능이 저하되었습니다. #82485 (Antonio Andelic).
- Keeper 개선 사항: 새로운 구성
keeper_server.cleanup_old_and_ignore_new_acl을 추가합니다. 활성화하면 모든 노드의 ACL이 지워지고 새 요청에 대한 ACL은 무시됩니다. 노드에서 ACL을 완전히 제거하는 것이 목적이라면, 새 스냅샷이 생성될 때까지 이 구성을 활성화된 상태로 유지하는 것이 중요합니다. #82496 (Antonio Andelic).
- Keeper 개선 사항: world:anyone ACL에 대한 세부 권한을 지원합니다. #82755 (Antonio Andelic).
- 구성에서 경로별 추가 Keeper ACL을 지정하는 기능을 추가했습니다. 특정 경로에 추가 ACL을 적용하려면 구성의
zookeeper.path_acls 아래에 정의하면 됩니다. #82898 (Antonio Andelic).
- 소프트 메모리 제한으로 인해 Keeper가 쓰기를 거부할 때 ProfileEvent를 추가합니다. #82963 (Xander Garbett).
- 새로운 요청 타입을 활성화하는
create_if_not_exists, check_not_exists, remove_recursive feature flag를 Keeper에서 기본적으로 활성화합니다. #83488 (Antonio Andelic).
apply_to_children 구성을 사용해 특정 Keeper 노드에 추가 ACL을 적용하는 기능을 추가합니다. #84137 (Antonio Andelic).
- KeeperClient에
get_acl 명령을 추가합니다. #84641 (Antonio Andelic).
- 수신된 요청의 로깅을 전환하는 4LW
lgrq를 Keeper에 추가합니다. #84719 (Antonio Andelic).
- Keeper에서 스토리지 잠금 경합을 줄입니다. #84732 (Antonio Andelic).
- 이제
encrypt_decrypt 도구가 암호화된 ZooKeeper 연결을 지원합니다. #84764 (Roman Vasin).
keeper_server.coordination_settings.latest_logs_cache_entry_count_threshold 및 keeper_server.coordination_settings.commit_logs_cache_entry_count_threshold를 사용해 항목 수를 기준으로 Keeper 로그 엔트리 캐시 크기를 제한합니다. #84877 (Antonio Andelic).
JSON 및 Dynamic 타입
- 파트에 저장된 모든 하위 스트림을 추적할 수 있도록 Wide 파트에
columns_substreams.txt 파일을 추가합니다. 이를 통해 JSON 및 Dynamic 타입의 동적 스트림을 추적할 수 있으며, 동적 스트림 목록을 얻기 위해 이러한 컬럼의 샘플을 읽지 않아도 됩니다(예: 컬럼 크기 계산 시). 이제 모든 동적 스트림이 system.parts_columns에도 반영됩니다. #81091 (Pavel Kruglov).
- JSON 및 Dynamic 컬럼에서
ALTER UPDATE를 사용할 수 있도록 허용합니다. #82419 (Pavel Kruglov).
- 이제 JSON 타입 내에서
Time 및 Time64 타입을 사용할 수 있습니다. #83784 (Yarik Briukhovetskyi).
- JSON 타입 파싱 중 JSON 키의 점(.)을 이스케이프하는 설정
json_type_escape_dots_in_keys를 추가합니다. 이 설정은 기본적으로 비활성화되어 있습니다. #84207 (Pavel Kruglov).
Parquet 및 ORC 포맷
- ORC 압축 블록 크기를 설정하는 옵션을 추가하고, Spark 및 Hive와 일관성을 맞추기 위해 기본값을 64KB에서 256KB로 변경했습니다. #80602 (李扬).
- 명세에 따라 Parquet enum을 byte array로 기록하는 기능을 지원합니다. 자세한 내용은 나중에 추가하겠습니다. #81090 (Arthur Passos).
- GeoParquet을 출력 형식으로 기록하는 기능을 지원합니다. #81784 (scanhex12).
분산 쿼리와 병렬 레플리카
- 새로운 설정인 enable_add_distinct_to_in_subqueries가 도입되었습니다. 이 설정을 활성화하면 ClickHouse는 분산 쿼리의 IN 절에 있는 서브쿼리에 DISTINCT를 자동으로 추가합니다. 이렇게 하면 세그먼트 간에 전송되는 임시 테이블(temporary table)의 크기를 크게 줄여 네트워크 효율을 높일 수 있습니다. 참고: 이는 트레이드오프입니다. 네트워크 전송량은 줄어들지만 각 노드에서 추가 병합(중복 제거) 작업이 필요합니다. 네트워크 전송이 병목이고 병합 비용을 감수할 수 있는 경우 이 설정을 활성화하십시오. #81908 (fhw12345).
address_expression 인수에 cluster가 지정된 경우, 병렬 레플리카와 함께 remote-() 테이블 함수를 지원하도록 추가되었습니다. 또한 #73295도 수정되었습니다. #82904 (Igor Nikonov).
- 이제 병렬 레플리카를 사용하는 조인은 조인 논리 단계를 사용합니다. 병렬 레플리카를 사용하는 조인 쿼리에서 문제가 발생하면
SET query_plan_use_new_logical_join_step=0을 시도하고 이슈를 보고하십시오. #83801 (Vladimir Cherkasov).
설정 및 구성
allow_experimental_join_condition 설정을 폐기된 것으로 표시합니다. #80566 (Vladimir Cherkasov).
- 전체 및 사용자별 네트워크 스로틀러는 재설정되지 않으므로
max_network_bandwidth_for_all_users 및 max_network_bandwidth_for_all_users 제한을 절대 초과하지 않습니다. #81729 (Sergei Trifonov).
optimize_rewrite_regexp_functions 설정(기본적으로 활성화됨)을 도입합니다. 이 설정을 사용하면 특정 정규식 패턴이 감지될 때 옵티마이저가 일부 replaceRegexpAll, replaceRegexpOne, extract 호출을 더 단순하고 효율적인 형태로 재작성할 수 있습니다. (이슈 #81981). #81992 (Amos Bird).
listen_backlog(기본값 4096)를 기준으로 TCP 서버 큐(기본값 64)를 조정합니다. #82045 (Azat Khuzhin).
- 서버를 재시작하지 않고
max_local_read_bandwidth_for_server 및 max_local_write_bandwidth_for_server를 즉시 다시 로드할 수 있는 기능을 추가합니다. #82083 (Kai Zhu).
- 벡터 유사도 인덱스를 사용하려면 반드시 활성화해야 하는
enable_vector_similarity_index 설정을 도입합니다. 기존 설정 allow_experimental_vector_similarity_index는 이제 폐기되었습니다. 필요한 경우에는 여전히 사용할 수 있습니다. #83459 (Robert Schulze).
- 큰 컬럼이 있는 JOIN의 메모리 사용량을 제한하기 위해
max_joined_block_size_rows에 더해 max_joined_block_size_bytes를 추가합니다. #83869 (Nikolai Kochetov).
- cluster_function_process_archive_on_multiple_nodes의 호환성을 수정합니다. #83968 (Kseniia Sumarokova).
- 상관 서브쿼리 지원을 기본적으로 활성화합니다. #85107 (Dmitry Novik).
- DatabaseReplicatedSettings의 기본값을 정의하는
database_replicated 설정을 추가합니다. Replicated DB 생성 쿼리에 이 설정이 없으면 이 설정의 값이 사용됩니다. #85127 (Tuan Pham Anh).
s3 또는 s3Cluster 테이블 엔진/함수에서 키-값 인수를 허용합니다. 예를 들어 s3('url', CSV, structure = 'a Int32', compression_method = 'gzip')와 같습니다. #85134 (Kseniia Sumarokova).
- 비상관
EXISTS를 스칼라 서브쿼리로 실행합니다. 이를 통해 스칼라 서브쿼리 캐시를 사용하고 결과를 상수 폴딩할 수 있어 인덱스에 도움이 됩니다. 호환성을 위해 새로운 설정 execute_exists_as_scalar_subquery=1도 추가되었습니다. #85481 (Nikolai Kochetov).
- 복합 식별자를 더 많은 경우에 해석할 수 있도록 지원합니다. 특히
ARRAY JOIN과 이전 분석기 사이의 호환성이 개선됩니다. 이전 동작을 유지하기 위해 새로운 설정 analyzer_compatibility_allow_compound_identifiers_in_unflatten_nested를 도입합니다. #85492 (Nikolai Kochetov).
시스템 테이블과 관측성
데이터베이스 엔진
시스템 및 내부 개선 사항
- DatabaseCatalog에 테이블 UUID를 수동으로 추가해, 읽기 전용 원격 디스크가 있는 데이터베이스를 ATTACH할 때 발생하던 문제를 수정했습니다. #82670 (Tuan Pham Anh).
distributed_ddl_output_mode='*_only_active'일 때 max_replication_lag_to_enqueue를 초과하는 복제 지연이 있는 신규 또는 복구된 레플리카를 기다리지 않도록 DDL 작업 처리를 개선했습니다. 이를 통해 초기화 또는 복구 후 새 레플리카가 활성화되었지만 대량의 복제 로그가 누적된 경우 DDL task is not finished on some hosts 오류를 방지하는 데 도움이 됩니다. 또한 복제 로그가 max_replication_lag_to_enqueue 미만으로 내려갈 때까지 기다리는 SYSTEM SYNC DATABASE REPLICA STRICT 쿼리도 구현했습니다. #83302 (Alexander Tokmakov).
- SystemLogs의 종료 순서를 일반 테이블 이후로 변경했습니다. 이제 SystemLogs는 시스템 테이블 이전에 종료되며, 기존에는 일반 테이블 이전에 종료되었습니다. #83134 (Kseniia Sumarokova).
- 복제된 데이터베이스(Replicated database) 설정용 서버 설정
logs_to_keep를 추가하여, 복제된 데이터베이스의 기본 logs_to_keep 매개변수를 구성할 수 있게 했습니다. 값을 낮추면 ZooKeeper 노드 수가 줄어들고(특히 데이터베이스가 많은 경우 효과적임), 값을 높이면 오랫동안 중단되었던 누락 레플리카가 다시 따라잡을 수 있습니다. #84183 (Alexey Khatskevich).
- Replicated 데이터베이스 설정
max_retries_before_automatic_recovery의 기본값을 10으로 변경해, 일부 경우 더 빠르게 복구할 수 있도록 했습니다. #84369 (Alexander Tokmakov).
- 복제된 데이터베이스에서 append가 아닌 갱신 가능 구체화 뷰 DDL 작업을 최적화해, 기존 임시 테이블의 생성과 이름 변경을 스키핑하도록 했습니다. #84858 (Tuan Pham Anh).
복제 및 동기화
SystemAndInternalImprovements
- ZooKeeper 연결 문제 발생 시 테이블이 누락되지 않도록
SYSTEM RESTART REPLICA를 개선하여 테이블 생성을 재시도하도록 합니다. #82616 (Nikolay Degterinsky).
ReplicatedMergeTree::executeMetadataAlter에 UUID 검증을 추가하여 StorageID를 가져온 시점과 IDatabase::alterTable를 호출하는 시점 사이에 테이블이 EXCHANGE되는 경우 잘못된 테이블 정의가 발생하지 않도록 합니다. #82666 (Nikolay Degterinsky).
- experimental zero-copy 복제와 관련된 experimental
send_metadata 로직을 제거합니다. 이 코드는 한 번도 사용된 적이 없고, 지원되지 않았으며, 기능을 검증할 테스트도 없어 제대로 동작하지 않았을 가능성이 큽니다. #82508 (alesapin).
remote_fs_zero_copy_zookeeper_path에서 매크로 확장을 지원합니다. #85437 (Mikhail Koviazin).
함수와 표현식
- 함수
addressToSymbol와 system.symbols 테이블은 가상 메모리 주소 대신 파일 오프셋을 사용하게 됩니다. #81896 (Alexey Milovidov).
- named tuple의 supertype을 도출할 때 요소 이름이 유지되도록 했습니다. #81345 (lgbo).
- 서로 다른 윈도우에서 동일한 컬럼에 대해 서로 다른 콜레이션을 혼용할 수 있도록 했습니다. #82877 (Yakov Olkhovskiy).
- 타입을 wkb 포맷으로 기록하는 함수를 추가했습니다. #82935 (scanhex12).
Time 및 Time64를 MM:SS, M:SS, SS 또는 S 형식으로 파싱하는 기능이 추가되었습니다. #83299 (Yarik Briukhovetskyi).
- 함수
reinterpret()가 이제 T가 고정 크기 데이터 타입인 Array(T)로 변환하는 기능을 지원합니다(이슈 #82621). #83399 (Shankar Iyer).
structureToProtobufSchema 및 structureToCapnProtoSchema 함수가 개행 문자를 사용하는 대신 0 종료 바이트를 올바르게 추가하도록 수정하여, 출력에서 개행이 누락되는 문제와 0 바이트에 의존하는 함수(logTrace, demangle, extractURLParameter, toStringCutToZero, encrypt/decrypt 등)에서 발생할 수 있는 버퍼 오버플로우를 방지했습니다. #85062를 해결합니다. #85063 (Alexey Milovidov).
- 0바이트가 포함된 문자열 처리를 지원하도록
regexp_tree 딕셔너리 레이아웃을 수정했습니다. #85063 (Alexey Milovidov).
formatRowNoNewline 함수를 Values 포맷 또는 행 끝에 줄바꿈이 없는 포맷으로 호출할 때 출력의 마지막 문자가 잘못 잘려 나가던 문제를 수정했습니다. #85063 (Alexey Milovidov).
- 드물게 메모리 누수로 이어질 수 있던
stem 함수의 예외 안전성 관련 오류를 수정했습니다. #85063 (Alexey Milovidov).
- 블록 내에서 이전 문자열이 단어 문자로 끝난 경우에도 문자열 시작 부분의 단어 시작을 올바르게 인식하도록
FixedString 인수에 대한 initcap 함수를 수정했습니다. #85063 (Alexey Milovidov).
- 초기화되지 않은 메모리가 노출될 수 있는 Apache
ORC 포맷의 보안 취약성을 수정했습니다. #85063 (Alexey Milovidov).
replaceRegexpAll 및 해당 별칭인 REGEXP_REPLACE의 동작이 변경되어, 이전 일치가 문자열 전체를 처리한 경우에도 문자열 끝에서 빈 일치를 허용합니다(예: ^a*|a*$ 또는 ^|.*). 이는 JavaScript, Perl, Python, PHP, Ruby의 의미 체계와 일치하며 PostgreSQL과는 다릅니다. #85063 (Alexey Milovidov).
- 많은 문자열 처리 함수의 구현을 최적화하고 단순화했습니다. 여러 함수에 대한 잘못된 문서를 바로잡았습니다. 참고: String 컬럼과 String 컬럼을 포함하는 복합 타입에서
byteSize 출력이 빈 문자열당 9바이트에서 8바이트로 변경되었습니다. 이는 예상된 동작입니다. #85063 (Alexey Milovidov).
timeSeries*ToGrid() 함수에서 0 간격을 허용합니다. 이는 https://github.com/ClickHouse/ClickHouse/pull/75036의 #3에 해당합니다. #85390 (Vitaly Baranov).
- 함수
nested가 내부 배열을 지원합니다. #85719 (Nikolai Kochetov).
MergeTree 개선 사항
- 온더플라이 뮤테이션 또는 패치 파트로 인해 즉시 업데이트되는 컬럼에 의존하는 스키핑 인덱스를 더 세밀하게 비활성화합니다. 이제 스키핑 인덱스는 온더플라이 뮤테이션 또는 패치 파트의 영향을 받는 파트에서만 사용되지 않으며, 이전에는 이러한 인덱스가 모든 파트에서 비활성화되었습니다. #84241 (Anton Popov).
- 예를 들어 로컬 메타데이터가 있는 디스크만 대상으로 파트를 찾도록 범위를 제한하는 MergeTree 설정
search_orphaned_parts_drives를 추가합니다. #84710 (Ilya Golshtein).
WHERE에 read_in_order_use_virtual_row에 대한 누락된 지원을 추가합니다. 이를 통해 필터가 PREWHERE로 완전히 푸시되지 않은 쿼리에서 추가 파트 읽기를 건너뛸 수 있습니다. #84835 (Nikolai Kochetov).
- MergeTree에서 "compact" Variant 판별자 직렬화 사용을 수정합니다. 이전에는 사용할 수 있는 일부 경우에도 사용되지 않았습니다. #84141 (Pavel Kruglov).
- 패치 파트의 전체 비압축 바이트 수에 대한 제한(테이블 설정
max_uncompressed_bytes_in_patches)을 추가합니다. 이를 통해 경량 업데이트 후 SELECT 쿼리의 심각한 성능 저하를 방지하고, 경량 업데이트의 오용 가능성도 막을 수 있습니다. #85641 (Anton Popov).
캐시 및 메모리 관리
벡터 유사성 인덱스
- 사용자가
NumericIndexedVector에서 nan 및 inf를 사용하지 못하도록 했습니다. #82239 및 몇 가지 추가 문제를 수정했습니다. #82681 (Raufs Dunamalijevs).
- 이제 벡터 유사성 인덱스가 바이너리 양자화를 지원합니다. 바이너리 양자화는 메모리 사용량을 크게 줄이고, 더 빠른 거리 계산을 통해 벡터 인덱스 구축 속도를 높입니다. 또한 기존 설정
vector_search_postfilter_multiplier 는 폐기되었으며, 더 범용적인 설정인 vector_search_index_fetch_multiplier로 대체되었습니다. #85024 (Shankar Iyer).
- 벡터 유사성 인덱스를 사용한 근사 벡터 검색이 이제 일반 제공(GA) 상태입니다. #85888 (Robert Schulze).
오류 처리 및 메시지
SQL 포맷 개선 사항
외부 통합
- 이름이 지정된 컬렉션을 사용할 때 ODBC와 JDBC의 매개변수 이름을 통일합니다. #83410 (Andrey Zvonov).
- MongoDB: 문자열을 숫자 타입으로 암시적으로 파싱합니다. 이전에는 ClickHouse 테이블의 숫자 컬럼에 대해 MongoDB 소스에서 문자열 값을 받으면 예외가 발생했습니다. 이제 엔진이 문자열에서 숫자 값을 자동으로 파싱하려고 시도합니다. #81167를 해결했습니다. #84069 (Kirill Nikiforov).
- 지원되지 않는 아키텍처에서도
simdjson을 허용합니다(이전에는 CANNOT_ALLOCATE_MEMORY 오류가 발생했습니다). #84966 (Azat Khuzhin).
기타 개선 사항
버그 수정(공식 안정 릴리스에서 사용자에게 드러나는 오동작)
성능 최적화
쿼리 실행 관련 수정 사항
ORDER BY ... LIMIT BY ... LIMIT N 조합을 사용하는 쿼리에서 ORDER BY가 PartialSorting으로 실행되는 경우, 이제 카운터 rows_before_limit_at_least는 정렬 변환이 소비한 행 수가 아니라 LIMIT 절에서 소비한 행 수를 반영합니다. #78999 (Eduard Karacharov).
<=> 연산자와 Join 스토리지의 논리 오류를 수정하여 이제 쿼리가 올바른 오류 코드를 반환합니다. #80165 (Vladimir Cherkasov).
remote 함수 계열과 함께 사용할 때 loop 함수에서 발생하던 충돌을 수정했습니다. loop(remote(...))에서 LIMIT 절이 올바르게 적용되도록 했습니다. #80299 (Julia Kartseva).
- Unix epoch(1970-01-01) 이전 날짜와 최대 날짜(2106-02-07 06:28:15) 이후 날짜를 처리할 때
to_utc_timestamp 및 from_utc_timestamp 함수가 잘못 동작하던 문제를 수정했습니다. 이제 이 함수는 값을 각각 epoch 시작 시점과 최대 날짜로 올바르게 제한합니다. #80498 (Surya Kant Ranjan).
- 왼쪽 인수가 null이고 서브쿼리 결과가 널 허용이 아닐 때
transform_null_in=1에서 IN 실행 문제를 수정했습니다. #81584 (Pavel Kruglov).
- 스칼라 상관 서브쿼리 처리 중 필수 컬럼을 읽지 않는 문제를 수정했습니다. 이 수정은 #81716을 해결합니다. #81805 (Dmitry Novik).
- 쿼리에서 상수 별칭(alias) 컬럼만 사용할 때 필터 분석을 수정했습니다. #79448를 해결합니다. #82037 (Dmitry Novik).
WHERE 조건에서 arrayJoin과 IndexSet을 사용하는 쿼리의 Not found column 오류를 수정했습니다. #82113 (Nikolai Kochetov).
- CTE 정의가 같은 이름의 다른 테이블 표현식을 참조할 때 발생하는
TOO_DEEP_SUBQUERIES 예외를 수정했습니다. #83413 (Dmitry Novik).
WHERE ... IN (<subquery>) 절 사용 시 쿼리 조건 캐시가 활성화된 경우(설정 use_query_condition_cache) 쿼리 결과가 잘못되던 문제를 수정했습니다. #83445 (LB7666).
INSERT SELECT에서 UNION ALL을 사용하면 특정 예외적인 경우 null 포인터 역참조가 발생할 수 있었습니다. 이 변경으로 #83618이 해결되었습니다. #83643 (Alexey Milovidov).
- 연관된 컬럼에 대한 행 정책 표현식을 분석할 때 발생하던
LOGICAL_ERROR를 수정했습니다. #82618 (Dmitry Novik).
- 재귀 CTE와 함께 쿼리 조건 캐시를 사용할 때 잘못된 결과가 반환되는 문제를 수정했습니다(이슈 #81506). #84026 (zhongyuankai).
- 잘못된
WINDOW 정의를 분석할 때 발생하는 무한 재귀를 수정했습니다. #83131 문제를 수정합니다. #84242 (Dmitry Novik).
additional_table_filters expression 설정에서 IN (subquery) 내부의 Not-ready Set 문제를 수정했습니다. #85210 (Nikolai Kochetov).
optimize_syntax_fuse_functions가 활성화되었을 때 중복된 서브쿼리로 인해 발생하는 논리 오류를 수정하고, #75511을 해결했습니다. #83300 (Vladimir Cherkasov).
Iceberg 및 DataLake 수정 사항
DeltaLake 수정 사항
TTL 및 MergeTree 수정 사항
- TTL로 인해 행 수가 줄어들 때
minmax_count_projection과 같이 이에 의존하는 알고리즘의 정확성을 보장할 수 있도록 MinMax 인덱스를 다시 계산합니다. 이로써 #77091이 해결되었습니다. #77166 (Amos Bird).
- TTL을 업데이트할 때 TTL GROUP BY에서 TTL이 잘못 재계산되던 문제를 수정했습니다. #81222 (Evgeniy Ulasik).
- TTL 표현식에서 dict를 사용할 때 머지 중 "Context has expired"가 발생하던 문제를 수정했습니다. #81690 (Azat Khuzhin).
- GROUP BY와 SET용 TTL에서 동일한 컬럼을 사용할 때 발생하던 LOGICAL_ERROR와 그에 따른 크래시를 수정했습니다. #82054 (Pablo Marcos).
- 이제 테이블에서 모든 TTL이 제거되면 MergeTree는 TTL 관련 작업을 수행하지 않습니다. #84441 (alesapin).
ALTER MODIFY ORDER BY가 정렬 키의 TTL 컬럼을 검증하지 않던 문제를 수정했습니다. 이제 ALTER 작업 중 ORDER BY 절에서 TTL 컬럼을 사용하면 올바르게 거부되어 잠재적인 테이블 손상을 방지합니다. #84536 (xiaohuanlin).
프로젝션 수정 사항
- 컬럼 유형이 널 허용(Nullable)으로 변경되었을 때 프로젝션을 구체화하는 과정에서 발생하던 논리 오류를 수정했습니다. #80741 (Pavel Kruglov).
enable_shared_storage_snapshot_in_query = 1일 때 mergeTreeProjection 테이블 함수에서 parent 메타데이터를 잘못 사용하던 문제를 수정했습니다. 이는 #82634 관련 수정입니다. #82638 (Amos Bird).
- 테이블에 프로젝션이 있고
lightweight_mutation_projection_mode = 'rebuild'로 설정된 상태에서, 사용자가 테이블의 임의의 block에서 모든 행을 삭제하는 lightweight delete를 실행할 때 드물게 발생하던 ClickHouse 크래시를 수정했습니다. #84158 (alesapin).
- 손상된 프로젝션이 있는 파트의 Backup 문제를 수정했습니다. #85362 (Antonio Andelic).
_part_offset 컬럼이 안정화될 때까지 릴리스에서 프로젝션 내 사용을 금지했습니다. #85372 (Sema Checherinda).
병렬 레플리카 수정 사항
- 병렬 레플리카로 실행된 일부 쿼리에서는
in order 읽기 최적화가 initiator에는 적용되지만 원격 노드에는 적용되지 않을 수 있었습니다. 이로 인해 병렬 레플리카 coordinator(initiator)와 원격 노드에서 서로 다른 읽기 모드가 사용되었고, 이는 논리적 오류였습니다. #80652 (Igor Nikonov).
- 하위 쿼리(subquery)에
FINAL이 포함된 경우 병렬 레플리카를 비활성화합니다. #81401 #83455 (zoomxi).
- 병렬 레플리카를 사용하는 쿼리에서 여러 INNER 조인 뒤에 RIGHT 조인이 이어질 때 발생하는
LOGICAL_ERROR를 수정했습니다. 이러한 쿼리에는 병렬 레플리카를 사용하지 않습니다. #84299 (Vladimir Cherkasov).
- 역방향
in order 읽기 최적화를 사용하는 병렬 레플리카 쿼리는 잘못된 결과를 생성할 수 있습니다. #85406 (Igor Nikonov).
인증 및 보안
Backup 및 복원 수정 사항
윈도우 및 집계 함수
- 머지 중 예외가 발생할 때
Aggregator에서 발생할 수 있는 크래시를 수정했습니다. #81450 (Nikita Taranov).
- 머지 중 예외가 발생할 때
Aggregator에서 발생할 수 있는 크래시를 수정했습니다. #82022 (Nikita Taranov).
- arraySimilarity의 복사-붙여넣기 오류를 수정하고 UInt32 및 Int32 가중치 사용을 금지했습니다. 테스트와 문서도 업데이트했습니다. #82103 (Mikhail f. Shiryaev).
- 큰 수에 적용할 때 발생하던
numericIndexedVectorPointwiseAdd, numericIndexedVectorPointwiseSubtract, numericIndexedVectorPointwiseMultiply, numericIndexedVectorPointwiseDivide 함수의 오버플로우를 수정했습니다. #82165 (Raufs Dunamalijevs).
Parquet 및 파일 포맷 수정 사항
WHERE function(key) IN (...)와 같은 조건에 Parquet 블룸 필터를 WHERE key IN (...)인 것처럼 잘못 적용하던 문제를 수정했습니다. #81255 (Michael Kolupaev).
- Parquet writer가 Decimal 타입에 대해 잘못된 통계값(min/max)을 출력하던 문제를 수정했습니다. #83754 (Michael Kolupaev).
- 요소가 비어 있는 경우
groupArraySample/groupArrayLast의 역직렬화 문제를 수정했습니다(입력이 비어 있으면 역직렬화 과정에서 바이너리의 일부를 건너뛸 수 있었고, 이로 인해 데이터를 읽는 중 손상이 발생하거나 TCP protocol에서 UNKNOWN_PACKET_FROM_SERVER가 발생할 수 있었습니다). 이 문제는 숫자 및 date time 타입에는 영향을 주지 않습니다. #82763 (Pedro Ferreira).
- RowBinary format에서 NULL 값을 포함한 JSON paths를 기록할 때 발생하던 문제를 수정했습니다. #83923 (Pavel Kruglov).
조인 관련 수정 사항
복제된 데이터베이스 수정 사항
- DDLWorker와 DatabaseReplicatedDDLWorker의 markReplicasActive를 수정했습니다. #81395 (Tuan Pham Anh).
DatabaseReplicated::getClusterImpl를 수정했습니다. hosts의 첫 번째 요소(또는 여러 요소)에 id == DROPPED_MARK가 있고 동일한 세그먼트에 해당하는 다른 요소가 없으면 shards의 첫 번째 요소가 빈 벡터가 되어 std::out_of_range가 발생할 수 있습니다. #82093 (Miсhael Stetsyuk).
- 비동기 테이블 로딩 작업 수를 추적하도록 했습니다. 실행 중인 작업이 있으면
TransactionLog::removeOldEntries에서 tail_ptr를 업데이트하지 않습니다. #82824 (Tuan Pham Anh).
- MergeTree 테이블을
add_minmax_index_for_numeric_columns=1 또는 add_minmax_index_for_string_columns=1로 생성한 뒤, 이후 ALTER 작업 중 인덱스가 구체화되면 새 레플리카에서 복제된 데이터베이스가 올바르게 초기화되지 못하는 문제를 수정했습니다. #83751 (Nikolay Degterinsky).
- DEFINER가 삭제된 경우 복제된 데이터베이스의 새 레플리카에서 RMV 생성이 실패하는 문제를 수정했습니다. #85327 (Nikolay Degterinsky).
- 메타데이터 파일 이동에 오랜 시간이 걸릴 때 복제된 데이터베이스 복구에 실패하는 문제를 수정했습니다. #85177 (Tuan Pham Anh).
- Keeper에서 데이터베이스 메타데이터를 복원한 후 복제된 데이터베이스를 강제로 복구하도록 했습니다. #85960 (Tuan Pham Anh).
Replicated 데이터베이스 복구 시 발생하는 버그를 수정했습니다. 테이블 이름에 % 기호가 포함된 경우 복구 중 테이블이 다른 이름으로 다시 생성될 수 있었습니다. #85987 (Alexander Tokmakov).
- 이제 DDL worker가 레플리카 집합에서 오래된 host를 정리합니다. 이를 통해 ZooKeeper에 저장되는 메타데이터 양이 줄어듭니다. #88154 (alesapin).
경량 업데이트 수정 사항
ReplacingMergeTree 및 CollapsingMergeTree 엔진을 사용하는 테이블에서 경량 업데이트 문제를 수정했습니다. #84851 (Anton Popov).
- 테이블의 모든 컬럼을 업데이트하는 경량 업데이트의 논리 오류를 수정했습니다. #84380 (Anton Popov).
- 25.7 미만 버전의 서버에서 생성된
ReplicatedMergeTree 엔진 테이블의 경량 업데이트 문제를 수정했습니다. #84933 (Anton Popov).
ALTER TABLE ... REPLACE PARTITION 쿼리를 실행한 후 복제되지 않은 MergeTree 엔진 테이블에서 발생하던 경량 업데이트 문제를 수정했습니다. #84941 (Anton Popov).
ReplicatedMergeTree에서 패치 파트 정리 문제를 수정했습니다. 이전에는 패치 파트를 구체화하는 머지되었거나 변경이 적용된 파트를 다른 레플리카에서 다운로드하기 전까지, 경량 업데이트 결과가 해당 레플리카에 일시적으로 보이지 않을 수 있었습니다. #85121 (Anton Popov).
S3 및 객체 스토리지 수정 사항
Dynamic 및 Variant 타입 수정
Keeper 수정 사항
인덱싱 수정 사항
- alternation이 포함되고 첫 번째 대안이 리터럴이 아닌 regexp로 token/ngram 인덱스를 필터링할 때 발생하던 과도한 그래뉼 스키핑을 수정했습니다. #79373 (Eduard Karacharov).
use_skip_indexes_if_final_exact_mode 설정의 구현(25.6에 도입됨)은 MergeTree 엔진 설정/데이터 분포에 따라 적절한 후보 범위를 선택하지 못할 수 있었습니다. 이 문제를 해결했습니다. #82667 (Shankar Iyer).
use_skip_indexes_if_final_exact_mode 설정의 최적화(25.6에 도입됨)는 MergeTree 엔진 설정/데이터 분포에 따라 적절한 후보 범위를 선택하지 못할 수 있었습니다. 이 문제를 해결했습니다. #82879 (Shankar Iyer).
- 이전에는
set 인덱스가 그래뉼이 필터를 통과하는지 확인할 때 널 허용 컬럼을 고려하지 않았습니다(이슈 #75485). #84305 (Elmi Ahmadov).
MinMax 인덱스를 평가하는 동안 nan 값과 비교할 때 올바른 범위를 사용하지 않던 문제를 수정했습니다. #84386 (Elmi Ahmadov).
ngram 및 no_op 토크나이저는 이제 빈 입력 토큰 때문에 (실험적) 텍스트 인덱스를 더 이상 충돌시키지 않습니다. #84849 (Robert Schulze).
Materialized View 수정 사항
Azure 및 cloud storage 수정 사항
크래시 및 안정성 수정
Glue 및 catalog 관련 수정
- Glue catalog 통합의 버그를 수정했습니다. 이제 ClickHouse는 일부 서브컬럼에 Decimal이 포함된 중첩 데이터 타입이 있는 테이블(예:
map<string, decimal(9, 2)>)을 읽을 수 있습니다. #81301을 해결했습니다. #82114 (alesapin).
- 이제 ClickHouse는 테이블 유형이 소문자로 지정된 Glue Catalog의 테이블도 읽을 수 있습니다. #84316 (alesapin).
- 이제 Unity Catalog는 Delta가 아닌 테이블의 경우, 비정상적인 데이터 타입이 있는 스키마를 무시합니다. #85699을 해결했습니다. #85950 (alesapin).
함수 관련 수정 사항
분산 쿼리 수정 사항
- 병렬 분산
INSERT SELECT에서 LIMIT를 허용하던 것은 올바르지 않았으며, 이로 인해 대상 테이블에 데이터가 중복될 수 있었습니다. #84477 (Igor Nikonov).
JOIN 또는 서브쿼리가 있는 경우에는 테이블 함수를 해당 cluster 대안으로 치환하지 않도록 했습니다. #84335 (Konstantin Bogdanov).
- 분산 환경에서 상관 서브쿼리가 사용되는지 확인하는 검사를 추가해 크래시를 방지했습니다. #82205를 수정했습니다. #85030 (Dmitry Novik).
distributed_depth를 *Cluster 함수의 판별 기준으로 사용하는 것은 잘못된 방식이었으며, 데이터 중복을 초래할 수 있었습니다. 대신 client_info.collaborate_with_initiator를 사용합니다. #85734 (Konstantin Bogdanov).
Distributed 대상 테이블을 사용하는 병렬 분산 INSERT SELECT에서 WITH 구문의 전역 상수를 지원합니다. 이전에는 쿼리 실행 시 Unknown expression identifier 오류가 발생할 수 있었습니다. #85811 (Nikolai Kochetov).
DatabaseReplicated에서 CREATE ... AS (SELECT * FROM s3Cluster(...))를 시도할 때 발생하던 논리 오류를 수정했습니다. #85904 (Konstantin Bogdanov).
- Distributed 테이블에서 ALTER를 수행할 때
sharding_key 검사 로직을 추가했습니다. 이전에는 잘못된 ALTER로 인해 테이블 정의가 손상되고 서버를 다시 시작할 수 없게 될 수 있었습니다. #86015 (Nikolay Degterinsky).
메트릭 및 모니터링 수정
- 비동기 메트릭 설정
asynchronous_metrics_update_period_s 및 asynchronous_heavy_metrics_update_period_s의 유효성 검사 문제를 수정했습니다. #82310 (Bharat Nallan).
IndexUncompressedCacheBytes/IndexUncompressedCacheCells/IndexMarkCacheBytes/IndexMarkCacheFiles 메트릭을 수정했습니다(이전에는 Cache 접두사 없이 메트릭에 포함되었습니다). #83730 (Azat Khuzhin).
- QueryMetricLog에서 발생하던
LOGICAL_ERROR("Mutex cannot be NULL") 문제를 수정했습니다. #82979 (Pablo Marcos).
- 잘못된 KafkaAssignedPartitions 및 KafkaConsumersWithAssignment 메트릭을 수정했습니다. #85494 (Ilya Golshtein).
PREWHERE(명시적 또는 자동)를 사용할 때 처리된 바이트 통계가 과소평가되던 문제를 수정했습니다. #85495 (Michael Kolupaev).
- background schedule pool 및 실행기에서 발생하던 메모리 추적 드리프트를 수정했습니다. #84946 (Azat Khuzhin).
데이터 타입 및 변환 수정
메모리 및 리소스 관리
구성 및 설정 관련 수정
- URI를 통해 설정을 전달할 때 마지막 값이 적용되도록 수정했습니다. #82137 (Sema Checherinda).
- 클라이언트의 데이터 경쟁(data race) 문제를 수정하고(전역 Context를 사용하지 않도록 변경),
session_timezone 재정의도 바로잡았습니다(이전에는 session_timezone이 예를 들어 users.xml/클라이언트 옵션에서는 비어 있지 않은 값으로 설정되고 쿼리 Context에서는 빈 값으로 설정된 경우, 잘못되게도 users.xml의 값이 사용되었습니다. 이제는 쿼리 Context가 항상 전역 Context보다 우선합니다). #82444 (Azat Khuzhin).
- 서버 작업이 멈추지 않도록
threadpool_writer_pool_size를 0으로 설정할 수 없게 했습니다. #82532 (Bharat Nallan).
role_cache_expiration_time_seconds 설정 구성에서 발생하던 경미한 정수 오버플로우를 해결했습니다(이슈 #83374). #83461 (wushap).
- 논리 오류를 유발할 수 있으므로
max_insert_block_size를 0으로 설정할 수 없게 했습니다. #83688 (Bharat Nallan).
block_size_bytes=0일 때 estimateCompressionRatio()에서 발생하던 무한 루프를 수정했습니다. #83704 (Azat Khuzhin).
date_time_input_format 같은 매개변수가 multipart를 사용하는 HTTP에서 그대로 무시되던 문제를 수정했습니다. #85570 (Sema Checherinda).
MongoDB 수정 사항
- 이전에는
MongoDB 테이블 엔진 정의의 host:port 인수에 경로 구성 요소를 포함할 수 있었지만, 이는 별다른 경고 없이 무시되었습니다. MongoDB 통합은 이러한 테이블의 로드를 거부합니다. 이번 수정으로 MongoDB 엔진에 인수가 5개인 경우에는 이러한 테이블의 로드를 허용하고 경로 구성 요소를 무시하며, 인수에 지정된 데이터베이스 이름을 사용합니다. 참고: 이 수정은 새로 생성된 테이블이나 mongo 테이블 함수를 사용하는 쿼리에는 적용되지 않으며, 딕셔너리 소스와 이름이 지정된 컬렉션에도 적용되지 않습니다. #81942 (Vladimir Cherkasov).
기타 수정 사항