기본 schema_inference_make_columns_nullable 설정이 모든 값을 널 허용으로 만드는 대신, Parquet/ORC/Arrow 메타데이터에 포함된 컬럼의 널 허용(Nullable) 여부 정보를 반영하도록 변경되었습니다. 텍스트 포맷은 변경되지 않았습니다. #71499 (Michael Kolupaev).
쿼리 결과 캐시는 이제 log_comment 설정을 무시하므로, 쿼리에서 log_comment만 변경해도 캐시 미스가 발생하지 않습니다. 일부 사용자가 log_comment를 변경하여 의도적으로 캐시를 분할해 사용했을 가능성이 있습니다. 이 변경으로 해당 동작이 바뀌므로 이전 버전과 호환되지 않습니다. 이 목적에는 query_cache_tag 설정을 사용하십시오. #79878 (filimonov).
이전 버전에서는 테이블 함수의 이름이 연산자 구현 함수와 동일한 경우, 쿼리 포맷팅이 일관되지 않게 처리되었습니다. #81601를 해결합니다. #81977를 해결합니다. #82834를 해결합니다. #82835를 해결합니다. 이제 EXPLAIN SYNTAX 쿼리는 연산자를 포맷팅하지 않습니다. 이 새로운 동작은 구문을 설명하는 목적을 더 잘 반영합니다. clickhouse-format, formatQuery 등도 쿼리에 함수 형태로 포함된 경우에는 함수들을 연산자로 포맷팅하지 않습니다. #82825 (Alexey Milovidov).
IPv4/IPv6에 대한 의미 없는 이진 연산을 비활성화했습니다. IPv4/IPv6와 비정수 타입 간의 덧셈/뺄셈이 비활성화됩니다. 이전에는 부동 소수점 타입과의 연산을 허용했고, 다른 일부 타입(예: DateTime)에 대해서는 논리적 오류를 발생시켰습니다. #86336 (Raúl Marín).
기존 함수 hasToken과의 일관성을 높이기 위해 searchAny 및 searchAll 함수를 각각 hasAnyTokens 및 hasAllTokens로 이름을 변경했습니다. #88109 (Robert Schulze).
allow_dynamic_metadata_for_data_lakes 설정이 사용 중단(deprecate)되었습니다. 이제 모든 Iceberg 테이블은 각 쿼리를 실행하기 전에 스토리지에서 최신 테이블 스키마를 가져오도록 시도합니다. #86366 (Daniil Ivanik).
역색인 텍스트 인덱스가 RAM에 담을 수 없는 데이터셋에도 확장 가능하도록 처음부터 재설계되었습니다. #86485 (Anton Popov).
storage_metadata_write_full_object_key 서버 설정이 기본값으로 활성화되며, 더 이상 비활성화할 수 없습니다. #87335 (Sema Checherinda).
파일 시스템 캐시에서 cache_hits_threshold가 제거되었습니다. cache_hits_threshold는 SLRU 캐시 정책이 도입되기 전에 추가된 것으로, 이제 둘 모두를 지원할 필요는 없습니다. #88344 (Kseniia Sumarokova).
min_free_disk_ratio_to_perform_insert 및 min_free_disk_bytes_to_perform_insert 설정의 동작 방식에 두 가지 작은 변경 사항이 있습니다. 첫째, 삽입을 거부해야 하는지 판단할 때 사용 가능한 바이트 수 대신 예약되지 않은(unreserved) 바이트 수를 사용합니다. 백그라운드 머지와 뮤테이션을 위한 예약 용량이 설정된 임계값에 비해 작다면 이는 아마도 크게 중요하지 않을 수 있지만, 보다 올바른 방식으로 보입니다. 둘째, 이러한 설정을 system 테이블에는 적용하지 않습니다. 그 이유는 query_log와 같은 테이블은 계속 업데이트되도록 유지하고자 하기 때문입니다. 이는 디버깅에 큰 도움이 됩니다. system 테이블에 기록되는 데이터는 일반적으로 실제 데이터에 비해 작기 때문에, 합리적인 min_free_disk_ratio_to_perform_insert 임계값을 사용하면 훨씬 더 오랫동안 계속 동작할 수 있어야 합니다. #88468 (c-end).
Keeper 내부 복제를 위한 비동기 모드를 활성화합니다. Keeper는 이전과 동일한 동작을 유지하면서 성능이 향상될 수 있습니다. 23.9보다 이전 버전에서 업데이트하는 경우, 먼저 23.9+로 업데이트한 다음 25.10+로 다시 업데이트해야 합니다. 업데이트 전에 keeper_server.coordination_settings.async_replication을 0으로 설정하고, 업데이트가 완료된 후 다시 활성화할 수도 있습니다. #88515 (Antonio Andelic).
집계 함수 timeSeriesChangesToGrid 및 timeSeriesResetsToGrid를 추가했습니다. 시작 타임스탬프, 종료 타임스탬프, step, look back 윈도우에 대한 파라미터와 타임스탬프 및 값에 대한 두 개의 인수를 받는다는 점에서 timeSeriesRateToGrid와 유사하게 동작하지만, 윈도우당 최소 2개가 아니라 1개의 샘플만 필요로 합니다. PromQL changes/resets를 계산하여, 파라미터로 정의된 타임 그리드의 각 타임스탬프에 대해 지정된 윈도우 내에서 샘플 값이 변경되거나 감소하는 횟수를 셉니다. 반환 타입은 Array(Nullable(Float64))입니다. #86010 (Stephen Chi).
히스토그램 버킷의 상한과 누적 값을 인수로 받아, 분위수 위치가 속한 버킷의 상한과 하한 사이에서 선형 보간을 수행하는 집계 함수 quantilePrometheusHistogram을 추가했습니다. 기존 히스토그램에 대해 PromQL histogram_quantile() 함수와 유사하게 동작합니다. #86294 (Stephen Chi).
startsWith 및 endsWith 함수의 최적화된 대소문자 구분 없는(케이스 인센서티브) 변형을 추가했습니다: startsWithCaseInsensitive, endsWithCaseInsensitive, startsWithCaseInsensitiveUTF8, endsWithCaseInsensitiveUTF8. #87374 (Guang Zhao).
이제 NATS 엔진에 대해 새로운 설정인 nats_stream 및 nats_consumer를 지정하여 NATS JetStream을 사용해 메시지를 수신할 수 있습니다. #84799 (Dmitry Novikov).
디스크 구성을 지원하는 Iceberg 및 Delta Lake 테이블을 사용할 수 있습니다. 이를 통해 기존 디스크에 사용자 테이블을 지정할 수 있습니다. Iceberg에서 사용할 수 있는 디스크를 지정하는 설정 allowed_disks_for_table_engines가 추가되었습니다. 예시: CREATE TABLE test ENGINE = Iceberg('path/inside/disk') SETTING datalake_disk_name = '<some_user_disk>'; ### 사용자 대상 변경 사항에 대한 문서 항목입니다. #86778 (scanhex12).
파트를 wide part로 생성하기 위한 최소 레벨을 지정할 수 있는 새로운 테이블 설정 min_level_for_wide_part가 추가되었습니다. #88179 (Christoph Wurm).
긴 부분 문자열을 찾는 데 유용한 새로운 sparse_gram 블룸 필터 인덱스를 추가했습니다. #79985 (scanhex12).
MergeTree 테이블에서 모든 해당 컬럼에 대해 통계를 자동으로 생성하는 기능을 추가했습니다. 생성할 통계 유형을 쉼표로 구분해 저장하는 테이블 수준 설정 auto_statistics_types를 추가했습니다(예: auto_statistics_types = 'minmax, uniq, countmin'). #87241 (Anton Popov).
LIMIT BY ALL 구문을 지원합니다. GROUP BY ALL, ORDER BY ALL과 유사하게, LIMIT BY ALL은 SELECT 절의 비집계 표현식 전체를 자동으로 확장해 LIMIT BY 키로 사용합니다. 예를 들어, SELECT id, name, count(*) FROM table GROUP BY id LIMIT 1 BY ALL은 SELECT id, name, count(*) FROM table GROUP BY id LIMIT 1 BY id, name과 동일합니다. 이 기능은 선택된 비집계 컬럼 전체를 기준으로 제한해야 할 때 컬럼을 명시적으로 나열하지 않고도 쿼리를 단순화합니다. #59152 이슈를 해결합니다. #84079 (Surya Kant Ranjan).
쿼리 설정에서 설정 이름만 단독으로 사용된 경우 1과 동일하게 취급합니다(예: SELECT ... SETTINGS use_query_cache는 use_query_cache = 1과 동일합니다). #85800 (thraeka).
설정 max_named_collection_num_to_warn 및 max_named_collection_num_to_throw를 통해 named collection의 개수를 제한합니다. 새로운 메트릭 NamedCollection과 오류 TOO_MANY_NAMED_COLLECTIONS가 추가되었습니다. #87343 (Pablo Marcos).
searchAll 및 searchAny 함수가 이제 텍스트 컬럼이 아닌 컬럼에서도 동작합니다. 이러한 경우 기본 토크나이저를 사용합니다. #87722 (Jimmy Aguilar Mena).
비트 슬라이스(bit-sliced) 형식으로 벡터를 저장하는 QBit 데이터 타입과, 정밀도와 속도 간의 트레이드오프를 파라미터로 제어할 수 있는 근사 벡터 검색(approximate vector search)을 가능하게 하는 L2DistanceTransposed 함수를 구현했습니다. #87922 (Raufs Dunamalijevs).
Query Condition Cache(QCC)를 인덱스 분석과의 적용 순서 및 통합 방식을 리팩터링하여 쿼리 성능을 개선했습니다. 이제 QCC 필터링이 기본 키 및 스킵 인덱스 분석보다 먼저 적용되어 불필요한 인덱스 계산이 줄어듭니다. 인덱스 분석은 여러 개의 범위 필터를 지원하도록 확장되었으며, 필터링 결과는 QCC에 다시 저장됩니다. 이는 인덱스 분석이 실행 시간의 상당 부분을 차지하는 쿼리, 특히 스킵 인덱스(예: 벡터 인덱스나 역인덱스)에 크게 의존하는 쿼리를 상당히 빠르게 합니다. #82380 (Amos Bird).
작은 쿼리를 더 빠르게 실행하기 위한 여러 가지 마이크로 최적화를 적용했습니다. #83096 (Raúl Marín).
네이티브 프로토콜에서 로그와 프로파일 이벤트를 압축하도록 변경했습니다. 100개 이상의 레플리카가 있는 클러스터에서 비압축 프로파일 이벤트는 초당 1~10 MB를 사용하며, 느린 인터넷 연결에서는 진행 표시줄이 느리게 동작합니다. 이 변경으로 #82533 이슈가 해결되었습니다. #83586 (Alexey Milovidov).
func(primary_column) = 'xx', column in (xxx)와 같은 조건에 대한 PREWHERE 최적화를 개선했습니다. #85529 (李扬).
uuid로 필터링하는 system.tables에 대해 전체 스캔을 피하도록 했습니다(로그나 ZooKeeper 경로에서 UUID만 있는 경우에 유용할 수 있습니다). #88379 (Azat Khuzhin).
분리된 논리합(disjunction) JOIN 프레디케이트에 대한 푸시다운 로직을 제공합니다. 예를 들어 TPC-H Q7에서 두 테이블 n1, n2에 대한 조건 (n1.n_name = 'FRANCE' AND n2.n_name = 'GERMANY') OR (n1.n_name = 'GERMANY' AND n2.n_name = 'FRANCE') 의 경우, 각 테이블에 대해 n1.n_name = 'FRANCE' OR n1.n_name = 'GERMANY' (n1용), n2.n_name = 'GERMANY' OR n2.n_name = 'FRANCE' (n2용)와 같은 개별 부분 필터를 추출합니다. #84735 (Yarik Briukhovetskyi).
JOIN 재작성 기능을 구현했습니다. 1. 매치된 행 또는 매치되지 않은 행에 대해 필터 조건이 항상 false인 경우, LEFT ANY JOIN 과 RIGHT ANY JOIN 을 SEMI/ANTI JOIN 으로 변환합니다. 이 최적화는 새 설정 query_plan_convert_any_join_to_semi_or_anti_join 으로 제어합니다. 2. 한쪽에서 매치되지 않은 행에 대해 필터 조건이 항상 false인 경우, FULL ALL JOIN 을 LEFT ALL 또는 RIGHT ALL JOIN 으로 변환합니다. #86028 (Dmitry Novik).
많은 미매칭 행이 존재하는 LEFT/RIGHT JOIN 의 경우 HashJoin 성능을 소폭 최적화했습니다. #86312 (Nikita Taranov).
JOIN 순서 재조정이 이제 통계를 사용합니다. allow_statistics_optimize = 1 및 query_plan_optimize_join_order_limit = 10 으로 설정하여 기능을 활성화할 수 있습니다. #86822 (Han Fei).
JOIN 최적화 중 런타임 해시 테이블 통계 재계산을 건너뜁니다. 새로운 프로파일 이벤트 JoinOptimizeMicroseconds 및 QueryPlanOptimizeMicroseconds 를 추가했습니다. #87683 (Vladimir Cherkasov).
일부 경우 더 나은 JOIN 성능을 위해 AddedColumns::appendFromBlock 을 인라인화했습니다. #88455 (Nikita Taranov).
MergeTree 테이블의 최상위 String 컬럼에 대해 선택적인 .size 서브컬럼 직렬화를 추가하여 압축을 개선하고 효율적인 서브컬럼 액세스를 가능하게 합니다. 직렬화 버전 제어 및 빈 문자열에 대한 표현식 최적화를 위한 새로운 MergeTree 설정을 도입합니다. #82850 (Amos Bird).
테이블에 SimpleAggregateFunction(anyLast) 타입의 컬럼이 있을 때, AggregatingMergeTree 테이블에서 FINAL과 함께 SELECT를 수행할 경우 메모리 할당 및 메모리 복사를 줄입니다. #84428 (Duc Canh Le).
is_deleted 컬럼이 있는 ReplacingMergeTree 테이블에서 FINAL 절을 사용하는 SELECT 쿼리는, 기존 두 가지 최적화로 인한 병렬화 향상 덕분에 더 빠르게 실행됩니다. 1) 테이블의 파티션 중 단일 part만 있는 파티션에 대해 do_not_merge_across_partitions_select_final 최적화를 적용합니다. 2) 테이블의 나머지 선택된 범위를 교차/비교차(intersecting / non-intersecting)로 분할하고, FINAL 병합 변환을 통과해야 하는 범위를 교차 범위로만 제한합니다. #88090 (Shankar Iyer).
mannWhitneyUTest는 두 샘플이 모두 동일한 값만 포함하는 경우 더 이상 예외를 발생시키지 않습니다. 이제 SciPy와 일치하는 올바른 결과를 반환합니다. 이로써 다음 이슈가 해결되었습니다: #79814. #80009 (DeanNeaht).
실험적인 조인 순서 최적화 기능이 추가되어, query_plan_optimize_join_order_limit 설정을 통해 제어하면서 성능 향상을 위해 JOIN 순서를 자동으로 재정렬할 수 있습니다. 조인 순서 최적화는 현재 제한적인 STATISTICS 지원만 제공하며, 주로 스토리지 엔진의 행 수 추정에 의존합니다. 보다 정교한 STATISTICS 수집 및 카디널리티 추정 기능은 향후 릴리스에서 추가될 예정입니다. 업그레이드 후 JOIN 쿼리에서 문제가 발생하는 경우, SET query_plan_use_new_logical_join_step = 0으로 설정하여 새 구현을 일시적으로 비활성화한 뒤, 조사를 위해 문제를 보고하면 됩니다. USING 절에서 식별자 해석에 대한 참고 사항: OUTER JOIN ... USING 절에서 통합(코얼레스) 컬럼을 해석하는 방식을 더 일관되게 변경했습니다. 이전에는 OUTER JOIN에서 USING 컬럼과 한정된 컬럼(a, t1.a, t2.a)을 모두 선택할 때, USING 컬럼이 잘못 t1.a로 해석되어 오른쪽 테이블에서 왼쪽과 매칭되지 않는 행에 대해 0/NULL이 표시되는 문제가 있었습니다. 이제 USING 절의 식별자는 항상 통합(코얼레스) 컬럼으로 해석되고, 한정된 식별자는 쿼리에 어떤 다른 식별자가 존재하는지와 관계없이 비(非) 통합 컬럼으로 해석됩니다. 예시는 다음과 같습니다: ```sql SELECT a, t1.a, t2.a FROM (SELECT 1 as a WHERE 0) t1 FULL JOIN (SELECT 2 as a) t2 USING (a) -- 이전: a=0, t1.a=0, t2.a=2 (잘못됨 - 'a'가 t1.a로 해석됨) -- 이후: a=2, t1.a=0, t2.a=2 (올바름 - 'a'가 통합된 값). #80848 (Vladimir Cherkasov).
데이터 읽기 시 스킵 인덱스를 사용해 데이터 파트를 필터링함으로써 불필요한 인덱스 읽기를 줄이도록 지원합니다. 새 설정 use_skip_indexes_on_data_read로 제어되며(기본값 비활성화), #75774를 해결합니다. 또한 #81021과(와) 공유되는 일부 공통 기반 코드를 포함합니다. #81526 (Amos Bird).
HTTP 클라이언트가 Expect: 100-continue 헤더와 함께 X-ClickHouse-100-Continue: defer 헤더를 설정하면, ClickHouse는 QUOTA 검증이 통과된 이후까지 클라이언트에 100 Continue 응답을 보내지 않으므로, 어차피 폐기될 요청 본문을 전송하느라 네트워크 대역폭이 낭비되는 것을 방지합니다. 이는 쿼리를 URL 쿼리 문자열로 전송하고 데이터를 요청 본문으로 전송하는 INSERT 쿼리에 특히 해당합니다. 전체 본문을 보내지 않고 요청을 중단하면 HTTP/1.1에서 연결을 재사용할 수 없게 되지만, 새로운 연결을 여는 데 따른 추가 지연 시간은 일반적으로 대량의 데이터를 포함한 INSERT 수행 전체 시간에 비하면 무시할 수 있는 수준입니다. #84304 (c-end).
실행 시 오른쪽 서브트리에서 블룸 필터를 생성하고 이 필터를 왼쪽 서브트리의 스캔에 전달하여 일부 JOIN 쿼리의 실행 속도를 높입니다. 이는 SELECT avg(o_totalprice) FROM orders, customer, nation WHERE c_custkey = o_custkey AND c_nationkey=n_nationkey AND n_name = 'FRANCE'와 같은 쿼리에 유용할 수 있습니다. #84772 (Alexander Gololobov).
materialized view를 생성할 때 TO 뒤에 쿼리 매개변수를 사용할 수 있습니다. 예를 들면 다음과 같습니다: CREATE MATERIALIZED VIEW mv TO {to_table:Identifier} AS SELECT * FROM src_table. #84899 (Diskein).
S3 스토리지를 사용하는 DATABASE ENGINE = Backup에서 로그에 S3 자격 증명이 노출되지 않도록 마스킹합니다. #85336 (Kenny Sun).
jemalloc을 더 최신 버전으로 업데이트합니다. jemalloc의 내부 도구를 기반으로 메모리 할당 프로파일링을 개선합니다. 전역 jemalloc 프로파일러는 이제 설정 jemalloc_enable_global_profiler를 사용하여 활성화할 수 있습니다. 샘플링된 전역 메모리 할당 및 해제 정보는 설정 jemalloc_collect_global_profile_samples_in_trace_log을 활성화하면 JemallocSample 유형으로 system.trace_log에 저장할 수 있습니다. jemalloc 프로파일링은 이제 설정 jemalloc_enable_profiler를 사용하여 쿼리별로 독립적으로 활성화할 수 있습니다. system.trace_log에 샘플을 저장할지 여부는 설정 jemalloc_collect_profile_samples_in_trace_log를 사용하여 쿼리별로 제어할 수 있습니다. #85438 (Antonio Andelic).
deltaLakeAzureCluster 함수(클러스터에서 사용하는 deltaLakeAzure와 유사)와 deltaLakeS3Cluster(deltaLakeCluster의 별칭) 함수를 추가했습니다. #85358 이슈를 해결했습니다. #85547 (Smita Kulkarni).
InterpreterSystemQuery::dropReplicaImpl을 InterpreterSystemQuery::dropStorageReplica로 이름을 변경했습니다. - InterpreterSystemQuery::dropDatabaseReplica에서: - 데이터베이스 단위로 또는 전체 레플리카를 삭제할 때, 해당 데이터베이스의 각 테이블에 대해서도 레플리카를 삭제합니다. - 「WITH TABLES」가 지정되면, 각 storage에 대한 레플리카를 삭제합니다. - 그렇지 않으면 로직은 변경되지 않으며, 데이터베이스에 대해서만 DatabaseReplicated::dropReplica를 호출합니다. - Keeper 경로로 데이터베이스 레플리카를 삭제하는 경우: - 「WITH TABLES」가 지정되면: - 데이터베이스를 Atomic으로 복원합니다. - Keeper에 있는 statement를 기반으로 RMT 테이블을 복원합니다. - 데이터베이스를 삭제합니다(복원된 테이블도 함께 삭제됩니다). - 그렇지 않으면, 지정된 Keeper 경로에 대해서만 DatabaseReplicated::dropReplica를 호출합니다. #85637 (Tuan Pham Anh).
백업과 동일한 방식으로 일반 복사 작업에서도 azure_max_single_part_copy_size 설정을 적용합니다. #85767 (Ilya Golshtein).
S3 객체 스토리지에서 재시도 가능한 오류가 발생할 때 S3 클라이언트 스레드의 속도를 늦춥니다. 이에 따라 이전 설정인 backup_slow_all_threads_after_retryable_s3_error를 S3 디스크에도 확장하고, 보다 일반적인 이름인 s3_slow_all_threads_after_retryable_error로 변경합니다. #85918 (Julia Kartseva).
설정 allow_experimental_variant/dynamic/json 및 enable_variant/dynamic/json을 사용 중단(폐기)된 것으로 표시했습니다. 이제 세 가지 타입 모두 조건 없이 활성화됩니다. #85934 (Pavel Kruglov).
S3(Azure)Queue 테이블 엔진을 개선하여 ZooKeeper 연결이 끊기더라도 중복이 발생하지 않고 계속 동작할 수 있도록 했습니다. 이를 위해 S3Queue 설정 use_persistent_processing_nodes를 활성화해야 합니다(ALTER TABLE MODIFY SETTING으로 변경 가능). #85995 (Kseniia Sumarokova).
Iceberg 테이블 상태는 더 이상 스토리지 객체에 저장되지 않습니다. 이로 인해 ClickHouse에서 Iceberg를 동시 쿼리 환경에서도 사용할 수 있게 되었습니다. #86062 (Daniil Ivanik).
query_condition_cache_selectivity_threshold 설정(기본값: 1.0)이 추가되어, 선택도가 낮은 프레디케이트의 스캔 결과를 query condition cache에 삽입하지 않도록 했습니다. 이를 통해 캐시 적중률이 다소 떨어지는 대신, query condition cache의 메모리 사용량을 줄일 수 있습니다. #86076 (zhongyuankai).
http_handlers에서 스키마와 host:port를 포함한 전체 URL 문자열(full_url 지시어)을 기준으로 필터링하는 기능을 지원합니다. #86155 (Azat Khuzhin).
Delta Lake 쓰기를 위한 실험적 설정 allow_experimental_delta_lake_writes를 추가했으며, 기본값은 비활성화되어 있습니다. #86180 (Kseniia Sumarokova).
새로운 startup_scripts_failure_reason 차원 메트릭을 추가합니다. 이 메트릭은 시작 스크립트가 실패하게 되는 서로 다른 오류 유형을 구분하는 데 필요합니다. 특히 알림 목적을 위해, 일시적 오류(예: MEMORY_LIMIT_EXCEEDED 또는 KEEPER_EXCEPTION)와 비일시적 오류를 구분해야 합니다. #86202 (Miсhael Stetsyuk).
Iceberg 테이블의 파티션에서 identity() 함수를 생략할 수 있도록 했습니다. #86314 (scanhex12).
특정 채널에만 JSON 로깅을 활성화할 수 있는 기능이 추가되었습니다. 이 기능을 사용하려면 logger.formatting.channel을 syslog/console/errorlog/log 중 하나로 설정합니다. #86331 (Azat Khuzhin).
Delta Lake에 삽입되는 데이터 파일에 대해 행/바이트 수 제한을 추가합니다. delta_lake_insert_max_rows_in_data_file 및 delta_lake_insert_max_bytes_in_data_file 설정으로 제어됩니다. #86357 (Kseniia Sumarokova).
WHERE에서 네이티브 숫자를 직접 사용할 수 있도록 허용합니다. 이 숫자들은 이미 논리 함수의 인수로 사용할 수 있습니다. 이를 통해 filter-push-down 및 move-to-prewhere 최적화가 단순화됩니다. #86390 (Nikolai Kochetov).
메타데이터가 손상된 Catalog에 대해 SYSTEM DROP REPLICA를 실행했을 때 발생하던 오류를 수정했습니다. #86391 (Nikita Mikhaylov).
Azure에서 디스크 액세스 검사(skip_access_check=0)에 대해 추가 재시도를 수행하도록 했습니다. 액세스 프로비저닝에 상당한 시간이 걸릴 수 있기 때문입니다. #86419 (Alexander Tokmakov).
설정 evaluation_time의 이름을 promql_evaluation_time으로 변경합니다. #86459 (Vitaly Baranov).
쿼리의 메모리 사용량을 위한 비동기 메트릭(QueriesMemoryUsage 및 QueriesPeakMemoryUsage)을 추가했습니다. #86669 (Azat Khuzhin).
clickhouse-benchmark --precise 플래그를 사용하면 QPS 및 기타 구간별 메트릭을 더 정밀하게 보고할 수 있습니다. 이 플래그는 쿼리 실행 시간이 보고 간격 --delay D와 비슷한 경우에도 일관된 QPS를 유지하는 데 도움이 됩니다. #86684 (Sergei Trifonov).
일부 Linux 스레드(merge/mutate, 쿼리, materialized view, zookeeper 클라이언트)에 더 높거나 낮은 우선순위를 부여할 수 있도록 nice 값을 구성 가능하도록 했습니다. #86703 (Miсhael Stetsyuk).
경쟁 상태(race condition)로 인해 multipart 업로드에서 원래 예외가 손실될 때 발생하는, 오해의 소지가 있는 「specified upload does not exist」 오류를 수정합니다. #86725 (Julia Kartseva).
EXPLAIN 쿼리에서 쿼리 플랜 설명을 제한합니다. EXPLAIN이 아닌 쿼리에는 이 설명을 계산하지 않습니다. 새 설정 query_plan_max_step_description_length가 추가되었습니다. #86741 (Nikolai Kochetov).
query_profiler_real_time_period_ns/query_profiler_cpu_time_period_ns와 같은 쿼리 프로파일러에서 발생하는 CANNOT_CREATE_TIMER 문제를 완화할 수 있도록, 보류 중인 시그널을 튜닝할 수 있는 기능을 추가했습니다. 또한 자체 진단을 위해 /proc/self/status에서 SigQ를 수집하도록 했습니다 (ProcessSignalQueueSize가 ProcessSignalQueueLimit에 근접하면 CANNOT_CREATE_TIMER 오류가 발생할 가능성이 높습니다). #86760 (Azat Khuzhin).
이제 일반 재기록 가능 디스크에서 디렉터리를 제거할 때 prefix.path에 대한 blob 크기를 기록합니다. #86908 (alesapin).
yesterday() FUNCTION을 대소문자를 구분하지 않고 사용할 수 있도록 하고, today() FUNCTION과 동작을 일치시켰습니다. #86914 (Kaviraj Kanagaraj).
.xml 기반 성능 테스트를 ClickHouse Cloud를 포함한 원격 ClickHouse 인스턴스에서 실행할 수 있도록 지원합니다. 사용 예시: tests/performance/scripts/perf.py tests/performance/math.xml --runs 10 --user <username> --password <password> --host <hostname> --port <port> --secure. #86995 (Raufs Dunamalijevs).
상당한 양(>16MiB)의 메모리를 할당하는 것으로 알려진 정렬, 비동기 INSERT, file log 등의 일부 연산에서 메모리 제한을 준수하도록 했습니다. #87035 (Azat Khuzhin).
쿼리에서 boolean이 아닌 설정 값이 적용되지 않는 문제를 방지합니다. #85800의 개선 사항입니다. #87084 (thraeka).
원격 레플리카에서는 프로젝션이 없으면 인덱스 분석을 수행하지 않습니다. #87096 (zoomxi).
network_compression_method 설정이 지원되는 일반 코덱이 아닌 값으로 되어 있으면 예외를 발생시킵니다. #87097 (Robert Schulze).
시스템 테이블 system.query_cache는 이제 모든 쿼리 결과 캐시 엔트리를 반환하며, 이전에는 공유 엔트리 또는 동일한 USER와 역할에 대한 비공유 엔트리만 반환했습니다. 비공유 엔트리는 쿼리 결과를 노출하지 않도록 설계되어 있고, system.query_cache는 쿼리 문자열을 반환하므로 이는 문제가 되지 않습니다. 이로써 시스템 테이블의 동작이 system.query_log와 더 유사해졌습니다. #87104 (Robert Schulze).
AWS에서 지원하는 Intelligent Tiering을 지정할 수 있도록 storage_class_name이라는 새 매개변수를 S3 테이블 엔진과 s3 테이블 함수에 추가했습니다. 키-값 형식과 위치 기반(사용 중단 예정) 형식 모두를 지원합니다. #87122 (alesapin).
clickhouse-benchmark에서 CLI 플래그에 _ 대신 -를 사용할 수 있도록 변경했습니다. #87251 (Ahmed Gouda).
세션 설정을 추가하여 INSERT 시 구체화에서 제외할 skip 인덱스 목록을 지정할 수 있도록 했습니다 (exclude_materialize_skip_indexes_on_insert). 머지 작업 동안 구체화에서 제외할 skip 인덱스 목록을 지정하는 MergeTree 테이블 설정을 추가했습니다 (exclude_materialize_skip_indexes_on_merge). #87252 (George Larionov).
join_keys의 개수와 right_table_keys의 개수가 같지 않음을 정확하게 알리도록 joinGet 오류 메시지를 개선했습니다. #87279 (Isak Ellmer).
min_insert_block_size_rows_for_materialized_views 및 min_insert_block_size_bytes_for_materialized_views 설정에 따라 모든 스레드에서 오는 데이터를 materialized view에 삽입하기 전에 먼저 병합합니다. 이전에는 parallel_view_processing이 활성화된 경우, 특정 materialized view에 삽입하는 각 스레드가 데이터를 독립적으로 병합하여 생성되는 파트 수가 더 많아질 수 있었습니다. #87280 (Antonio Andelic).
이 패치는 쓰기 트랜잭션 중 임의의 Keeper 노드의 상태(stat)를 확인할 수 있는 기능을 추가합니다. 이는 ABA 문제를 감지하는 데 도움이 됩니다. #87282 (Mikhail Artemenko).
이 패치는 디스크 트랜잭션의 메타데이터에 대해 모든 워크로드에서 unlink/rename/removeRecursive/removeDirectory 등 연산의 롤백과 하드링크 개수 처리를 수정하고, 인터페이스를 보다 범용적이고 단순하게 만들어 다른 메타 스토어에서도 재사용할 수 있도록 합니다. #87358 (Mikhail Artemenko).
Keeper에서 TCP_NODELAY를 비활성화할 수 있는 keeper_server.tcp_nodelay 구성 파라미터가 추가되었습니다. #87363 (Copilot).
clickhouse-benchmarks에서 --connection을 지원합니다. 이는 clickhouse-client에서 지원하는 것과 동일하며, 명령줄 인수로 사용자/비밀번호를 명시적으로 지정하지 않기 위해 클라이언트 config.xml/config.yaml의 connections_credentials 경로 아래에 미리 정의된 연결 정보를 지정할 수 있습니다. clickhouse-benchmark에 --accept-invalid-certificate 지원을 추가합니다. #87370 (Azat Khuzhin).
이제 Iceberg 테이블에도 max_insert_threads 설정이 적용됩니다. #87407 (alesapin).
PrometheusMetricsWriter에 히스토그램 및 차원 메트릭을 추가합니다. 이렇게 하면 PrometheusRequestHandler가 모든 필수 메트릭을 포함하게 되어 Cloud 환경에서 신뢰성이 높고 오버헤드가 낮은 메트릭 수집에 사용할 수 있습니다. #87521 (Miсhael Stetsyuk).
Array 및 Map (mapKeys 및 mapValues) 값에 대한 텍스트 인덱스 지원을 추가했습니다. 지원되는 함수는 mapContainsKey와 has입니다. #87602 (Elmi Ahmadov).
만료된 전역 ZooKeeper 세션 수를 나타내는 새 ZooKeeperSessionExpired 메트릭을 추가했습니다. #87613 (Miсhael Stetsyuk).
서버 측(네이티브)에서 백업 대상지로 복사할 때는 백업 전용 설정(예: backup_slow_all_threads_after_retryable_s3_error)이 적용된 S3 스토리지 클라이언트를 사용합니다. s3_slow_all_threads_after_retryable_error 설정은 더 이상 사용되지 않습니다. #87660 (Julia Kartseva).
실험적 기능인 make_distributed_plan을 사용할 때 쿼리 플랜 직렬화 과정에서 설정 max_joined_block_size_rows 및 max_joined_block_size_bytes가 잘못 처리되던 문제를 수정합니다. #87675 (Vladimir Cherkasov).
enable_http_compression 설정이 이제 기본값으로 활성화되었습니다. 이는 클라이언트가 HTTP 압축을 지원하면 서버가 이를 사용하게 됨을 의미합니다. 그러나 이 변경에는 몇 가지 단점이 있습니다. 클라이언트가 bzip2와 같이 지나치게 무거운 압축 방식을 요청할 수 있는데, 이는 비합리적이며 서버의 리소스 사용량을 증가시킵니다(다만 큰 결과를 전송할 때만 눈에 띕니다). 클라이언트가 gzip을 요청할 수도 있는데, 이는 그리 나쁜 선택은 아니지만 zstd에 비해 최적의 선택은 아닙니다. #71591 이슈를 종료합니다. #87703 (Alexey Milovidov).
ClickHouse가 연결할 수 있는 [Zoo]Keeper 호스트 목록을 확인할 수 있는 새로운 설정 keeper_hosts가 추가되었습니다. #87718 (Nikita Mikhaylov).
ALTER TABLE REWRITE PARTS를 추가합니다. 이 명령은 테이블의 파트들을 처음부터 다시 작성하여 모든 새 설정을 사용합니다(예: use_const_adaptive_granularity와 같이 일부 설정은 새로 생성되는 파트에만 적용되기 때문입니다). #87774 (Azat Khuzhin).
joined_block_split_single_row라는 새로운 설정을 추가하여, 키당 일치하는 항목이 많은 해시 조인(hash join)에서 메모리 사용량을 줄입니다. 이 설정을 사용하면 왼쪽 테이블의 단일 행에 대한 일치 결과 내부에서도 해시 조인 결과를 청크로 분할할 수 있으며, 이는 왼쪽 테이블의 하나의 행이 오른쪽 테이블의 수천 또는 수백만 개의 행과 일치하는 경우에 특히 유용합니다. 이전에는 모든 일치 결과를 메모리에 한 번에 구체화해야 했습니다. 이로 인해 최대 메모리 사용량은 줄어들지만 CPU 사용량은 증가할 수 있습니다. #87913 (Vladimir Cherkasov).
Keeper 요청 크기를 제한할 수 있는 기능을 추가했습니다 (ZooKeeper의 jute.maxbuffer와 동일한 max_request_size 설정으로, 이전 버전과의 호환성을 위해 기본값은 OFF이며, 향후 릴리스에서 기본값이 설정될 예정입니다). #87952 (Azat Khuzhin).
clickhouse-benchmark에서 기본적으로 오류 메시지에 스택 트레이스를 포함하지 않도록 수정했습니다. #87954 (Ahmed Gouda).
마크가 캐시에 있을 때는 스레드 풀 비동기 마크 로딩(load_marks_asynchronously=1)을 사용하지 마십시오(스레드 풀이 과부하 상태일 수 있고, 마크가 이미 캐시에 있더라도 쿼리에 추가 오버헤드 비용이 발생할 수 있기 때문입니다). #87967 (Azat Khuzhin).
Ytsaurus: 컬럼의 부분집합만 포함하는 테이블, table function 및 dictionary를 생성할 수 있도록 했습니다. #87982 (MikhailBurdukov).
이제 system.zookeeper_connection_log가 기본값으로 활성화되며, Keeper 세션에 대한 정보를 얻는 데 사용할 수 있습니다. #88011 (János Benjamin Antal).
중복된 외부 테이블이 전달될 때 TCP와 HTTP 동작이 일관되게 동작하도록 수정했습니다. HTTP에서는 임시 테이블을 여러 번 전달할 수 있습니다. #88032 (Sema Checherinda).
글로벌 샘플링 프로파일러를 기본적으로 활성화합니다. CPU 시간과 실제 시간 기준으로 10초마다 모든 스레드의 스택 트레이스를 수집합니다. #88209 (Alexander Tokmakov).
Alias 엔진을 사용하는 테이블에서 EXCHANGE TABLES 연산 지원이 수정되었습니다. 이제 해당 엔진은 대상 테이블을 상수 storage id 대신 데이터베이스 이름과 테이블 이름으로 저장하여, 테이블 교환 이후에도 대상 테이블을 올바르게 해석할 수 있습니다. #88233 (Kai Zhu).
임시 파일 작성기(writer)용 버퍼 크기를 제어하기 위한 temporary_files_buffer_size 설정을 추가합니다. * LowCardinality 컬럼에 대해 scatter 연산(예: Grace hash join에서 사용)을 최적화하여 메모리 사용을 개선합니다. #88237 (Vladimir Cherkasov).
병렬 레플리카 환경에서 텍스트 인덱스를 직접 읽는 기능을 추가했습니다. 객체 스토리지에서 텍스트 인덱스를 읽을 때의 성능을 개선했습니다. #88262 (Anton Popov).
이제 generateSerialID FUNCTION이 시리즈 이름을 나타내는 non-constant(비상수) 인자도 지원합니다. #83750 이슈를 해결합니다. #88270 (Alexey Milovidov).
keeper_server.coordination_settings.check_node_acl_on_remove 설정을 추가합니다. 이 설정을 활성화하면 각 노드를 삭제하기 전에 해당 노드와 상위 노드의 ACL이 모두 검증됩니다. 비활성화된 경우에는 상위 노드의 ACL만 검증됩니다. #88513 (Antonio Andelic).
이 패치 적용 후에는 휴리스틱 to_remove_small_parts_at_right가 머지 범위 점수를 계산하기 전에 실행됩니다. 이전에는 머지 셀렉터가 범위가 넓은 머지를 선택한 뒤 그 끝부분을 필터링했습니다. 수정: #85374. #88736 (Mikhail Artemenko).
부팅 시 자동 시작되도록 clickhouse-keeper의 postinstall 스크립트에 단계를 추가했습니다. #88746 (YenchangChan).
Web UI에서 자격 증명 검증을 모든 키 입력 시마다가 아니라 붙여넣기 시점에만 수행하도록 변경했습니다. 이를 통해 잘못 구성된 LDAP 서버에서 발생하는 문제를 방지합니다. #85777을(를) 해결했습니다. #88769 (Alexey Milovidov).
제한 조건 위반 시 예외 메시지의 길이를 제한합니다. 이전 버전에서는 매우 긴 문자열이 삽입될 경우 매우 긴 예외 메시지가 생성되어 query_log에 기록되는 문제가 있을 수 있었습니다. #87032를 해결합니다. #88801 (Alexey Milovidov).
복제 데이터베이스와 내부적으로 복제되는 테이블에서는 alter 쿼리의 결과를 이니시에이터 노드에서만 검증합니다. 이를 통해 이미 커밋된 alter 쿼리가 다른 노드에서 멈춰 버리던 상황이 해결됩니다. #83849 (János Benjamin Antal).
BackgroundSchedulePool에서 각 유형의 태스크 수를 제한합니다. 한 유형의 태스크가 모든 슬롯을 차지하여 다른 태스크가 실행되지 못하는 상황을 방지합니다. 또한 태스크가 서로를 기다리다가 교착 상태에 빠지는 상황도 방지합니다. 이는 background_schedule_pool_max_parallel_tasks_per_type_ratio 서버 설정으로 제어됩니다. #84008 (Alexander Tokmakov).
initiator 노드의 서브쿼리에서 shardNum()과 같은 호스트 종속 함수를 올바르게 해석하지 못하던 문제를 수정합니다. #84409 (Eduard Karacharov).
데이터베이스 레플리카를 복구할 때 테이블이 올바르게 종료되도록 했습니다. 테이블이 제대로 종료되지 않으면 데이터베이스 레플리카 복구 중 일부 테이블 엔진에서 LOGICAL_ERROR가 발생할 수 있었습니다. #84744 (Antonio Andelic).
데이터베이스 이름에 대한 오타 교정 힌트를 생성할 때 액세스 권한을 확인하도록 했습니다. #85371 (Dmitry Novik).
parseDateTime64BestEffort, change{Year,Month,Day}, makeDateTime64와 같은 여러 날짜/시간 관련 함수에서 epoch 이전 날짜의 소수 초 부분을 잘못 처리하던 문제를 수정했습니다. 이전에는 초 단위에서 소수 초를 더하는 대신 빼고 있었습니다. 예를 들어 parseDateTime64BestEffort('1969-01-01 00:00:00.468') 호출 결과가 1969-01-01 00:00:00.468가 아니라 1968-12-31 23:59:59.532를 반환하고 있었습니다. #85396 (xiaohuanlin).
ClickHouse Keeper는 이제 커널 수준에서 IPv6가 비활성화된 시스템(예: ipv6.disable=1이 설정된 RHEL)에서도 더 이상 시작에 실패하지 않습니다. 초기 IPv6 리스너를 시작하는 데 실패하면 IPv4 리스너로 폴백을 시도합니다. #85901 (jskong1124).
이 PR은 #77990 이슈를 닫습니다. globalJoin에서 병렬 레플리카를 위한 TableFunctionRemote 지원을 추가했습니다. #85929 (zoomxi).
OrcSchemaReader::initializeIfNeeded()에서 null 포인터 문제를 수정합니다. 이 PR은 다음 이슈를 해결합니다: #85292. #85951 (yanglongwei).
다른 컬럼의 구체화된 표현식에서 사용되는 서브컬럼을 포함하는 컬럼에 대한 ALTER UPDATE 동작을 수정했습니다. 이전에는 표현식에 서브컬럼이 포함된 구체화된 컬럼이 정상적으로 업데이트되지 않았습니다. #85985 (Pavel Kruglov).
기본 키(PK)나 파티션 표현식에 서브컬럼이 사용되고 있는 컬럼은 변경할 수 없도록 했습니다. #86005 (Pavel Kruglov).
같은 ALTER 문 내에서 컬럼 상태가 변경될 때 ALTER COLUMN IF EXISTS 명령이 실패하던 문제를 수정했습니다. 이제 DROP COLUMN IF EXISTS, MODIFY COLUMN IF EXISTS, COMMENT COLUMN IF EXISTS, RENAME COLUMN IF EXISTS와 같은 명령이, 동일한 ALTER 문 내에서 이전 명령에 의해 컬럼이 삭제되는 경우를 올바르게 처리합니다. #86046 (xiaohuanlin).
plain_rewritable 디스크에 대해 Azure Blob Storage에서 빈 blob을 읽을 때 발생하던 416 The range specified is invalid for the current size of the resource. The range specified is invalid for the current size of the resource 오류를 수정합니다. #86400 (Julia Kartseva).
DDL 작업을 처리할 때 충돌이 발생하지 않도록 loopback host ID를 올바르게 처리하도록 수정:. #86479 (Tuan Pham Anh).
numeric/decimal 컬럼이 있는 PostgreSQL 데이터베이스 엔진 테이블의 detach/attach 동작을 수정합니다. #86480 (Julian Maicher).
getSubcolumnType에서 초기화되지 않은 메모리를 사용하는 버그를 수정했습니다. #86498 (Raúl Marín).
이제 searchAny 및 searchAll 함수가 빈 needle 인자로 호출될 때 true(즉, 「모든 항목과 일치(matches everything)」)를 반환합니다. 이전에는 false를 반환했습니다(issue #86300). #86500 (Elmi Ahmadov).
첫 번째 버킷에 값이 없을 때 timeSeriesResampleToGridWithStaleness() 함수가 올바르게 동작하도록 수정했습니다. #86507 (Vitaly Baranov).
merge_tree_min_read_task_size가 0으로 설정되어 있을 때 발생하던 크래시를 수정합니다. #86527 (yanglongwei).
데이터를 읽을 때 각 데이터 파일의 포맷을 테이블 인수가 아니라 Iceberg 메타데이터에서 가져오도록 했습니다. #86529 (Daniil Ivanik).
AggregateFunction(quantileDD) 컬럼에 일부 유효한 사용자 제출 데이터가 병합 과정에서 무한 재귀를 일으켜 크래시가 발생하던 문제를 수정합니다. #86560 (Raphaël Thériault).
비동기 로깅(async logging)에서 추적된 메모리가 누수되어 10시간 동안 약 100GiB 수준의 큰 편차가 발생할 수 있는 문제와, text_log에서 거의 동일한 수준의 편차가 발생할 수 있는 문제를 방지합니다. #87584 (Azat Khuzhin).
materialized view가 비동기적으로 삭제된 뒤 백그라운드 정리가 완료되기 전에 서버를 재시작한 경우, View 또는 materialized view의 SELECT 설정 때문에 전역 서버 설정이 덮어써질 수 있던 버그를 수정했습니다. #87603 (Alexander Tokmakov).
AzureBlobStorage에서 먼저 네이티브 복사를 시도하고, 'Unauthroized' 오류가 발생하면 읽기 및 쓰기 방식으로 동작하도록 업데이트했습니다(AzureBlobStorage에서 소스와 대상의 스토리지 계정이 서로 다른 경우 'Unauthorized' 오류가 발생합니다). 또한 구성에서 endpoint가 정의되어 있을 때 "use_native_copy"가 적용되지 않던 문제를 수정했습니다. #87826 (Smita Kulkarni).
ArrowStream 파일에 고유하지 않은 딕셔너리가 있으면 ClickHouse가 비정상 종료됩니다. #87863 (Ilya Golshtein).
TTL이 설정된 컬럼을 가진 MergeTree 테이블에서 발생할 수 있었던 데이터 손상 문제를 수정했습니다. #88095 (Anton Popov).
빈 튜플 인수로 호출될 때 mortonEncode 및 hilbertEncode 함수가 충돌하던 문제를 수정했습니다. #88110 (xiaohuanlin).
이제 클러스터에 비활성 레플리카가 있는 경우 ON CLUSTER 쿼리에 소요되는 시간이 줄어듭니다. #88153 (alesapin).
이제 DDL worker가 레플리카 Set에서 더 이상 사용되지 않는 호스트를 정리합니다. 이를 통해 ZooKeeper에 저장되는 메타데이터 양이 줄어듭니다. #88154 (alesapin).
오류가 발생한 경우 디렉터리 이동 작업이 올바르게 롤백되도록 했습니다. 루트 객체만이 아니라 실행 중에 변경된 모든 prefix.path 객체를 다시 기록하도록 했습니다. #88198 (Mikhail Artemenko).
ColumnLowCardinality에서 is_shared 플래그 전파를 수정했습니다. 이로 인해 해시 값이 이미 사전에 계산되어 ReverseIndex에 캐시된 이후 컬럼에 새 값이 삽입되는 경우 GROUP BY 결과가 잘못될 수 있었습니다. #88213 (Nikita Taranov).
워크로드 설정 max_cpu_share의 동작을 수정했습니다. 이제 max_cpus 워크로드 설정을 별도로 지정하지 않아도 이를 사용할 수 있습니다. #88217 (Neerav).
서브쿼리를 사용하는 매우 대량의 뮤테이션이 준비 단계에서 멈춰 버리던 버그를 수정했습니다. 이제 이러한 뮤테이션을 SYSTEM STOP MERGES로 중지할 수 있습니다. #88241 (alesapin).
여러 개의 FULL JOIN USING 절과 함께 query_plan_use_logical_join_step=0을 사용할 때 발생하던 「column not found」 오류를 수정합니다. 이 변경으로 #88103 이슈를 해결합니다. #88473 (Vladimir Cherkasov).
노드 수가 10개를 초과하는 대규모 클러스터에서는 복구 시 다음 오류와 함께 실패할 확률이 높습니다: [941] 67c45db4-4df4-4879-87c5-25b8d1e0d414 <Trace>: RestoreCoordinationOnCluster The version of node /clickhouse/backups/restore-7c551a77-bd76-404c-bad0-3213618ac58e/stage/num_hosts changed (attempt #9), will try again. num_hosts 노드는 여러 호스트에 의해 동시에 덮어써집니다. 이 수정에서는 재시도 횟수를 제어하는 설정을 동적으로 조정할 수 있도록 했습니다. #87721 이슈를 해결합니다. #88484 (Mikhail f. Shiryaev).