메인 콘텐츠로 건너뛰기

목차

ClickHouse 릴리스 v24.12, 2024-12-19
ClickHouse 릴리스 v24.11, 2024-11-26
ClickHouse 릴리스 v24.10, 2024-10-31
ClickHouse 릴리스 v24.9, 2024-09-26
ClickHouse 릴리스 v24.8 LTS, 2024-08-20
ClickHouse 릴리스 v24.7, 2024-07-30
ClickHouse 릴리스 v24.6, 2024-07-01
ClickHouse 릴리스 v24.5, 2024-05-30
ClickHouse 릴리스 v24.4, 2024-04-30
ClickHouse 릴리스 v24.3 LTS, 2024-03-26
ClickHouse 릴리스 v24.2, 2024-02-29
ClickHouse 릴리스 v24.1, 2024-01-30
2023년 변경 이력

ClickHouse 릴리스 24.12, 2024-12-19. 발표, 비디오

하위 호환되지 않는 변경 사항

  • 함수 greatestleast는 이제 NULL 입력 값을 무시합니다. 이전에는 인수 중 하나가 NULL이면 NULL을 반환했습니다. 예를 들어, 이제 SELECT greatest(1, 2, NULL)은 2를 반환합니다. 이 변경으로 동작은 PostgreSQL과 호환되지만, NULL을 반환하는 MySQL과는 호환되지 않게 됩니다. 이전 동작을 유지하려면 설정 least_greatest_legacy_null_behavior(기본값: false)를 true로 설정하십시오. #65519 #73344 (kevinyhzou).
  • 새로운 MongoDB 통합이 이제 기본으로 사용됩니다. 기존 MongoDB 드라이버(Poco 드라이버 기반)를 계속 사용하려는 사용자는 서버 설정 use_legacy_mongodb_integration를 활성화할 수 있습니다. #73359 (Kirill Nikiforov.

새로운 기능

  • JSON/Dynamic/Variant 타입을 실험적 기능에서 베타로 전환했습니다. #72294 (Pavel Kruglov). 또한 모든 수정 사항과 이번 변경 사항도 24.11로 백포트했습니다.
  • Iceberg data storage 포맷의 스키마 진화는 테이블 스키마를 수정할 수 있는 다양한 옵션을 제공합니다. 컬럼 순서, 컬럼 이름, 그리고 단순한 유형 확장은 내부적으로 변경할 수 있습니다. #69445 (Daniil Ivanik).
  • Iceberg REST 카탈로그와 통합: 전체 카탈로그를 ClickHouse에 연결하는 Iceberg라는 새로운 데이터베이스 엔진이 추가되었습니다. #71542 (Kseniia Sumarokova).
  • MergeTree 테이블의 프라이머리 인덱스용 캐시가 추가되었습니다(테이블 설정 use_primary_key_cache로 활성화할 수 있습니다). 프라이머리 인덱스에 지연 로드와 캐시를 활성화하면, 이를 메모리에 계속 유지하는 대신 필요할 때 캐시에 로드합니다(마크 캐시와 유사함). 데이터 파트의 삽입/머지/fetch 시와 테이블 재시작 시 프라이머리 인덱스를 예열하는 기능도 추가되었습니다(설정 prewarm_primary_key_cache로 활성화할 수 있습니다). 이를 통해 공유 스토리지의 초대형 테이블에서 메모리 사용량을 줄일 수 있으며, 1000조 개가 넘는 레코드를 가진 테이블에서 테스트했습니다. #72102 (Anton Popov). #72750 (Alexander Gololobov).
  • 지정된 테이블의 모든 파트에 대해, 또는 테이블이 지정되지 않은 경우 모든 테이블에 대해 프라이머리 인덱스를 로드하는 SYSTEM LOAD PRIMARY KEY 명령을 구현했습니다. 이는 벤치마크에 유용하며 쿼리 실행 중 불필요한 추가 지연 시간을 방지하는 데 도움이 됩니다. #66252 #67733 (ZAWA_ll).
  • MergeTree 테이블을 ReplicatedMergeTree로, 또는 그 반대로 ATTACH할 수 있는 쿼리가 추가되었습니다: ATTACH TABLE ... AS REPLICATEDATTACH TABLE ... AS NOT REPLICATED. #65401 (Kirill).
  • 새로운 설정인 http_response_headers가 추가되어 HTTP 응답 헤더를 맞춤 설정할 수 있습니다. 예를 들어, 데이터베이스에 저장된 이미지를 브라우저에서 렌더링하도록 지정할 수 있습니다. 이로써 #59620이 해결되었습니다. #72656 (Alexey Milovidov).
  • DateTime64를 초 단위 고정 정밀도의 Int64 값으로 변환하는 함수 toUnixTimestamp64Second를 추가했습니다. 이를 통해 날짜가 unix epoch 이전인 경우에도 음수 값을 반환할 수 있습니다. #70597 (zhanglistar). #73146 (Robert Schulze).
  • 원본 테이블의 프로젝션과 보조 인덱스 집합이 대상 테이블에 있는 프로젝션과 보조 인덱스 집합의 부분집합인 경우 ATTACH를 허용하는 새로운 설정 enforce_index_structure_match_on_partition_manipulation을 추가했습니다. #70602를 종료했습니다. #70603 (zwy991114).
  • ALTER USER {ADD|MODIFY|DROP SETTING}, ALTER USER {ADD|DROP PROFILE} 구문이 추가되었으며, ALTER ROLE 및 ALTER PROFILE에도 동일하게 적용됩니다. 이제 전체 설정 집합을 통째로 교체하는 대신 개별적으로 수정할 수 있습니다. #72050 (pufit).
  • Precision-Recall 곡선의 AUC(Area Under the Curve)를 계산하는 arrayPRAUC 함수를 추가했습니다. #72073 (Emmanuel).
  • 배열 타입에 indexOfAssumeSorted 함수를 추가했습니다. 비내림차순으로 정렬된 배열에서 검색을 최적화합니다. 이 효과는 매우 큰 배열(요소 수가 100,000개를 초과하는 경우)에서 나타납니다. #72517 (Eric Kurbanov).
  • 집계 함수 groupConcat에서 선택적 두 번째 인수로 Delimiter를 사용할 수 있습니다. #72540 (Yarik Briukhovetskyi).
  • 함수 translate는 이제 from 인수에 to 인수보다 더 많은 문자가 포함된 경우 해당 문자를 삭제할 수 있습니다. 예시: SELECT translate('clickhouse', 'clickhouse', 'CLICK')는 이제 CLICK을 반환합니다. #71441 (shuai.xu).

실험적 기능

  • MergeTree 정렬 키에서 내림차순 정렬을 지원하는 새로운 MergeTree 설정 allow_experimental_reverse_key가 추가되었습니다. 이는 시계열 분석, 특히 TopN 쿼리에 유용합니다. 예시 사용법: ENGINE = MergeTree ORDER BY (time DESC, key) - time 필드를 내림차순으로 정렬합니다. #71095 (Amos Bird).

성능 개선

  • JOIN 재정렬. JOIN에서 어느 쪽을 쿼리 계획의 inner (build) 테이블(table)로 사용할지 선택하는 옵션이 추가되었습니다. 이는 query_plan_join_swap_table로 제어되며 auto로 설정할 수 있습니다. 이 모드에서는 ClickHouse가 행 수가 가장 적은 테이블을 선택하려고 시도합니다. #71577 (Vladimir Cherkasov).
  • 이제 join_algorithm 설정이 default로 지정되면(해당하는 경우) parallel_hash 알고리즘이 사용됩니다. parallel_hash를 사용할 수 없는 경우에는 이전의 두 가지 대안인 directhash도 계속 고려됩니다. #70788 (Nikita Taranov).
  • 조인 중 사용되는 해시 테이블 수를 줄이기 위해 WHEREON 표현식에서 공통 표현식을 추출하는 옵션이 추가되었습니다. 이는 JOIN ON 조건의 서로 다른 OR 절 내 AND 조건에 공통 부분이 있을 때 유용합니다. optimize_extract_common_expressions = 1로 활성화할 수 있습니다. #71537 (János Benjamin Antal).
  • 인덱스가 지정된 컬럼이 LowCardinality(String)으로 CAST되더라도 SELECT에서 인덱스를 사용할 수 있게 되었습니다. 이는 일부 테이블은 String이고 일부는 LowCardinality(String)인 Merge 테이블에 대해 쿼리를 실행할 때 발생할 수 있습니다. #71598 (Yarik Briukhovetskyi).
  • 병렬 레플리카와 로컬 플랜이 활성화된 상태에서 쿼리를 실행할 때는 worker에서 인덱스 분석을 수행하지 않습니다. coordinator가 자체 측(쿼리 initiator)에서 수행한 인덱스 분석을 바탕으로 worker가 읽을 범위를 선택합니다. 이로써 병렬 레플리카를 사용하는 짧은 쿼리도 단일 노드 쿼리만큼 낮은 지연 시간을 달성할 수 있습니다. #72109 (Igor Nikonov).
  • 객체 스토리지 디스크에서 clickhouse disks remove --recursive의 메모리 사용량이 줄었습니다. #67323 (Kirill).
  • #57631의 compact 파트에서 단일 컬럼의 서브컬럼을 읽는 최적화를 복원했습니다. 이 최적화는 실수로 삭제되었습니다. #72285 (Pavel Kruglov).
  • comparator의 호출을 디버추얼라이즈하여 LowCardinality(String) 컬럼 정렬 속도를 높였습니다. #72337 (Alexander Gololobov).
  • 일부 단순한 데이터 타입에서 함수 argMin/argMax를 최적화했습니다. #72350 (alesapin).
  • memory tracker에서 공유 잠금을 활용하도록 잠금 방식을 최적화해 잠금 경합을 줄였으며, 그 결과 CPU 수가 매우 많은 시스템에서 성능이 향상되었습니다. #72375 (Jiebin Sun).
  • 새로운 설정 use_async_executor_for_materialized_views를 추가했습니다. materialized view 쿼리를 비동기 방식으로, 경우에 따라 멀티스레드로 실행할 수 있어 INSERT 중 뷰 처리 속도를 높일 수 있지만 메모리를 더 많이 사용합니다. #72497 (alesapin).
  • 집계 함수 상태의 역직렬화 성능을 개선했습니다(AggregateFunction 데이터 타입과 분산 쿼리에서). RowBinary 포맷 파싱 성능도 소폭 개선했습니다. #72818 (Anton Popov).
  • 읽기 시 메모리 사용량을 줄이기 위해 병렬 레플리카 읽기에서 테이블 키 순서대로 범위를 분할합니다. #72173 (JIaQi).
  • 삽입 배치에 파티션 키 값이 하나만 있는 경우 MergeTree에 대한 삽입 속도를 향상합니다. #72348 (alesapin).
  • 백업에서 복원하는 동안 테이블을 병렬로 생성할 수 있도록 구현했습니다. 이 PR 이전에는 RESTORE 명령이 항상 단일 스레드로 테이블을 생성했기 때문에, 테이블이 많은 백업에서는 속도가 느릴 수 있었습니다. #72427 (Vitaly Baranov).
  • 마크 캐시가 크면 이를 삭제하는 데 눈에 띄는 시간이 걸릴 수 있습니다. 이 과정에서 Context 뮤텍스를 잡고 있으면 다른 많은 작업이 차단되며, 뮤텍스가 해제될 때까지 새 클라이언트 연결조차 수립할 수 없습니다. 또한 동기화를 위해 이 뮤텍스를 반드시 잡고 있을 필요는 없으며, shared ptr를 통해 캐시에 대한 로컬 참조만 유지하면 충분합니다. #72749 (Alexander Gololobov).

개선 사항

  • 기본적으로 non-equi 조건이 허용되도록 allow_experimental_join_condition 설정을 제거했습니다. #69910 (Vladimir Cherkasov).
  • 서버 구성(users.xml)의 설정이 이제 클라이언트에도 적용됩니다. date_time_output_format와 같은 포맷 설정에 유용합니다. #71178 (Michael Kolupaev).
  • 서버/사용자의 메모리 사용량에 따라 GROUP BY/ORDER BY를 자동으로 디스크 기반으로 전환합니다. max_bytes_ratio_before_external_group_by/max_bytes_ratio_before_external_sort 쿼리 설정으로 제어됩니다. #71406 (Azat Khuzhin).
  • 새로운 취소 로직 추가: CancellationChecker는 시작된 모든 쿼리의 타임아웃을 확인하고, 타임아웃에 도달하면 쿼리를 중지합니다. #69880 (Yarik Briukhovetskyi).
  • Object에서 JSON으로의 ALTER를 지원하여, 더 이상 사용이 권장되지 않는 Object 유형에서 쉽게 마이그레이션할 수 있습니다. #71784 (Pavel Kruglov).
  • Enum에 없는 미지의 값을 set에서 허용합니다. #72662를 수정했습니다. #72686 (zhanglistar).
  • Enum 데이터 타입에서 문자열 검색 연산자(예: LIKE)를 지원하고, #72661을 구현했습니다. #72732 (zhanglistar).
  • 의미가 없는 일부 ALTER USER 쿼리가 허용되던 문제가 있었습니다. #71227를 수정했습니다. #71286 (Arthur Passos).
  • 분산 INSERT ... SELECT의 실행 계획을 수립할 때 prefer_locahost_replica를 반영합니다. #72190 (filimonov).
  • Azure는 Iceberg 사양을 위반해 Iceberg v1에 Iceberg v2라는 레이블을 잘못 붙였습니다. 이 문제는 여기에 설명되어 있습니다. Azure Iceberg Writer는 사양을 위반하는 Iceberg metadata 파일(및 manifest 파일) 을 생성합니다. 이제 v1 Iceberg 포맷 metadata를 v2 리더로 읽으려고 시도하게 되었고(Azure가 이런 방식으로 기록하기 때문입니다), manifest 파일에 해당 필드를 만들지 않았을 때 발생하는 오류도 추가했습니다. #72277 (Daniil Ivanik).
  • 이제 쿼리에서 UNION [ALL]을 사용해 CREATE MATERIALIZED VIEW를 생성할 수 있습니다. 동작 방식은 JOIN을 사용하는 materialized view와 동일합니다. 즉, SELECT 표현식에서 첫 번째 table만 삽입의 트리거로 작동하며, 나머지 모든 table은 무시됩니다. 다만 첫 번째 table에 대한 참조가 여러 개인 경우(예: 자기 자신과의 UNION), 그 참조들은 모두 삽입된 데이터 block으로 처리됩니다. #72347 (alesapin).
  • 딕셔너리의 소스로 ClickHouse를 사용할 때 소스 쿼리 유효성 검사 기능이 추가되었습니다. #72548 (Alexey Katsman).
  • 구성 다시 로드 시 ClickHouse가 ZooKeeper 변경 사항을 감지하도록 합니다. #72593 (Azat Khuzhin).
  • 캐시의 전체 메모리 사용량을 줄이기 위해 캐시된 마크의 메모리 사용량 추정을 개선했습니다. #72630 (Antonio Andelic).
  • 새로운 StartupScriptsExecutionState 메트릭을 추가했습니다. 이 메트릭은 3가지 값을 가질 수 있습니다. 0 = 시작 스크립트가 아직 완료되지 않음, 1 = 시작 스크립트가 성공적으로 실행됨, 2 = 시작 스크립트 실행 실패. 이 메트릭이 필요한 이유는 클라우드에서 시작 스크립트가 성공적으로 실행되고 있는지 확인해야 하기 때문이며, 특히 기본 구성 릴리스 이후에 더욱 중요합니다. #72637 (Miсhael Stetsyuk).
  • 새로운 MergeTreeIndexGranularityInternalArraysTotalSize 메트릭을 system.metrics에 추가합니다. 이 메트릭은 높은 영향을 받을 수 있는 대규모 데이터셋 인스턴스를 찾는 데 필요합니다
  • 복제된 테이블 생성 시 재시도를 추가했습니다. #72682 (Vitaly Baranov).
  • 비활성 파트의 총 바이트 수를 집계할 수 있도록 system.tablestotal_bytes_with_inactive를 추가했습니다. #72690 (Kai Zhu).
  • MergeTree 설정이 system.settings_changes에 추가되었습니다. #72694 (Raúl Marín).
  • notEmpty 함수에서 JSON 타입을 지원하도록 했습니다. #72741 (Pavel Kruglov).
  • GCS S3 오류 AuthenticationRequired 파싱을 지원합니다. #72753 (Vitaly Baranov).
  • 함수 ifNullcoalesce에서 Dynamic 타입을 지원합니다. #72772 (Pavel Kruglov).
  • toFloat64/touInt32/기타 함수에서 Dynamic을 지원합니다. #72989 (Pavel Kruglov).
  • S3 요청 설정 http_max_fields, http_max_field_name_size, http_max_field_value_size를 추가하고, 백업 생성 또는 복원 시 S3 API 응답을 파싱할 때 이를 사용합니다. #72778 (Vitaly Baranov).
  • 이 메타데이터를 사용하는 마지막 테이블이 삭제된 후에만 Storage S3(Azure)Queue의 Keeper에 있는 테이블 메타데이터를 삭제합니다. #72810 (Kseniia Sumarokova).
  • JoinBuildTableRowCount/JoinProbeTableRowCount/JoinResultRowCount 프로필 이벤트가 추가되었습니다. #72842 (Vladimir Cherkasov).
  • MergeTree 정렬 키와 스킵 인덱스에서 서브컬럼을 지원합니다. #72644 (Pavel Kruglov).

버그 수정(공식 안정 릴리스에서 사용자에게 드러나는 오동작)

  • MergeTree에서 발생할 수 있는 파트 중첩 문제를 수정했습니다(객체 스토리지 작업으로 인해 파트를 분리된 디렉터리로 이동하는 작업이 실패한 후 발생할 수 있음). #70476 (Azat Khuzhin).
  • 테이블 이름이 너무 길 때의 오류 감지를 수정했습니다. 최대 길이를 알려주는 진단 메시지를 제공합니다. 새 함수 getMaxTableNameLengthForDatabase를 추가했습니다. #70810 (Yarik Briukhovetskyi).
  • clickhouse-library-bridge가 비정상 종료된 후 남는 좀비 프로세스 문제를 수정했습니다(이 프로그램은 안전하지 않은 라이브러리를 실행할 수 있게 합니다). #71301 (MikhailBurdukov).
  • plain_rewritable 디스크에서 디렉터리 생성에 실패할 때 트랜잭션 롤백 중 발생하는 NoSuchKey 오류를 수정했습니다. #71439 (Julia Kartseva).
  • Pretty JSON 포맷에서 Dynamic 값 직렬화 문제를 수정했습니다. #71923 (Pavel Kruglov).
  • File/S3/URL/HDFS/Azure 엔진의 CREATE 쿼리에 추론된 포맷 이름을 추가합니다. 이전에는 서버를 재시작할 때마다 포맷 이름을 추론했기 때문에, 지정된 데이터 파일이 삭제되면 서버 시작 시 오류가 발생했습니다. #72108 (Pavel Kruglov).
  • 기존 분석기에서 JOIN ON 표현식에 UDF를 사용할 때 발생하는 버그를 수정했습니다. #72179 (Raúl Marín).
  • StorageObjectStorage의 사소한 버그 몇 가지를 수정했습니다. 기본적으로 use_hive_partitioning이 활성화되도록 해야 합니다. #72185 (Yarik Briukhovetskyi).
  • min_age_to_force_merge_on_partition_only가 이미 단일 파트로 머지된 동일한 파티션을 반복해서 머지하려다 멈추고, 여러 파트가 있는 파티션은 머지하지 않던 버그를 수정했습니다. #72209 (Christoph Wurm).
  • 희소 컬럼 처리 중 드물게 발생하던 SimpleSquashingChunksTransform 크래시를 수정했습니다. #72226 (Vladimir Cherkasov).
  • GraceHashJoin의 데이터 레이스를 수정하여 일부 행이 JOIN 출력에서 누락될 수 있던 문제를 해결했습니다. #72233 (Nikita Taranov).
  • 구체화된 _block_number 컬럼이 있는 ALTER DELETE 쿼리의 문제를 수정했습니다(설정 enable_block_number_column이 활성화된 경우). #72261 (Anton Popov).
  • ColumnDynamic::dumpStructure()가 예를 들어 ConcurrentHashJoin 생성자에서 동시 호출될 때 발생하던 data race 문제를 수정했습니다. #72278 (Nikita Taranov).
  • 중복된 컬럼이 있는 ORDER BY ... WITH FILL에서 발생할 수 있는 LOGICAL_ERROR를 수정했습니다. #72387 (Vladimir Cherkasov).
  • optimize_functions_to_subcolumns 적용 후 여러 경우에서 발생하던 타입 불일치를 수정했습니다. #72394 (Anton Popov).
  • AWS_CONTAINER_AUTHORIZATION_TOKEN_PATH 대신 AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE을 사용합니다. #71074를 해결합니다. #72397 (Konstantin Bogdanov).
  • BACKUP DATABASE db EXCEPT TABLES db.table 쿼리 파싱 시 발생하던 실패를 수정했습니다. #72429 (Konstantin Bogdanov).
  • Variant를 생성할 수 없도록 했습니다. #72454 (Pavel Kruglov).
  • system.mergesresult_part_path 포맷 오류를 수정했습니다. #72567 (Konstantin Bogdanov).
  • 요소가 1개인 glob(예: {file})을 파싱할 때 발생하던 문제를 수정했습니다. #72572 (Konstantin Bogdanov).
  • ARRAY JOIN이 포함된 분산 쿼리에서 팔로어 server의 쿼리 생성 문제를 수정했습니다. #69276를 해결합니다. #72608 (Dmitry Novik).
  • DateTime64 IN DateTime64가 아무 결과도 반환하지 않던 버그를 수정했습니다. #72640 (Yarik Briukhovetskyi).
  • flatten_nested=0로 생성한 테이블이 있는 복제된 데이터베이스에 새 레플리카를 추가할 때 발생하던 메타데이터 불일치 문제를 수정했습니다. #72685 (Alexander Tokmakov).
  • Keeper 내부 통신용 고급 SSL 구성을 수정했습니다. #72730 (Antonio Andelic).
  • S3Queue unordered mode에서 tracked_files_limit 설정값이 S3 파일 생성 속도보다 작을 때 발생하던 “No such key” 오류를 수정했습니다. #72738 (Kseniia Sumarokova).
  • 로컬에 사용자가 없을 때 RemoteQueryExecutor에서 예외가 발생하던 문제를 수정했습니다. #72759 (Andrey Zvonov).
  • 구체화된 _block_number 컬럼이 있는 경우의 뮤테이션 문제를 수정했습니다(enable_block_number_column 설정이 활성화된 경우). #72854 (Anton Popov).
  • 백업에 빈 파일이 있을 때 일반적인 재기록 가능 디스크에서 발생하던 백업/복원 문제를 수정했습니다. #72858 (Kseniia Sumarokova).
  • DistributedAsyncInsertDirectoryQueue에서 삽입 작업이 제대로 취소되도록 수정했습니다. #72885 (Antonio Andelic).
  • 잘못된 데이터를 희소 컬럼으로 파싱할 때 발생하던 크래시를 수정했습니다(설정 enable_parsing_to_custom_serialization이 활성화된 경우 발생할 수 있습니다). #72891 (Anton Popov).
  • 백업 복원 중 발생할 수 있는 비정상 종료 문제를 수정했습니다. #72947 (Kseniia Sumarokova).
  • parallel_hash JOIN 메서드에서, 쿼리의 ON 절에 부등호 필터가 포함된 복잡한 조건이 있을 경우 발생할 수 있는 버그를 수정했습니다. #72993 (Nikita Taranov).
  • 손상된 역직렬화를 방지하기 위해 JSON 파싱 시 기본 포맷 설정을 사용하도록 했습니다. #73043 (Pavel Kruglov).
  • 지원되지 않는 스토리지에서 트랜잭션 처리 중 발생하던 크래시를 수정했습니다. #73045 (Raúl Marín).
  • 메모리 추적이 과대 추정될 수 있는 문제를 수정했습니다 (MemoryTrackingMemoryResident 간 차이가 계속 증가하던 경우). #73081 (Azat Khuzhin).
  • Tuple을 파싱할 때 중복된 JSON 키를 확인합니다. 이전에는 이로 인해 파싱 중 Invalid number of rows in Chunk라는 논리 오류가 발생할 수 있었습니다. #73082 (Pavel Kruglov).

빌드/테스트/패키징 개선

  • 이전에는 /utils 폴더에 있었고 소스에서 수동으로 컴파일해야 했던 모든 소규모 유틸리티가 이제 기본 ClickHouse 번들에 포함됩니다. 이로써 다음 이슈가 해결되었습니다: #72404. #72426 (Nikita Mikhaylov).
  • 22.3에서 도입된 /etc/systemd/system/clickhouse-server.service 삭제 동작을 제거했습니다. #39323. #72259 (Mikhail f. Shiryaev).
  • 메모리/CPU 제한으로 인한 컴파일 실패를 방지하기 위해 큰 번역 단위(translation unit)를 분할했습니다. #72352 (Yakov Olkhovskiy).
  • OSX: ICU 지원을 포함해 빌드하며, 이를 통해 콜레이션, 문자 집합 변환 및 기타 현지화 기능을 사용할 수 있습니다. #73083 (Raúl Marín).

ClickHouse 릴리스 24.11, 2024-11-26. 발표 자료, 비디오

하위 호환되지 않는 변경 사항

  • 시스템 테이블 generate_seriesgenerateSeries를 제거했습니다. 이 테이블들은 다음 이슈에서 실수로 추가되었습니다: #59390. #71091 (Alexey Milovidov).
  • StorageExternalDistributed를 제거했습니다. #70600을 해결합니다. #71176 (flynn).
  • 이제 Kafka, NATS, RabbitMQ 테이블 엔진은 SOURCES 계층에서 각각의 권한으로 관리됩니다. 이러한 엔진 타입으로 테이블을 생성하는 기본이 아닌 데이터베이스 사용자에게 권한을 추가하십시오. #71250 (Christoph Wurm).
  • 실행 전에 전체 뮤테이션 쿼리(서브쿼리 포함)를 검사합니다. 이렇게 하면 잘못된 쿼리가 실수로 실행되거나, 유효한 뮤테이션을 막는 무효 뮤테이션이 쌓이는 일을 방지할 수 있습니다. #71300 (Christoph Wurm).
  • 파일 시스템 캐시 설정 skip_download_if_exceeds_query_cache의 이름을 filesystem_cache_skip_download_if_exceeds_per_query_cache_write_limit로 변경했습니다. #71578 (Kseniia Sumarokova).
  • deltaSumTimestamp에서 Enum, UInt128, UInt256 인수 지원을 제거했습니다. 또한 deltaSumTimestamp의 두 번째(“timestamp”) 인수에 대한 Int8, UInt8, Int16, UInt16 지원도 제거했습니다. #71790 (Alexey Milovidov).
  • 이제 Dictionary 스토리지, 딕셔너리 테이블 함수 또는 딕셔너리 자체에 대한 직접 SELECT를 사용해 딕셔너리에서 데이터를 직접 가져오는 경우, 해당 딕셔너리에 대한 SELECT 권한 또는 dictGet 권한만 있으면 충분합니다. 이는 ACL 우회를 방지하려는 이전 변경 사항인 https://github.com/ClickHouse/ClickHouse/pull/57362https://github.com/ClickHouse/ClickHouse/pull/65359와 일관됩니다. 또한 후자의 변경 사항도 하위 호환되도록 합니다. #72051 (Nikita Mikhaylov).

실험적 기능

  • 모든 실험적/베타 기능을 비활성화할 수 있는 전역 스위치로 allow_feature_tier를 구현했습니다. #71841 #71145 (Raúl Marín).
  • JSON 서브컬럼 파일에서 이스케이프되지 않은 특수 기호로 인해 발생할 수 있는 No such file or directory 오류를 수정했습니다. #71182 (Pavel Kruglov).
  • String에서 JSON으로의 ALTER를 지원합니다. 이 PR은 JSON 및 Dynamic 타입의 직렬화도 새 버전 V2로 변경합니다. 이전 버전 V1은 설정 merge_tree_use_v1_object_and_dynamic_serialization을 활성화하면 계속 사용할 수 있습니다(업그레이드 중 문제 없이 버전을 롤백할 수 있도록 사용할 수 있습니다). #70442 (Pavel Kruglov).
  • JSON 문자열로의 직렬화/역직렬화를 통해 Map/Tuple/Object에서 새 JSON 타입으로의 단순 CAST를 구현했습니다. #71320 (Pavel Kruglov).
  • 예상치 못한 결과가 발생할 수 있으므로 기본적으로 ORDER BY/GROUP BY/PARTITION BY/PRIMARY KEY에서는 Variant/Dynamic 타입을 허용하지 않습니다. #69731 (Pavel Kruglov).
  • 혼동을 방지하기 위해 min/max 함수에서는 Dynamic/Variant 타입을 금지합니다. #71761 (Pavel Kruglov).

새로운 기능

  • 워크로드 및 리소스 관리를 기술하는 SQL 구문이 추가되었습니다. https://clickhouse.com/docs/operations/workload-scheduling. #69187 (Sergei Trifonov).
  • 새로운 데이터 타입 BFloat16이 추가되었습니다. 이 타입은 8비트 exponent, 부호, 7비트 가수를 사용하는 16비트 부동소수점 수를 나타냅니다. 이 변경으로 #44206이 해결되었습니다. 이 변경으로 #49937이 해결되었습니다. #64712 (Alexey Milovidov).
  • 현재 사용자/역할에 특정 권한이 부여되었는지, 그리고 해당 테이블/컬럼이 메모리에 존재하는지 확인하는 CHECK GRANT 쿼리가 추가되었습니다. #68885 (Unalian).
  • iceberg[S3;HDFS;Azure]Cluster, deltaLakeCluster, hudiCluster 테이블 함수가 추가되었습니다. #72045 (Mikhail Artemenko).
  • http_handlers에서 사용자 이름/비밀번호를 설정하는 기능이 추가되었습니다(dynamic_query_handler/predefined_query_handler용). #70725 (Azat Khuzhin).
  • ORDER BY WITH FILL 연산자에서 staleness 절을 지원합니다. #71151 (Mikhail Artemenko).
  • 각 인증 메서드에 자체 만료일을 설정할 수 있게 하고, 사용자 엔터티에서는 이를 제거했습니다. #70090 (Arthur Passos).
  • 새로운 함수 parseDateTime64, parseDateTime64OrNull, parseDateTime64OrZero가 추가되었습니다. 기존 함수 parseDateTime(및 그 변형)과 비교하면, 이 함수들은 DateTime 대신 DateTime64 타입의 값을 반환합니다. #71581 (kevinyhzou).

성능 개선

  • 파트의 세분화 수준이 일정한 경우 인덱스 세분화 수준 값의 메모리 사용량을 최적화했습니다. 파트에 대해 항상 일정한 세분화 수준을 선택할 수 있는 기능(use_const_adaptive_granularity 설정)을 추가했으며, 이를 통해 메모리 사용이 항상 최적화되도록 지원합니다. 이는 대규모 워크로드(공유 스토리지에서 수조 개의 행)에서 데이터 파트의 메타데이터(인덱스 세분화 수준 값)로 인해 메모리 사용량이 지속적으로 증가하는 것을 방지하는 데 도움이 됩니다. #71786 (Anton Popov).
  • 이제 병렬 처리를 위해 스레드에 분배할 때 join_algorithm = 'parallel_hash'에서는 입력 블록의 컬럼을 복사하지 않습니다. #67782 (Nikita Taranov).
  • 겹치지 않는 파트에 대한 Replacing 머지 알고리즘을 최적화했습니다. #70977 (Anton Popov).
  • 읽기 전용 및 write-once 디스크의 분리된 파트는 메트릭과 system.detached_parts에 나열하지 않습니다. #71086 (Alexey Milovidov).
  • 기본적으로 비용이 큰 비동기 메트릭은 계산하지 않도록 했습니다. 이 기능은 #40332에서 도입되었지만, 단 한 고객에게만 필요한 무거운 백그라운드 작업을 두는 것은 바람직하지 않습니다. #71087 (Alexey Milovidov).
  • plain_rewritable 디스크의 경우: 디렉터리 목록을 조회할 때 객체 스토리지 API를 호출하지 마십시오. 비용 비효율적일 수 있기 때문입니다. 대신 파일 이름 목록을 메모리에 저장합니다. 이에 따른 절충점은 초기 적재 시간이 늘어나고 파일 이름을 저장하는 데 필요한 메모리도 증가한다는 점입니다. #70823 (Julia Kartseva).
  • 임계 영역을 줄여 system.query_metric_log 수집 주기의 성능과 정확도를 개선했습니다. #71473 (Pablo Marcos).
  • 가상 행을 생성해 read-in-order를 최적화함으로써 머지 정렬 중 읽는 데이터 양을 줄였으며, 특히 여러 파트가 있을 때 유용합니다. #62125 (Shichao Jin).
  • server 설정 async_load_system_database가 추가되어 system 데이터베이스가 완전히 로드되지 않은 상태에서도 server를 시작할 수 있게 되었습니다. system 테이블이 많은 경우 ClickHouse를 더 빠르게 시작하는 데 도움이 됩니다. #69847 (Sergei Trifonov).
  • 데이터를 병렬로 압축할 수 있도록 clickhouse-compressor--threads 매개변수가 추가되었습니다. #70860 (Alexey Milovidov).
  • 삽입, 머지, 파트 fetch 및 테이블 시작 시점에 마크를 마크 캐시에 로드할 수 있도록 하는 prewarm_mark_cache 설정이 추가되었습니다. #71053 (Anton Popov).
  • 메모리에 있는 index_granularity 배열의 크기를 줄여 MergeTree 테이블 엔진 계열의 메모리 사용량을 줄였습니다. #71595 (alesapin).
  • 비디스크 읽기에서는 파일 시스템 캐시 설정 boundary_alignment를 비활성화하여, 캐싱을 사용하는 독립형 원격 파일의 읽기 성능을 개선했습니다. #71827 (Kseniia Sumarokova).
  • SELECT * FROM table LIMIT ... 같은 쿼리는 실제로 사용되지 않는데도 파트 인덱스를 로드하곤 했습니다. #71866 (Alexander Gololobov).
  • parallel_replicas_local_plan이 기본적으로 활성화됩니다. 쿼리 시작 노드에서 완전한 로컬 실행 계획을 구축하면 더 적은 리소스로 병렬 레플리카 성능이 향상되고, 추가적인 쿼리 최적화를 적용할 수 있습니다. #70171 (Igor Nikonov).

개선 사항

  • ch queries.sql처럼 파일 인수와 함께 ClickHouse를 사용할 수 있게 했습니다. #71589 (Raúl Marín).
  • Vertical 포맷(\G로 쿼리를 끝내면 활성화되기도 함)은 다음과 같은 Pretty 형식의 기능을 지원합니다. - 숫자에서 천 단위 구분을 강조 표시합니다. - 사람이 읽기 쉬운 숫자 힌트를 출력합니다. #71630 (Alexey Milovidov).
  • 쿼리 시작 노드에서 클러스터의 다른 노드로 외부 사용자 역할을 전파합니다. 외부 인증자(LDAP 등)에 대한 액세스 권한이 쿼리 시작 노드에만 있을 때 유용합니다. #70332 (Andrey Zvonov).
  • 집계 함수 any의 별칭으로 anyRespectNulls, firstValueRespectNulls, anyValueRespectNulls를 추가했습니다. 또한 집계 함수 anyLast의 별칭으로 anyLastRespectNullslastValueRespectNulls도 추가했습니다. 이제 camel-case와 underscore를 혼용한 구문 대신, 더 자연스러운 camel-case 전용 구문을 사용할 수 있습니다. 예를 들어 anyLast_respect_nullsStateIf 대신 SELECT anyLastRespectNullsStateIf를 사용할 수 있습니다. #71403 (Peter Nguyen).
  • 구성 date_time_utc 매개변수를 추가하여 JSON 로그 포맷팅이 RFC 3339/ISO8601 포맷의 UTC 날짜-시간을 지원하도록 했습니다. #71560 (Ali).
  • 사용자 인증을 위한 S3 엔드포인트의 새로운 헤더 유형(access_header)이 추가되었습니다. 이를 통해 우선순위가 가장 낮은 access header를 사용할 수 있으며, 이 값은 다른 소스(예: 테이블 스키마 또는 명명된 컬렉션)의 access_key_id로 덮어써집니다. #71011 (MikhailBurdukov).
  • 상수 배열과 상수로 캡처된 인수를 사용하는 고차 함수는 상수 값을 반환합니다. #58400 (Alexey Milovidov).
  • 쿼리 계획 단계 이름(EXPLAIN PLAN json=1)과 파이프라인 프로세서 이름(EXPLAIN PIPELINE compact=0,graph=1)에는 이제 접미사로 고유한 id가 붙습니다. 이를 통해 프로세서 프로파일러 출력과 OpenTelemetry trace를 explain 출력에 대응시킬 수 있습니다. #63518 (qhsong).
  • Azure Blob Storage에 쓴 후 객체가 존재하는지 확인하는 옵션이 추가되었습니다. 이 옵션은 check_objects_after_upload 설정으로 제어됩니다. #64847 (Smita Kulkarni).
  • 기본값으로 clickhouse-local에서 Atomic 데이터베이스를 사용합니다. #50647의 1번 및 5번 항목을 해결했습니다. #44817을 종료합니다. #68024 (Alexey Milovidov).
  • 예외는 오류를 클라이언트에 알리기 위해 HTTP 프로토콜을 위반합니다. #68800 (Sema Checherinda).
  • DDLWorker에서 replica_dir를 생성하고 레플리카를 활성 상태로 표시하여, 분산 DDL 쿼리를 실행 중인 호스트를 보고하도록 했습니다. #69658 (tuanpach).
  • distributed_ddl_output_mode가 *_only_active로 설정된 경우, 데이터베이스 ON CLUSTER 쿼리에서는 활성 상태의 레플리카만 대기합니다. #69660 (tuanpach).
  • ON CLUSTER 백업 및 복원의 오류 처리와 취소 기능 개선: - 한 호스트에서 백업 또는 복원이 실패하면 다른 호스트에서도 자동으로 취소됩니다 - 일부 호스트에서 실패하고 다른 호스트에서는 작업이 계속되더라도 이상한 오류가 발생하지 않습니다 - 한 호스트에서 백업 또는 복원이 취소되면 다른 호스트에서도 자동으로 취소됩니다 - test_disallow_concurrency 관련 문제 수정 - 이제 concurrency 비활성화가 더 안정적으로 동작합니다 - 이제 백업과 복원은 ZooKeeper 연결 끊김에 훨씬 더 잘 견딥니다. #70027 (Vitaly Baranov).
  • 스토리지 S3Queue의 일부 설정에서 ALTER TABLE ... MODIFY/RESET SETTING ...을 지원합니다. #70811 (Kseniia Sumarokova).
  • 서버 인증서를 다시 로드하는 절차와 동일한 방식으로 클라이언트 인증서도 다시 로드할 수 있는 기능이 추가되었습니다. #70997 (Roman Antonov).
  • 클라이언트 이력 크기를 설정할 수 있도록 하고, 기본 크기도 늘렸습니다. #71014 (Jiří Kozlovský).
  • Parquet 네이티브 리더에 Boolean 타입 지원이 추가되었습니다. #71055 (Arthur Passos).
  • S3와 상호작용할 때 “Malformed message”와 같은 더 많은 오류에 대해서도 재시도합니다. #71088 (Alexey Milovidov).
  • S3 관련 일부 메시지의 로그 수준을 낮췄습니다. #71090 (Alexey Milovidov).
  • 공백이 포함된 HDFS 파일에 대한 쓰기를 지원합니다. #71105 (exmy).
  • 복제된 테이블, 딕셔너리, 뷰의 개수를 제한하는 설정이 추가되었습니다. #71179 (Kirill).
  • 가능한 경우 AWS_CONTAINER_AUTHORIZATION_TOKEN 대신 AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE을 사용합니다. #71074를 해결합니다. #71269 (Konstantin Bogdanov).
  • ReplicatedMergeTree 재시작 스레드에서 metadata_version ZooKeeper 노드 생성 로직을 제거합니다. 이 노드를 생성해야 하는 유일한 경우는 사용자가 20.4 이전 버전에서 24.10 이후 버전으로 바로 업데이트한 경우입니다. ClickHouse는 1년을 초과하는 업그레이드를 지원하지 않으므로, 노드를 생성하는 대신 예외를 발생시켜 단계적으로 업데이트하도록 안내해야 합니다. #71385 (Miсhael Stetsyuk).
  • 호스트별 Overview (host)Cloud overview (host) 대시보드를 고급 대시보드에 추가했습니다. #71422 (alesapin).
  • clickhouse-local은 기본적으로 암시적 SELECT를 사용하므로 계산기처럼 사용할 수 있습니다. 암시적 SELECT 모드의 구문 강조를 개선했습니다. #71620 (Alexey Milovidov).
  • 명령줄 애플리케이션이 여러 SQL 문에서도 구문 강조를 지원합니다. #71622 (Alexey Milovidov).
  • 명령줄 애플리케이션은 오류가 발생하면 0이 아닌 종료 코드를 반환합니다. 이전 버전에서는 disks 애플리케이션이 오류 발생 시 0을 반환했으며, 다른 애플리케이션은 오류 256 (PARTITION_ALREADY_EXISTS) 및 512 (SET_NON_GRANTED_ROLE)에서도 0을 반환했습니다. #71623 (Alexey Milovidov).
  • 사용자/그룹을 ID로 지정하면 clickhouse su가 실패합니다. 이 패치는 UID:GID도 허용하도록 수정합니다. #71626 (Mikhail f. Shiryaev).
  • 설정 filesystem_cache_prefer_bigger_buffer_size를 사용해 파일 시스템 캐시의 메모리 버퍼 크기 증가를 비활성화할 수 있습니다. #71640 (Kseniia Sumarokova).
  • 파일 시스템 캐시에서 백그라운드 다운로드의 최대 파일 세그먼트 크기를 위한 별도 설정 background_download_max_file_segment_size를 추가했습니다. #71648 (Kseniia Sumarokova).
  • JSON 타입 파싱이 약간 개선되었습니다. JSON 경로의 현재 블록에 여러 타입의 값이 포함된 경우, 특수한 우선순위에 따라 타입을 시도해 가장 적합한 타입을 선택합니다. #71785 (Pavel Kruglov).
  • 이전에는 system.asynchronous_metrics에서 읽기를 수행하면 동시 업데이트가 끝날 때까지 기다려야 했습니다. 시스템에 높은 부하가 걸리면 이 대기 시간이 길어질 수 있습니다. 이 변경으로 이제 이전에 수집된 값은 언제나 읽을 수 있습니다. #71798 (Alexander Gololobov).
  • S3Queue 및 AzureQueue: polling_max_timeout_ms는 10분으로, polling_backoff_ms는 30초로 설정했습니다. #71817 (Kseniia Sumarokova).
  • history 기간 동안 HostResolver를 3번 갱신합니다. #71863 (Sema Checherinda).
  • Advanced dashboard HTML 페이지에 system.dashboards 테이블에서 dashboard를 선택할 수 있는 드롭다운 셀렉터를 추가했습니다. #72081 (Sergei Trifonov).
  • 인증 후 기본 데이터베이스의 존재 여부를 확인합니다. #71097를 수정했습니다. #71140 (Konstantin Bogdanov).

버그 수정(공식 안정 릴리스에서 사용자에게 드러나는 오동작)

  • ATTACH PART 쿼리 중에 중복 제거된 파트는 더 이상 attaching_ 접두사가 붙은 채로 남아 있지 않습니다. #65636 (Kirill).
  • IN 함수에서 DateTime64의 정밀도가 손실되던 버그 수정. #67230 (Yarik Briukhovetskyi).
  • ORDER BY ... WITH FILL에서 IGNORE/RESPECT NULLS를 사용하는 함수와 함께 사용할 때 발생할 수 있는 논리적 오류를 수정하고 #57609을 해결했습니다. #68234 (Vladimir Cherkasov).
  • 메모리 한도에 도달했을 때 포맷 Native를 사용하는 비동기 삽입에서 드물게 발생하던 논리적 오류를 수정했습니다. #68965 (Anton Popov).
  • EPHEMERAL 컬럼의 CREATE TABLE COMMENT를 수정했습니다. #70458 (Yakov Olkhovskiy).
  • LowCardinality(Nullable)를 사용할 때 JSONExtract에서 발생하던 논리 오류를 수정했습니다. #70549 (Pavel Kruglov).
  • 같은 zk 경로를 사용하는 다른 레플리카가 있을 때 system drop replica zkpath를 허용합니다. #70642 (MikhailBurdukov).
  • AggregateFunctionGroupArraySorted의 크래시와 메모리 누수를 수정했습니다. #70820 (Michael Kolupaev).
  • URL 엔진에서 사용자 헤더로 Content-Type을 재정의할 수 있는 기능을 추가했습니다. #70859 (Artem Iurin).
  • StorageS3Queue의 “이미 존재하므로 /processed에 영구 노드를 생성할 수 없습니다” 논리 오류를 수정했습니다. #70984 (Kseniia Sumarokova).
  • 특정 상황에서 명명된 세션이 종료되지 않고 계속 멈춘 상태로 남아 있던 문제를 수정했습니다. #70998 (Márcio Martins).
  • 프로젝션 경량한 삭제의 rebuild 옵션에서 _row_exists 컬럼을 고려하지 않던 버그를 수정했습니다. #71089 (Shichao Jin).
  • Oracle Linux UEK 6.10에서 실행 시 발생하는 AT_* is out of range 문제를 수정했습니다. #71109 (Örjan Fors).
  • 예기치 않은 경쟁 상태로 인해 system.query_metric_log에 잘못된 값이 기록되던 문제를 수정했습니다. #71124 (Pablo Marcos).
  • quantileExactWeightedInterpolated의 집계 함수 이름이 일치하지 않던 문제를 수정했습니다. 이 버그는 https://github.com/ClickHouse/ClickHouse/pull/69619에서 처음 발생했습니다. cc @Algunenano. #71168 (李扬).
  • 함수 비교 시 Dynamic에서 발생하던 bad_weak_ptr 예외를 수정했습니다. #71183 (Pavel Kruglov).
  • 읽는 7z 파일이 로컬 머신에 있는지 확인합니다. #71184 (Daniil Ivanik).
  • HTTP 및 Async Inserts에서 Native 형식의 포맷 설정이 무시되던 문제를 수정했습니다. #71193 (Pavel Kruglov).
  • 설정 use_query_cache = 1을 사용해 실행되는 SELECT 쿼리는 시스템 테이블(system table) 이름이 리터럴로 포함된 경우에도 더 이상 거부되지 않습니다. 예를 들어 이제 SELECT * FROM users WHERE name = 'system.metrics' SETTINGS use_query_cache = true;가 작동합니다. #71254 (Robert Schulze).
  • enable_filesystem_cache=1이 활성화되어 있지만 스토리지 구성의 디스크에 캐시 구성이 없는 경우 메모리 사용량이 증가하던 버그를 수정했습니다. #71261 (Kseniia Sumarokova).
  • Dynamic 컬럼의 LowCardinality 딕셔너리를 역직렬화하는 중 발생할 수 있는 “Cannot read all data” 오류를 수정했습니다. #71299 (Pavel Kruglov).
  • 클라이언트의 병렬 출력 형식 정리가 완전히 이루어지지 않던 문제를 수정했습니다. #71304 (Raúl Marín).
  • 이름이 지정된 컬렉션에서 누락된 이스케이프 해제 처리를 추가했습니다. 이 수정이 없으면 clickhouse-server가 시작되지 않습니다. #71308 (MikhailBurdukov).
  • 네이티브 프로토콜에서 빈 블록이 있는 async 삽입 문제를 수정했습니다. #71312 (Anton Popov).
  • 잘못된 와일드카드 권한을 부여할 때 발생하던 AST 포맷 불일치를 수정했습니다 #71309. #71332 (pufit).
  • std::terminate를 방지하기 위해 데이터 파트의 소멸자에 try/catch를 추가했습니다. #71364 (alesapin).
  • JSON 타입 힌트에서 의심스러운 타입과 실험적 타입을 검사합니다. #71369 (Pavel Kruglov).
  • Linux가 아닌 OS에서도 메모리 worker thread가 시작되도록 수정했습니다(#71051 수정). #71384 (Alexandre Snarskii).
  • Variant 컬럼이 있는 청크에서 「행 수가 잘못되었습니다」 오류를 수정했습니다. #71388 (Pavel Kruglov).
  • 이전 PostgreSQL 버전에서 “attgenerated” 컬럼이 존재하지 않는 오류를 수정했습니다. #60651. #71396 (0xMihalich).
  • 서버 로그에 과도한 항목이 쌓이지 않도록, 인증 실패 시도는 이제 ERROR가 아니라 DEBUG 수준으로 기록됩니다. #71405 (Robert Schulze).
  • 잘못된 인수(예: NULL)를 전달했을 때 mongodb 테이블 함수가 충돌하던 문제를 수정했습니다. #71426 (Vladimir Cherkasov).
  • optimize_rewrite_array_exists_to_has에서 발생하던 충돌 문제를 수정했습니다. #71432 (Raúl Marín).
  • 삽입 작업에서 설정 max_insert_delayed_streams_for_parallel_write의 사용을 수정했습니다. 이전에는 이 설정이 올바르게 동작하지 않아 여러 파티션에 데이터를 쓰는 삽입 작업에서 메모리 사용량이 높아질 수 있었습니다. #71474 (Anton Popov).
  • arrayJoin이 겉보기에는 WHERE 조건에 나타날 수 있는 경우에 발생하던 Argument for function must be constant 오류(구 분석기)를 수정했습니다. https://github.com/ClickHouse/ClickHouse/pull/65414 이후 발생한 회귀입니다. #71476 (Nikolai Kochetov).
  • 컬럼이 0개인 SortCursor에서 발생하는 비정상 종료를 방지합니다(이전 분석기). #71494 (Raúl Marín).
  • 초기화되지 않은 ORC 데이터로 인해 발생하는 Date32 범위 초과 문제를 수정했습니다. 자세한 내용은 https://github.com/apache/incubator-gluten/issues/7823를 참조하십시오. #71500 (李扬).
  • Dynamic 및 JSON 타입의 wide part에서 컬럼 크기 계산 문제를 수정했습니다. #71526 (Pavel Kruglov).
  • materialized view 내부 쿼리에서 CTE와 함께 IN을 사용할 때 발생하던 분석기 문제를 수정했습니다. #65598를 해결했습니다. #71538 (Maksim Kita).
  • 제약 조건에서 UDF 사용 시 발생하던 충돌을 방지합니다. #71541 (Raúl Marín).
  • 범위를 벗어나면 bitShift 함수에서 오류를 발생시키는 대신 0 또는 기본 문자를 반환합니다. #71580 (Pablo Marcos).
  • 특정 엔진에서 materialized view 사용 시 서버 충돌이 발생하던 문제를 수정했습니다. #71593 (Pervakov Grigorii).
  • 상수 배열의 별칭을 포함한 중첩 데이터 구조에서 Array join 수행 시 널 포인터 역참조가 발생하던 문제를 수정했습니다. 이로써 #71677가 해결되었습니다. #71678 (Alexey Milovidov).
  • 빈 Tuple로 ALTER를 수행할 때 발생하는 LOGICAL_ERROR를 수정했습니다. 이 변경으로 #71647도 해결됩니다. #71679 (Amos Bird).
  • 파티션 컬럼에 대한 프레디케이트에서 NOT IN 연산자를 사용할 때 상수 Set을 변환하지 않도록 수정했습니다. #71695 (Eduard Karacharov).
  • 더 쉽게 이해할 수 있도록 docker init script 실패 로그 메시지를 개선했습니다. #71734 (Андрей).
  • LowCardinality(Nullable)에서 Dynamic으로 변환하는 CAST를 수정했습니다. 이전에는 Bad cast from type DB::ColumnVector<int> to DB::ColumnNullable 오류로 이어질 수 있었습니다. #71742 (Pavel Kruglov).
  • DateTime64 유형의 기본 키(primary key)가 있는 WHERE 조건에서 발생하던 toDayOfWeek 예외를 수정했습니다. #71849 (Yakov Olkhovskiy).
  • 희소 컬럼에 파싱한 뒤 기본값이 채워지도록 수정했습니다. #71854 (Anton Popov).
  • 분산 테이블에서 입력이 ALIAS인 경우 발생하는 GROUPING 함수 오류를 수정하고, #68602를 해결했습니다. #71855 (Vladimir Cherkasov).
  • allow_experimental_join_condition 사용 시 발생할 수 있는 크래시를 수정했으며, #71693을 해결했습니다. #71857 (Vladimir Cherkasov).
  • WITH TIES 절을 사용하는 select SQL 문이 충분한 행을 반환하지 못할 수 있던 문제를 수정했습니다. #71886 (wxybear).
  • arrayWithConstant 평가에서 컬럼이 배열 크기 제한을 초과한 것으로 잘못 판단될 때 발생하는 TOO_LARGE_ARRAY_SIZE 예외를 수정했습니다. #71894 (Udi).
  • clickhouse-benchmark가 1초를 초과하는 쿼리에 대해 잘못된 메트릭을 보고했습니다. #71898 (Alexey Milovidov).
  • clickhouse-client에서 진행 표시기와 진행 테이블 사이의 경쟁 상태를 수정했습니다. 이 문제는 FROM INFILE을 사용할 때 나타납니다. INSERT 쿼리 중 키 입력을 감지해 진행 테이블 표시를 전환합니다. #71901 (Julia Kartseva).
  • 클러스터 자동 감지를 위해 보조 Keeper를 사용합니다. #71911 (Anton Ivashkin).
  • 24.6에서 깨진 system.s3/azure_queue_log의 rows_processed 컬럼을 수정합니다. #69975를 해결합니다. #71946 (Kseniia Sumarokova).
  • s3/s3Cluster 함수가 불완전한 결과를 반환하거나 예외를 발생시키던 문제를 수정했습니다. 이 문제는 s3 URI에서 glob pattern(예: pattern/*)을 사용할 때 키가 pattern/인 빈 객체가 존재하는 경우와 관련이 있었습니다(이러한 객체는 S3 Console에서 자동으로 생성됩니다). 또한 설정 s3_skip_empty_files의 기본값이 false에서 true로 변경되었습니다. #71947 (Nikita Taranov).
  • clickhouse-client의 구문 강조에서 발생하던 충돌을 수정했습니다. #71864를 해결합니다. #71949 (Nikolay Degterinsky).
  • 첫 번째 인수가 상수인 경우 ORDER BY에 2항 단조 함수가 포함된 MergeTree 테이블에서 발생하는 Illegal type 오류를 수정했습니다. #71941을 해결합니다. #71966 (Nikolai Kochetov).
  • 서브쿼리 내에서 사용하는 EXPLAIN AST에서는 SELECT 쿼리만 허용합니다. 다른 유형의 쿼리를 사용하면 ‘Bad cast from type DB::ASTCreateQuery to DB::ASTSelectWithUnionQuery’ 또는 Inconsistent AST formatting과 같은 논리 오류가 발생합니다. #71982 (Pavel Kruglov).
  • clickhouse-client로 레코드를 삽입할 때 클라이언트는 서버에서 컬럼 설명을 읽습니다. 하지만 설명을 잘못된 순서로 기록하는 버그가 있었으며, 올바른 순서는 [statistics, TTL, 설정]입니다. #71991 (Han Fei).
  • format_alter_commands_with_parentheses가 활성화된 경우 MOVE PARTITION ... TO TABLE ... ALTER 명령의 포맷팅을 수정했습니다. #72080 (János Benjamin Antal).
  • 병렬 레플리카를 사용하는 쿌리에서 RIGHT / FULL 조인 관련 문제를 수정했습니다. 이제 RIGHT 조인은 병렬 레플리카로 실행할 수 있습니다(오른쪽 테이블 읽기가 분산됨). FULL 조인은 노드 간 병렬화는 할 수 없으며 로컬에서 실행됩니다. #71162 (Igor Nikonov).
  • 제한된 시스템 호출 때문에 Docker 컨테이너의 ClickHouse가 stderr에 “get_mempolicy: Operation not permitted”를 출력하던 문제를 해결했습니다. #70900 (filimonov).
  • ZooKeeper의 metadata_version 레코드는 attach 스레드가 아니라 재시작 스레드에서 수정되도록 합니다. #70297 (Miсhael Stetsyuk).
  • 이는 지원되지 않으며 향후 완전히 제거될 예정인 “zero-copy” 복제에 대한 수정입니다. zero-copy 복제가 적용된 ReplicatedMergeTree에서 이를 사용하는 노드가 있는 동안에는 blob을 삭제하지 않습니다. #71186 (Antonio Andelic).
  • 이는 지원되지 않으며 완전히 제거될 예정인 “zero-copy” 복제에 대한 수정입니다. Keeper를 사용할 수 없을 때 발생할 수 있는 데이터 손실을 방지하기 위해 part를 zero-copy 디스크로 이동하기 전에 zero-copy 공유 잠금을 먼저 획득하도록 했습니다. #71845 (Aleksei Filatov).

ClickHouse 릴리스 24.10, 2024-10-31. 발표 자료, 영상

하위 호환되지 않는 변경 사항

  • 서브쿼리가 괄호 안에 있는 UNION 쿼리 체인에서는 이제 FORMAT 앞에 SETTINGS를 작성할 수 있습니다. 이로써 #39712가 해결되었습니다. 또한 쿼리 시퀀스에서 SETTINGS 절이 두 번 지정된 경우의 동작이 변경되었습니다. 해당 서브쿼리에는 가장 가까운 SETTINGS 절이 우선 적용됩니다. 이전 버전에서는 가장 바깥쪽 SETTINGS 절이 안쪽 절보다 우선 적용될 수 있었습니다. #68614 (Alexey Milovidov).
  • 이제 [PRE]WHERE 절의 필터 조건 재정렬이 기본적으로 허용됩니다. allow_reorder_prewhere_conditionsfalse로 설정하면 비활성화할 수 있습니다. #70657 (Nikita Taranov).
  • 호환되지 않는 라이선스를 사용하는 idxd-config 라이브러리를 제거했습니다. 이에 따라 실험적 Intel DeflateQPL 코덱도 함께 제거되었습니다. #70987 (Alexey Milovidov).

새로운 기능

  • 와일드카드 프리픽스에 대한 접근 권한을 부여할 수 있게 되었습니다. GRANT SELECT ON db.table_pefix_* TO user. #65311 (pufit).
  • 쿼리 런타임 중에 스페이스바를 누르면 클라이언트에 자세한 메트릭이 포함된 실시간 표가 표시됩니다. clickhouse-client의 새로운 --progress-table 옵션으로 이를 전역적으로 활성화할 수 있습니다. 새로운 --enable-progress-table-toggle--progress-table 옵션과 함께 사용되며, 제어 키(Space)를 눌러 진행률 표 렌더링을 전환할 수 있습니다. #63689 (Maria Khristenko), #70423 (Julia Kartseva).
  • ETag + 파일 경로의 hash를 캐시 키로 사용하여 객체 스토리지 테이블 엔진 및 데이터 레이크에서 읽은 파일을 캐시할 수 있게 했습니다. #70135 (Kseniia Sumarokova).
  • 쿼리를 사용해 테이블을 생성하는 기능 지원: CREATE TABLE ... CLONE AS .... 소스 테이블의 스키마(schema)를 복제한 다음 모든 파티션을 새로 생성된 테이블에 ATTACH합니다. 이 기능은 MergeTree 계열 테이블에서만 지원됩니다. #65015를 해결합니다. #69091 (tuanpach).
  • 개별 쿼리에 대한 system.events 테이블의 메모리 및 메트릭 값 이력을 포함하고, 주기적으로 디스크에 플러시되는 새로운 시스템 테이블 system.query_metric_log를 추가했습니다. #66532 (Pablo Marcos).
  • 계산기 스타일의 표현식을 사용할 수 있도록 간단한 SELECT 쿼리를 암시적 SELECT로 작성할 수 있습니다. 예를 들어 ch "1 + 2"와 같습니다. 이는 새로운 설정 implicit_select로 제어됩니다. #68502 (Alexey Milovidov).
  • 포맷 변환을 위한 단축 기능으로 clickhouse local--copy 모드를 지원합니다 #68503. #68583 (Denis Hananein).
  • /merges 경로에서 사용할 수 있는 머지 시각화용 내장 HTML 페이지를 추가했습니다. #70821 (Alexey Milovidov).
  • arrayUnion 함수 지원이 추가되었습니다. #68989 (Peter Nguyen).
  • 매개변수를 받는 SQL 별칭을 허용합니다. #50665 (Anton Kozlov).
  • 새로운 집계 함수 quantileExactWeightedInterpolated가 추가되었습니다. 이는 quantileExactWeighted를 기반으로 한 보간 버전입니다. 이미 quantileExactInterpolatedWeighted가 있는데 왜 새로운 quantileExactWeightedInterpolated가 필요한지 의아할 수 있습니다. 이유는 새 함수가 기존 함수보다 더 정확하기 때문입니다. 이는 Spark와의 호환성을 위한 것입니다. #69619 (李扬).
  • 새로운 함수 arrayElementOrNull입니다. 배열 인덱스가 범위를 벗어나거나 맵 키를 찾지 못한 경우 NULL을 반환합니다. #69646 (李扬).
  • 사용자가 로깅 대상을 걸러낼 수 있도록 config.xml 파일의 새로운 message_regexpmessage_regexp_negative 필드에서 정규식를 지정할 수 있습니다. 가장 직관적인 개발자 경험을 위해 로깅은 포맷된 비색상 텍스트에 적용됩니다. #69657 (Peter Nguyen).
  • 문자열의 RIPEMD-160 암호화 해시를 계산하는 RIPEMD160 함수를 추가했습니다. 예시: SELECT HEX(RIPEMD160('The quick brown fox jumps over the lazy dog'))37F332F68DB77BD9D7EDD4969571AD671CF9DD3B를 반환합니다. #70087 (Dergousov Maxim).
  • HDFS에서 Iceberg 테이블을 읽을 수 있도록 지원합니다. #70268 (flynn).
  • WITH ... INSERT 형태의 CTE를 지원합니다. 이전에는 INSERT ... WITH ...만 지원했습니다. #70593 (Shichao Jin).
  • MongoDB 통합: 모든 MongoDB 타입 지원, MongoDB 측 WHERE 및 ORDER BY SQL 문 지원, MongoDB에서 지원되지 않는 표현식에 대한 제한. 새로운 통합은 기본적으로 비활성화되어 있으므로, 사용하려면 서버 구성에서 <use_legacy_mongodb_integration>false로 설정하십시오. #63279 (Kirill Nikiforov).
  • 현재 profile에서 사용자 지정 설정을 찾지 못한 경우 예외를 발생시키지 않고 기본값을 반환하는 새 함수 getSettingOrDefault가 추가되었습니다. #69917 (Shankar).

실험적 기능

  • 갱신 가능 구체화 뷰는 이제 프로덕션 환경에서 사용할 수 있습니다. #70550 (Michael Kolupaev). 이제 복제된 데이터베이스에서도 갱신 가능 구체화 뷰를 지원합니다. #60669 (Michael Kolupaev).
  • 병렬 레플리카가 실험 단계에서 베타로 전환되었습니다. 병렬 레플리카 알고리즘의 동작을 제어하는 설정도 개편되었습니다. 간단히 요약하면, ClickHouse에는 여러 레플리카를 활용한 병렬 읽기를 위한 4가지 알고리즘이 있으며, 이는 parallel_replicas_mode 설정에 반영되어 있습니다. 기본값은 read_tasks입니다. 또한 토글 스위치 역할을 하는 enable_parallel_replicas 설정이 추가되었습니다. #63151 (Alexey Milovidov), (Nikita Mikhaylov).
  • 대부분의 함수에서 Dynamic 내부 타입에 대해 함수를 실행할 수 있게 되어 Dynamic 타입을 지원합니다. #69691 (Pavel Kruglov).
  • input_format_binary_read_json_as_string/output_format_binary_write_json_as_string 설정을 사용하면 RowBinary 포맷에서 JSON 타입을 바이너리 문자열로 읽고 쓸 수 있습니다. #70288 (Pavel Kruglov).
  • JSON 컬럼을 Native 형식에서 단일 String 컬럼으로 직렬화/역직렬화할 수 있도록 했습니다. 출력 시에는 output_format_native_write_json_as_string 설정을 사용하십시오. 입력 시에는 컬럼 데이터 앞에 직렬화 버전 1을 사용하십시오. #70312 (Pavel Kruglov).
  • MergeTree 테이블용 특수한 (실험적) 머지 선택기 모드가 도입되었습니다. 이 모드는 파트 수 제한에 근접한 파티션에 대해 더 공격적으로 동작합니다. 이 동작은 MergeTree 수준 설정 merge_selector_use_blurry_base로 제어됩니다. #70645 (Nikita Mikhaylov).
  • Avro의 Union 타입과 ClickHouse의 Variant 타입 간 범용 직렬화/역직렬화가 구현되었습니다. #69713을 해결합니다. #69712 (Jiří Kozlovský).

성능 개선

  • 성능 향상을 위해 IDiskIObjectStorage를 리팩터링했습니다. plainplain_rewritable 객체 스토리지의 테이블이 더 빠르게 초기화됩니다. #68146 (Alexey Milovidov, Julia Kartseva). 비용 효율이 떨어질 수 있으므로, plain rewritable 디스크에서 파일 또는 디렉터리가 존재하는지 확인할 때 LIST 객체 스토리지 API를 호출하지 않도록 했습니다. #70852 (Julia Kartseva). plain_rewritable 디스크에서 객체 스토리지 HEAD API 요청 수를 줄였습니다. #70915 (Julia Kartseva).
  • 데이터를 희소 컬럼에 직접 파싱할 수 있는 기능이 추가되었습니다. #69828 (Anton Popov).
  • 누락된 값이 많은 포맷(예: JSONEachRow)의 파싱 성능을 개선했습니다. #69875 (Anton Popov).
  • Parquet row group의 병렬 읽기와 단일 스레드 모드에서의 row group 프리페치를 지원합니다. #69862 (LiuNeng).
  • pointInPolygon에 minmax 인덱스를 지원합니다. #62085 (JackyWoo).
  • Parquet 파일을 읽을 때 블룸 필터를 활용합니다. #62966 (Arthur Passos).
  • 파트 잠금으로 인해 INSERT가 SELECT에 영향을 주지 않도록 파트 이름 변경을 lock-free 방식으로 처리했습니다 (fsync_part_directory를 사용하는 일반적인 환경에서 INSERT를 병렬로 수행하면 SELECT의 QPS가 2배 증가했으며, 높은 부하에서는 그 효과가 더욱 큽니다). 참고로 현재는 ReplicatedMergeTree에만 적용됩니다. #64955 (Azat Khuzhin).
  • materialize ttl에서 ttl_only_drop_parts를 적용합니다. TTL을 다시 계산하는 데 필요한 컬럼만 읽고, 파트를 빈 파트로 대체해 삭제합니다. #65488 (Andrey Zvonov).
  • 잠금 경합을 최소화하기 위해 ThreadPool의 스레드 생성 방식을 최적화했습니다. 이제 높은 부하 시 작업 스케줄링과 스레드 관리가 지연되지 않도록 임계 구역 밖에서 스레드를 생성합니다. 그 결과, 높은 동시성 부하에서도 ClickHouse의 응답성이 훨씬 더 향상됩니다. #68694 (filimonov).
  • ORC에서 LowCardinality 문자열 컬럼 읽기를 지원합니다. #69481 (李扬).
  • part_log, query_views_log, filesystem_cache_log와 같은 시스템 로그의 ProfileEventsLowCardinality를 사용합니다. #70152 (Alexey Milovidov).
  • fromUnixTimestamp/toUnixTimestamp 함수 성능을 개선했습니다. #71042 (kevinyhzou).
  • 블로킹 I/O에서 읽을 때 페이지 캐시의 비차단 읽기를 서버 전체에서 비활성화하지 않도록 했습니다. 이전에는 단일 파일 시스템(예: tmpfs)만 preadv2 시스템 호출을 지원하지 않고 다른 파일 시스템은 지원하는 경우 성능이 저하되었습니다. #70299 (Antonio Andelic).
  • ALTER TABLE .. REPLACE PARTITION는 이제 다른 파티션에서 발생하는 뮤테이션/머지를 더 이상 기다리지 않습니다. #59138 (Vasily Nemkov).
  • Keeper에서 ACL을 동기화할 때는 유효성 검사를 수행하지 않습니다. 생성 시 이미 유효성 검사가 이루어집니다. 큰 차이는 아닐 수 있지만, 생성된 사용자가 수만 명 또는 그 이상인 설치 환경도 있으며, 불필요한 hash 유효성 검사로 인해 server 시작 시 완료까지 오랜 시간이 걸릴 수 있습니다(Keeper에서 모든 항목을 동기화합니다). #70644 (Raúl Marín).

개선 사항

  • CREATE TABLE ASPRIMARY KEY, ORDER BY와 같은 절(MergeTree 테이블)을 복사합니다. #69739 (sakulali).
  • Keeper에서 64비트 XID를 지원하도록 추가했습니다. use_xid_64 구성 값을 통해 활성화할 수 있습니다. #69908 (Antonio Andelic).
  • Bool 설정의 명령줄 인수는 인수에 값이 지정되지 않으면 true로 설정됩니다(예: clickhouse-client --optimize_aggregation_in_order --query "SELECT 1"). #70459 (davidtsuk).
  • 거의 꽉 찬 디스크에서 삽입이 수행되지 않도록 사용자 수준 설정 min_free_disk_bytes_to_perform_insertmin_free_disk_perform_to_throw_insert가 추가되었습니다. #69755 (Marco Vilas Boas).
  • 설정에 대한 내장 문서는 웹사이트의 문서보다 훨씬 더 자세하고 완전해집니다. 이는 앞으로 웹사이트 문서를 항상 소스 코드에서 자동 생성하도록 하기 위한 첫 단계입니다. 이는 장기적으로 다음과 같은 의미를 갖습니다: - 모든 설정이 빠짐없이 포함됨이 보장됩니다; - 기본값 정보가 Obsolete 상태가 될 가능성이 없습니다; - 각 ClickHouse 버전에 대해 이 문서를 생성할 수 있습니다; - 인터넷에 연결되지 않은 환경에서도 server 자체가 문서를 표시할 수 있습니다. 웹사이트의 문서를 소스 코드에서 생성합니다. #70289 (Alexey Milovidov).
  • 함수 replace에서 빈 needle을 허용하여 PostgreSQL과 동일하게 동작하도록 했습니다. #69918 (zhanglistar).
  • replaceRegexp* 함수에서 빈 검색 문자열도 허용합니다. #70053 (zhanglistar).
  • 스토리지 정책에 따라, 기본 디스크의 store/... 디렉터리 대신 테이블 데이터의 실제 경로를 가리키는 테이블용 심볼릭 링크가 data/database_name/ 디렉터리에 생성됩니다. #61777 (Kirill).
  • JSON에서 Enum field를 parsing할 때, 정수를 담은 문자열은 해당 Enum 요소로 해석됩니다. 이 변경으로 #65119가 해결되었습니다. #66801 (scanhex12).
  • LEADING 또는 TRAILING 빈 문자열에 대해 TRIM을 no-op으로 허용합니다. #67792를 해결합니다. #68455 (Peter Nguyen).
  • Spark와 cast(timestamp as String)의 호환성을 개선했습니다. #69179 (Wenzheng Liu).
  • enable_analyzertrue로 설정된 경우, 상수 표현식 계산에 항상 새로운 분석기를 사용합니다. 또한 상수 표현식에 SELECT 쿼리를 사용하지 않고도 executable 테이블 함수 인수 계산을 지원합니다. #69292 (Dmitry Novik).
  • 특수 문자가 포함된 식별자를 허용하지 않도록 설정 enable_secure_identifiers를 추가했습니다. #69411 (tuanpach).
  • SHOW CREATE TABLE 쿼리 결과에서 식별자의 인용 규칙을 정의하는 show_create_query_identifier_quoting_rule이 추가되었습니다. 가능한 값: - user_display: 식별자가 키워드인 경우. - when_necessary: 식별자가 {"distinct", "all", "table"} 중 하나이거나, 모호함을 유발할 수 있는 경우(컬럼 이름, 딕셔너리 속성 이름). - always: 식별자를 항상 인용합니다. #69448 (tuanpach).
  • 액세스 엔터티의 종속성 복원 개선 #69563 (Vitaly Baranov).
  • clickhouse-client 또는 다른 CLI 애플리케이션을 실행할 때 서버 과부하로 시작이 느린 상태에서 SELECT와 같은 쿼리 입력을 시작하면, 이전 버전에서는 인사 메시지를 출력하기 전에 터미널 에코의 남은 내용이 표시되어 ClickHouse local version 24.10.1.1. 대신 SELECTClickHouse local version 24.10.1.1.처럼 나타났습니다. 이제 이 문제가 수정되었습니다. 이 변경으로 #31696이 해결되었습니다. #69856 (Alexey Milovidov).
  • system.replicas 테이블에 새 컬럼 readonly_duration을 추가했습니다. 알림에서 실제 읽기 전용 레플리카와 센티널 레플리카를 구분할 수 있도록 하기 위해 필요합니다. #69871 (Miсhael Stetsyuk).
  • join_output_by_rowlist_perkey_rows_threshold 설정 유형을 부호 없는 정수로 변경했습니다. #69886 (kevinyhzou).
  • 쿼리 설정을 포함하도록 OpenTelemetry 스팬 로깅을 개선했습니다. #70011 (sharathks118).
  • 람다 결과 유형이 예상과 다를 때 고차 배열 함수에 대한 진단 정보를 추가합니다. #70093 (ttanay).
  • Keeper 개선: 클러스터 변경 중 잠금 사용을 줄였습니다. #70275 (Antonio Andelic).
  • SHOW GRANTS 명령에 WITH IMPLICITFINAL 키워드를 추가했습니다. 암시적 권한과 관련된 사소한 버그를 수정했습니다: #70094. #70293 (pufit).
  • MergeTree 설정에 compatibility를 반영합니다. compatibility 값은 서버 시작 시 default 프로필에서 가져오며, 이에 따라 기본 MergeTree 설정이 변경됩니다. 이후 compatibility 설정을 추가로 변경해도 MergeTree 설정에는 영향을 미치지 않습니다. #70322 (Nikolai Kochetov).
  • 서버 간 통신 중 오류가 발생할 때 큰 HTTP 응답 본문이 로그에 과도하게 기록되지 않도록 했습니다. #70487 (Vladimir Cherkasov).
  • 한 번에 이동할 수 있는 최대 파트 수를 제어하는 새로운 설정 max_parts_to_move가 추가되었습니다. #70520 (Vladimir Cherkasov).
  • 일부 로그 메시지의 발생 빈도를 제한합니다. #70601 (Alexey Milovidov).
  • 클라이언트에서 PART 한정자가 포함된 CHECK TABLE이 잘못된 형식으로 표시되었습니다. #70660 (Alexey Milovidov).
  • Parquet 네이티브 writer를 사용한 컬럼 인덱스 및 오프셋 인덱스 쓰기를 지원합니다. #70669 (LiuNeng).
  • Joda 문법에서 마이크로초와 시간대가 포함된 DateTime64 파싱을 지원합니다(“joda”는 날짜와 시간을 다루는 널리 사용되는 Java 라이브러리이며, “Joda 문법”은 해당 라이브러리의 스타일입니다). #70737 (kevinyhzou).
  • 클라우드 스토리지가 배치 삭제를 지원하는지 판별하는 방식을 변경했습니다. #70786 (Vitaly Baranov).
  • 네이티브 리더의 Parquet page v2 지원. #70807 (Arthur Passos).
  • 테이블에 storage_policydisk가 모두 설정되어 있는지 확인합니다. disk 설정 사용 시 새 스토리지 정책이 기존 정책과 호환되는지 확인하는 검사가 추가되었습니다. #70839 (Kirill).
  • system.s3_queue_settingssystem.azure_queue_settings가 추가되었습니다. #70841 (Kseniia Sumarokova).
  • 이제 base58Encodebase58Decode 함수는 FixedString 유형의 인수도 허용합니다. 예시: SELECT base58Encode(toFixedString('plaintext', 9));. #70846 (Faizan Patel).
  • 파트 로그의 모든 항목 유형에 partition 컬럼을 추가했습니다. 이전에는 일부 항목에만 설정되어 있었습니다. 이로써 #70819가 해결되었습니다. #70848 (Alexey Milovidov).
  • 머지 분석 및 시각화에 도움이 되도록 system.part_logMergeStartMutateStart 이벤트가 추가되었습니다. #70850 (Alexey Milovidov).
  • 머지된 소스 파트 수를 나타내는 프로필 이벤트를 추가했습니다. 이를 통해 운영 환경에서 MergeTree의 팬아웃을 모니터링할 수 있습니다. #70908 (Alexey Milovidov).
  • 파일 시스템 캐시의 백그라운드 다운로드가 다시 활성화되었습니다. #70929 (Nikita Taranov).
  • 전문가용으로만 사용되는 새 머지 선택기 알고리즘 Trivial이 추가되었습니다. 이 알고리즘은 Simple 머지 선택기보다 더 좋지 않습니다. #70969 (Alexey Milovidov).
  • CREATE OR REPLACE VIEW를 원자적으로 지원합니다. #70536 (tuanpach)
  • 여러 조건에 일치하는 경우 동일한 이벤트가 여러 번 집계되는 것을 방지하기 위해 집계 함수 windowFunnelstrict_once 모드를 추가했습니다. #21835 해결. #69738 (Vladimir Cherkasov).

버그 수정(공식 안정 릴리스에서 사용자에게 드러나는 오동작)

  • 전역 Context 객체에 구성 업데이트를 적용합니다. 이를 통해 #62308과 같은 문제가 해결됩니다. #62944 (Amos Bird).
  • 기본값만 적용되던 탓에 ReadSettings에서 사용자 설정값을 사용하지 않던 문제를 수정했습니다. #65625 (Kseniia Sumarokova).
  • sumMapFiltered에서 signed 인수 사용 시 발생하는 유형 불일치 문제를 수정했습니다. #58408 (Chen768959).
  • 선택적 시간대 인수가 전달될 때 toHour와 유사한 변환 함수의 단조성 문제를 수정했습니다. #60264 (Amos Bird).
  • Merge 테이블에 대한 supportsPrewhere 검사를 완화했습니다. 이로써 #61064 문제가 해결되었습니다. 이 검사는 #60082에서 불필요하게 너무 엄격해졌습니다. #61091 (Amos Bird).
  • concurrent_threads_soft_limit_num 제한이 올바르게 적용되도록 use_concurrency_control 설정 처리를 수정했습니다. 이전에는 이 기능이 제대로 작동하지 않았기 때문에, 이제 동시성 제어가 기본적으로 활성화됩니다. #61473 (Sergei Trifonov).
  • 다른 함수(예: NOT) 내부의 IS NULL 검사 때문에 JOIN ON 절 최적화가 잘못 적용되어 잘못된 결과가 발생할 수 있던 문제를 수정했습니다. #67915을 종료합니다. #68049 (Vladimir Cherkasov).
  • 테이블의 CREATE 쿼리를 무효화하는 ALTER 쿼리를 방지합니다. #68574 (János Benjamin Antal).
  • 튜플 및 배열에서 negate (-)와 NOT 함수의 AST 포맷이 일관되지 않던 문제를 수정했습니다. #68600 (Vladimir Cherkasov).
  • 역직렬화 중 불완전한 유형을 Dynamic에 삽입하던 문제를 수정했습니다. 이로 인해 Parameter out of bound 오류가 발생할 수 있었습니다. #69291 (Pavel Kruglov).
  • 실험적 기능이며 프로덕션에서는 사용해서는 안 되는 zero-copy 복제: zero-copy가 적용된 복제된 MergeTree에서 restore replica 이후 발생하는 무한 루프를 수정했습니다. #69293 (MikhailBurdukov).
  • 스토리지 S3Queue에서 processing_threads_num의 기본값을 CPU 코어 수로 다시 설정했습니다. #69384 (Kseniia Sumarokova).
  • 중첩된 반복 protobuf를 중첩 컬럼으로 직렬화/역직렬화할 때 try/catch 흐름을 거치지 않도록 변경했습니다(#41971 수정). #69556 (Eliot Hautefeuille).
  • PostgreSQL engine에서 FixedString 컬럼에 삽입할 때 발생하던 충돌을 수정했습니다. #69584 (Pavel Kruglov).
  • create view t as (with recursive 42 as ttt select ttt); 실행 중 발생하던 충돌을 수정했습니다. #69676 (Han Fei).
  • 값 유형이 DateTime64일 때 maxMapState에서 ‘Bad get’ 예외가 발생하던 문제를 수정했습니다. #69787 (Michael Kolupaev).
  • useDefaultImplementationForLowCardinalityColumnstrue를 반환하도록 재정의해 LowCardinality 컬럼의 getSubcolumn 문제를 수정했습니다. #69831 (Miсhael Stetsyuk).
  • 분산 테이블 삭제가 실패할 경우 분산 전송이 영구적으로 차단되던 문제를 수정했습니다. #69843 (Azat Khuzhin).
  • NaN 키가 포함된 WITH FILL 쿼리가 취소되지 않던 문제를 수정했습니다. 이로써 #69261 문제가 해결되었습니다. #69845 (Alexey Milovidov).
  • 이전 호환성 값을 사용하도록 분석기의 기본값을 수정했습니다. #69895 (Raúl Marín).
  • 기존 테이블을 DROP할 때 CREATE OR REPLACE VIEW에 대한 종속성을 확인하지 않도록 변경했습니다. 이전에는 다시 생성되는 뷰에 종속된 테이블이 있으면 CREATE OR REPLACE 쿼리가 실패했습니다. #69907 (Pavel Kruglov).
  • Decimal 관련 수정입니다. #69730을 해결합니다. #69978 (Arthur Passos).
  • 이제 매개변수화된 뷰에서도 DEFINER/INVOKER가 작동합니다. #69984 (pufit).
  • 뷰 정의자의 파싱을 수정했습니다. #69985 (pufit).
  • 시간대로 인해 Date 또는 Date32 인수가 있는 쿼리 결과가 달라질 수 있던 버그를 수정했습니다. #70036 (Yarik Briukhovetskyi).
  • 중첩된 뷰와 WHERE 조건이 포함된 쿼리에서 발생하던 Block structure mismatch 문제를 수정했습니다. #66209을 수정했습니다. #70054 (Nikolai Kochetov).
  • tuple 함수를 평가할 때 서로 다른 이름이 지정된 Tuple 간에 컬럼을 재사용하지 않도록 했습니다. 이 변경으로 #70022가 수정되었습니다. #70103 (Amos Bird).
  • 범위 내 리터럴을 대체할 때 발생하는 잘못된 LOGICAL_ERROR를 수정했습니다. #70122 (Pablo Marcos).
  • 이러한 데이터 타입의 테이블이 생성되지 않도록 ALTER TABLE MODIFY COLUMN/QUERY 중 Nullable(Nothing) 데이터 타입을 검사합니다. #70123 (Pavel Kruglov).
  • JOIN ... ON *와 같이 잘못된 쿼리에 대해 적절한 오류 메시지를 제공하도록 수정, #68650 해결. #70124 (Vladimir Cherkasov).
  • 스키핑 인덱스에서 잘못된 결과가 반환되던 문제를 수정했습니다. #70127 (Raúl Marín).
  • 해제 후 사용(use-after-free)을 유발할 수 있는 ColumnObject/ColumnTuple decompress 메서드의 데이터 경쟁 문제를 수정했습니다. #70137 (Pavel Kruglov).
  • Dynamic type을 사용하는 ALTER COLUMN에서 발생할 수 있는 멈춤 문제를 수정했습니다. #70144 (Pavel Kruglov).
  • 이제 ClickHouse는 더 많은 오류를 재시도 가능 오류로 간주하며, 이러한 오류가 발생해도 데이터 파트를 손상된 것으로 표시하지 않습니다. #70145 (alesapin).
  • JSON 하위 컬럼의 Dynamic 타입 생성 시 올바른 max_types 매개변수를 사용합니다. #70147 (Pavel Kruglov).
  • bcrypt 인증 메서드를 사용하는 사용자의 system.query_log에 비밀번호가 표시되던 문제를 수정했습니다. #70148 (Nikolay Degterinsky).
  • 네이티브 인터페이스(InterfaceNativeSendBytes)의 이벤트 카운터 문제를 수정했습니다. #70153 (Yakov Olkhovskiy).
  • JSON 컬럼과 관련해 발생할 수 있는 크래시를 수정했습니다. #70172 (Pavel Kruglov).
  • arrayMin 및 arrayMax의 여러 문제를 해결했습니다. #70207 (Raúl Marín).
  • JSON 타입 파서에서 allow_simdjson 설정이 적용되도록 수정했습니다. #70218 (Pavel Kruglov).
  • 두 개의 SELECT와 INTERSECT가 포함된 materialized view를 생성할 때 발생하던 널 포인터 역참조 문제를 수정했습니다. 예: CREATE MATERIALIZED VIEW v0 AS (SELECT 1) INTERSECT (SELECT 1);. #70264 (Konstantin Bogdanov).
  • 시작 스크립트로 전역 설정을 수정하지 마십시오. 이전에는 시작 스크립트에서 설정을 변경하면 해당 변경이 전역에 적용되었습니다. #70310 (Antonio Andelic).
  • 서버 충돌로 이어질 수 있는 Dynamic 타입의 ALTER에서 max_types 매개변수를 줄일 때 발생하던 문제를 수정했습니다. #70328 (Pavel Kruglov).
  • WITH FILL을 잘못 사용했을 때 발생하던 충돌을 수정했습니다. #70338 (Raúl Marín).
  • SYSTEM DROP FORMAT SCHEMA CACHE FOR Protobuf에서 발생할 수 있는 use-after-free 문제를 수정했습니다. #70358 (Azat Khuzhin).
  • JSON 하위 객체의 서브컬럼을 GROUP BY할 때 발생하던 충돌을 수정했습니다. #70374 (Pavel Kruglov).
  • 파트에 행이 없을 경우 수직 병합 시 파트를 프리페치하지 않습니다. #70452 (Antonio Andelic).
  • 람다 함수가 포함된 WHERE 절에서 발생하던 충돌을 수정했습니다. #70464 (Raúl Marín).
  • 보조 레플리카에서 테이블 함수 소스를 사용할 수 없을 때 Replicated 데이터베이스의 CREATE ... AS table_function(...)를 이용한 테이블 생성 문제를 수정했습니다. #70511 (Kseniia Sumarokova).
  • wait_for_async_insert=1이 설정된 async insert의 모든 출력을 무시합니다. #62644를 해결합니다. #70530 (Konstantin Bogdanov).
  • system.remote_data_paths에서 shadow 디렉터리를 순회하는 동안 frozen_metadata.txt는 무시됩니다. #70590 (Aleksei Filatov).
  • 메모리 정렬이 맞지 않을 때 상태 저장 윈도우 함수 생성이 잘못되던 문제를 수정했습니다. #70631 (Raúl Marín).
  • 비어 있지 않은 기본 표현식을 가진 Array 유형의 컬럼을 추가한 뒤 SELECT와 머지 중 드물게 발생하던 크래시를 수정했습니다. #70695 (Anton Popov).
  • 테이블 함수 s3에 삽입할 때 쿼리 설정이 반영됩니다. #70696 (Vladimir Cherkasov).
  • 지원되지 않는 필드를 스키핑하도록 활성화된 상태에서 protobuf 스키마를 추론할 때 발생하던 무한 재귀를 수정했습니다. #70697 (Raúl Marín).
  • 기본값으로 enable_named_columns_in_function_tuple을 비활성화합니다. #70833 (Raúl Marín).
  • 서버의 CPU 코어 수를 바탕으로 결정된 경우 S3Queue 테이블 엔진 설정 processing_threads_num이 적용되지 않던 문제를 수정했습니다. #70837 (Kseniia Sumarokova).
  • 집계 상태의 named tuple 인수를 정규화합니다. 이 변경으로 #69732 문제가 수정되었습니다. #70853 (Amos Bird).
  • 2단계 해시 테이블에서 음수 0으로 인해 발생한 논리 오류를 수정했습니다. 이로써 #70973가 해결되었습니다. #70979 (Alexey Milovidov).
  • 분산 및 병렬 레플리카에서 limit by, limit with ties 관련 문제를 수정했습니다. #70880 (Nikita Taranov).

ClickHouse 릴리스 24.9, 2024-09-26. 발표 자료, 동영상

하위 호환되지 않는 변경 사항

  • a[b].c와 같은 표현식이 이름이 지정된 Tuple에 대해 지원되며, expr().name처럼 임의의 표현식에 이름 기반 첨자를 사용하는 것도 지원됩니다. 이는 JSON 처리에 유용합니다. 이 변경으로 #54965가 해결되었습니다. 이전 버전에서는 expr().name 형태의 표현식이 tupleElement(expr(), name)으로 파싱되었고, 쿼리 분석기는 해당 Tuple 요소가 아니라 name이라는 컬럼을 찾았습니다. 새 버전에서는 이것이 tupleElement(expr(), 'name')으로 변경되었습니다. 대부분의 경우 이전 버전은 제대로 동작하지 않았지만, 이 변경으로 인해 비호환성이 발생할 수 있는 매우 이례적인 시나리오를 생각해 볼 수는 있습니다. 예를 들어 Tuple 요소의 이름과는 다른 이름을 가진 컬럼이나 별칭에 Tuple 요소 이름을 저장한 경우입니다: SELECT 'b' AS a, CAST([tuple(123)] AS 'Array(Tuple(b UInt8))') AS t, t[1].a. 이러한 쿼리를 사용했을 가능성은 매우 낮지만, 그래도 이 변경 사항은 잠재적으로 하위 호환되지 않을 수 있으므로 이렇게 표시합니다. #68435 (Alexey Milovidov).
  • 설정 print_pretty_type_names가 활성화되면 SHOW CREATE TABLE SQL 문, formatQuery 함수, 그리고 clickhouse-clientclickhouse-local의 대화형 모드에서 Tuple 데이터 타입을 보기 좋은 형식으로 출력합니다. 이전 버전에서는 이 설정이 DESCRIBE 쿼리와 toTypeName에만 적용되었습니다. 이 변경으로 #65753가 해결되었습니다. #68492 (Alexey Milovidov).
  • Replicated 데이터베이스에서 테이블을 생성할 때 UUID를 명시적으로 지정하는 것은 허용되지 않습니다. 또한 Replicated 데이터베이스의 *MergeTree 테이블에 대해 Keeper 경로와 레플리카 이름을 명시적으로 지정하는 것도 허용되지 않습니다. 이 변경으로 새로운 설정 database_replicated_allow_explicit_uuid가 도입되며, database_replicated_allow_replicated_engine_arguments의 유형도 Bool에서 UInt64로 변경됩니다 #66104 (Alexander Tokmakov).

새로운 기능

  • 사용자가 하나가 아니라 여러 인증 메서드를 사용할 수 있도록 합니다. 인증 메서드를 가장 최근에 추가된 메서드로 재설정할 수 있도록 합니다. 한동안 24.8 인스턴스와 24.9 인스턴스 1개를 함께 실행하려는 경우, 잠재적인 비호환성을 방지하기 위해 해당 기간에는 max_authentication_methods_per_user = 1로 설정하는 것이 좋습니다. #65277 (Arthur Passos).
  • ATTACH PARTITION ALL FROM 지원이 추가되었습니다. #61987 (Kirill Nikiforov).
  • input_format_json_empty_as_default 설정을 추가했습니다. 이 설정을 활성화하면 JSON 입력의 빈 필드를 기본값으로 처리합니다. #59339을 해결합니다. #66782 (Alexis Arnaud).
  • 문자열의 일부를 다른 문자열로 바꾸는 함수 overlayoverlayUTF8이 추가되었습니다. 예시: SELECT overlay('Hello New York', 'Jersey', 11)Hello New Jersey를 반환합니다. #66933 (李扬).
  • 파티션 DELETE FROM [db.]table [ON CLUSTER cluster] [IN PARTITION partition_expr] WHERE expr; 에서 경량한 삭제를 지원하도록 추가했습니다. #67805 (sunny).
  • 서로 다른 도메인(예: 초와 분)의 Interval 데이터 타입 값에 대한 비교를 구현했으며, 이제 이 값들은 최소 공통 supertype으로 변환됩니다. #68057 (Yarik Briukhovetskyi).
  • CREATE SQL 문에서 기본적으로 IF NOT EXISTS 동작이 적용되도록 create_if_not_exists 설정이 추가되었습니다. #68164 (Peter Nguyen).
  • Azure 및 로컬 환경에서 Iceberg 테이블을 읽을 수 있습니다. #68210 (Daniil Ivanik).
  • 이제 태그를 기준으로 쿼리 캐시 엔트리를 삭제할 수 있습니다. 예를 들어, SELECT 1 SETTINGS use_query_cache = true, query_cache_tag = 'abc'로 생성된 쿼리 캐시 엔트리는 이제 SYSTEM DROP QUERY CACHE TAG 'abc'를 사용해 삭제할 수 있습니다. #68477 (Michał Tabaszewski).
  • 이름이 지정된 컬렉션에 저장 암호화 기능을 추가했습니다. #68615 (Pablo Marcos).
  • URL 테이블 엔진에 가상 컬럼 _headers를 추가합니다. #65026를 해결합니다. #68867 (flynn).
  • 사용 가능한 프로젝션을 추적할 수 있도록 system.projections 테이블을 추가했습니다. #68901 (Jordi Villar).
  • Spark 호환성을 위해 새로운 함수 arrayZipUnaligned를 추가했습니다(Spark에서는 arrays_zip라는 이름으로 제공됨). 이 함수는 기존 arrayZip를 기반으로 하며, 길이가 맞지 않는 배열도 허용합니다. #69030 (李扬).
  • 노드를 원자적으로 복사하거나 이동하는 cp/mv 명령이 Keeper 클라이언트 명령줄 애플리케이션에 추가되었습니다. #69034 (Mikhail Artemenko).
  • 함수 arrayAUC에 인수 scale(기본값: true)을 추가해 정규화 단계를 건너뛸 수 있도록 했습니다(issue #69609). #69717 (gabrielmcg44).

실험적 기능

  • input_format_try_infer_variants 설정이 추가되어, 컬럼/배열 요소에 가능한 타입이 둘 이상인 경우 텍스트 형식의 스키마 추론 중 Variant 타입을 추론할 수 있습니다. #63798 (Shaun Struwig).
  • JSON 컬럼 타입 콘텐츠의 내부 검사를 개선하기 위한 집계 함수 distinctDynamicTypes/distinctJSONPaths/distinctJSONPathsAndTypes를 추가했습니다. #68463 (Kruglov Pavel).
  • consistent hash를 사용해 병렬 레플리카 간 마크 분배 단위를 결정하는 새 알고리즘을 도입했습니다. 성능 향상을 위해 읽기 패턴별로 서로 다른 수의 마크를 선택합니다. #68424 (Nikita Taranov).
  • 이전에는 병렬 레플리카 announcement 처리에서 파트 중복 제거 로직의 알고리즘 복잡도가 O(n^2)였으며, 파트(또는 파티션)가 많은 테이블에서는 눈에 띄는 시간이 걸릴 수 있었습니다. 이번 변경으로 복잡도가 O(n*log(n))으로 낮아졌습니다. #69596 (Alexander Gololobov).
  • 갱신 가능 구체화 뷰 개선: 전체 테이블을 덮어쓰는 대신 기존 테이블에 행을 추가하는 append 모드(... REFRESH EVERY 1 MINUTE APPEND ...), 재시도(기본적으로 비활성화되며 쿼리의 SETTINGS 섹션에서 구성), 현재 실행 중인 갱신이 끝날 때까지 대기하는 SYSTEM WAIT VIEW <name> 쿼리, 그리고 일부 수정 사항이 포함되었습니다. #58934 (Michael Kolupaev).
  • 새로운 유형의 (실험적) 통계로 min_max를 추가했습니다. 이 기능은 숫자 컬럼에 대한 범위 프레디케이트(예: x < 100) 추정을 지원합니다. #67013 (JackyWoo).
  • 내부 타입을 전혀 변환할 수 없는 경우에도 Variant/Dynamic 컬럼에서 castOrDefault가 동작하도록 개선했습니다. #67150 (Kruglov Pavel).
  • 이제 MaterializedPostgreSQL을 통해 일부 컬럼의 복제를 사용할 수 있습니다. #33748을 해결했습니다. #69092 (Kruglov Kirill).

성능 개선

  • Hive 파티셔닝에서 필요한 파일만 읽도록 구현했습니다. #68963 (Yarik Briukhovetskyi).
  • LEFT 또는 INNER 해시 조인에서 테이블 키가 조밀한 경우, 오른쪽 테이블을 키 기준으로 재배열해 JOIN 성능을 개선했습니다. #60341 (kevinyhzou).
  • 행 목록을 지연 방식으로 추가해 ALL JOIN 성능을 개선했습니다. #63677 (kevinyhzou).
  • 재시작 속도를 높이기 위해 부팅 과정에서 파일 시스템 캐시 메타데이터를 비동기적으로 로드하도록 했습니다(load_metadata_asynchronously 설정으로 제어). #65736 (Daniel Pozo Escalona).
  • 함수 arraymap이 일부 일반적인 사례를 훨씬 더 빠르게 처리하도록 최적화했습니다. #67707 (李扬).
  • 특히 컬럼에 NULL이 없는 경우 ORC 문자열 읽기를 단순하게 최적화했습니다. #67794 (李扬).
  • 머지 단계 스케줄링의 오버헤드를 줄여 머지의 전반적인 성능을 개선했습니다. #68016 (Anton Popov).
  • profile이 설정되지 않고 자격 증명도 없으며 IMDS를 사용할 수 없는 경우(예: 클라우드 외부의 머신에서 공개 버킷을 쿼리하는 경우) S3 요청 속도를 높였습니다. 이 변경으로 #52771이 해결됩니다. #68082 (Alexey Milovidov).
  • 일부 성능 향상을 위해 RowInputFormatWithNamesAndTypes의 포맷 리더를 디버추얼라이즈했습니다. #68437 (李扬).
  • CPU 활용도를 극대화하기 위해 키 기준으로 group by 집계를 수행할 때 uniq 집계 함수에 병렬 머지를 추가했습니다. #68441 (Jiebin Sun).
  • 사용자가 ORC 출력 형식에서 문자열 컬럼에 딕셔너리 인코딩을 활성화할 수 있도록 output_format_orc_dictionary_key_size_threshold 설정을 추가했습니다. 이를 통해 출력 ORC 파일 크기를 줄이고 읽기 성능을 크게 향상할 수 있습니다. #68591 (李扬).
  • 노드와 그 하위 트리 전체를 제거하는 새로운 Keeper 요청 RemoveRecursive를 도입했습니다. #69332 (Mikhail Artemenko).
  • vector similarity index에 데이터를 병렬로 추가해 해당 인덱스가 있는 테이블에 대한 삽입 성능을 높였습니다. #69493 (flynn).
  • 적응형 쓰기 버퍼 크기를 사용해 JSON 삽입 시 메모리 사용량을 줄였습니다. wide 파트의 JSON 컬럼이 생성하는 많은 파일에는 데이터가 소량만 들어 있으므로, 이들에 1MB 버퍼를 할당하는 것은 비효율적입니다. #69272 (Kruglov Pavel).
  • concurrent hash join 스레드 풀에서 스레드를 반환하지 않도록 해, 쿼리가 스레드를 과도하게 생성하는 문제를 방지했습니다. #69406 (Duc Canh Le).

개선

  • 이제 CREATE TABLE AS는 PRIMARY KEY, ORDER BY 및 이와 유사한 절도 복사합니다. 현재는 MergeTree 엔진 계열의 테이블 엔진에서만 지원됩니다. #69076 (sakulali).
  • 작은 엔터티의 parsing과 관련된 코드베이스를 강화했습니다. 다음과 같은 (사소한) 버그를 발견하여 수정했습니다. - DeltaLake 테이블이 Bool로 파티션되어 있으면 파티션 값이 항상 false로 해석되던 문제; - ExternalDistributed 테이블이 제공된 주소에서 세그먼트 하나만 사용하던 문제; max_threads 설정 등의 값이 auto(N)가 아니라 'auto(N)'로 출력되던 문제를 수정했습니다. #52503 (Alexey Milovidov).
  • CPU 사용량 산정에는 시스템 전체 메트릭 대신 cgroup별 메트릭을 사용합니다. #62003 (Nikita Taranov).
  • 원격 S3 디스크의 IO 스케줄링이 이제 bandwidth_limit 스로틀링 문제를 해결하기 위해 전체 S3 요청이 아니라 HTTP 소켓 스트림 단위로 수행됩니다. #65182 (Sergei Trifonov).
  • 함수 upperUTF8lowerUTF8는 이전까지는 키릴 문자만 대문자/소문자로 변환할 수 있었습니다. 이제 이 제한이 없어져, 모든 언어의 문자를 대문자/소문자로 변환할 수 있습니다. 예시: SELECT upperUTF8('Süden')는 이제 SÜDEN을 반환합니다. #65761 (李扬).
  • 프로젝션이 있는 테이블에서 경량한 삭제가 발생하는 경우, 기존에는 경량한 삭제를 수행하려 할 때 예외를 발생시키거나(기본값) 프로젝션을 삭제하는 방법만 선택할 수 있었지만, 이제는 세 번째 옵션으로 경량한 삭제를 계속 수행한 뒤 프로젝션을 다시 빌드할 수 있습니다. #66169 (jsc0218).
  • 두 가지 옵션(dns_allow_resolve_names_to_ipv4dns_allow_resolve_names_to_ipv6)이 추가되어, 연결에 사용할 IP 패밀리를 차단할 수 있게 되었습니다. #66895 (MikhailBurdukov).
  • clickhouse-client에서 Ctrl-Z 무시(ignore_shell_suspend)를 설정할 수 있게 했습니다. #67134 (Azat Khuzhin).
  • JSON 출력 형식에서 UTF-8 검증을 개선했습니다. 그에 따라 결과 데이터에 특정 바이트 시퀀스가 포함된 경우에도 유효한 JSON이 생성됩니다. #67938 (mwoenker).
  • 머지와 뮤테이션 관련 profile events를 추가해 내부 검사를 개선했습니다. #68015 (Anton Popov).
  • ODBC: 서버 구성에서 http_max_tries를 가져오도록 했습니다. #68128 (Rodolphe Dugé de Bernonville).
  • X.509 SubjectAltName 확장 기능에서 사용자 식별 시 와일드카드를 지원하도록 했습니다. #68236 (Marco Vilas Boas).
  • 날짜/시간에 대한 스키마 추론을 개선했습니다. 이제 DateTime64는 날짜/시간에 소수점 이하가 있을 때만 사용되며, 그렇지 않으면 일반 DateTime이 사용됩니다. 이제 Date/DateTime 추론은 더 엄격해졌으며, 특히 date_time_input_format='best_effort'일 때는 경계 사례에서 문자열을 날짜/시간으로 추론하지 않도록 했습니다. #68382 (Kruglov Pavel).
  • 딕셔너리의 이름이 지정된 컬렉션 관련 기존 코드를 제거하고, DDL로 생성한 이름이 지정된 컬렉션을 딕셔너리에서 사용할 수 있는 새 코드로 교체했습니다. #60936, #36890을 해결합니다. #68412 (Kseniia Sumarokova).
  • 외부 HTTP 인증기에는 기본값으로 설정된 HTTP/1.0 대신 HTTP/1.1을 사용합니다. #68456 (Aleksei Filatov).
  • 스레드 풀 내부 검사를 위한 새로운 메트릭 세트를 추가하여 스레드 풀의 성능과 동작을 더 자세히 파악할 수 있게 되었습니다. #68674 (filimonov).
  • 포맷이 Values인 async 삽입에서 쿼리 매개변수를 지원합니다. #68741 (Anton Popov).
  • dateTrunctoStartOfInterval에서 Date32를 지원하도록 추가했습니다. #68874 (LiuNeng).
  • system.processors_profile_logplan_step_nameplan_step_description 컬럼이 추가되었습니다. #68954 (Alexander Gololobov).
  • 내장 사전에 스페인어 지원이 추가되었습니다. #69035 (Vasily Okunev).
  • 간단한 장애 정보 메시지에 CPU 아키텍처를 추가합니다. #69037 (Konstantin Bogdanov).
  • 재시도 중 새 Keeper 연결을 설정하지 못하면 쿼리가 더 빠르게 실패합니다. #69148 (Raúl Marín).
  • 사용자 정의 데이터베이스 엔진에서 인수, 설정, 테이블 오버라이드를 사용할 수 있도록 Database Factory를 업데이트했습니다(StorageFactory와 유사). #69201 (NikBarykin).
  • 모든 외부 테이블 엔진과 함수를 Null 엔진으로 대체하는 복원 모드(restore_replace_external_engines_to_null, restore_replace_external_table_functions_to_null 설정)는 테이블에 SETTINGS가 있으면 실패하곤 했습니다. 이제는 이런 경우 테이블 정의에서 설정을 제거해 해당 테이블도 복원할 수 있습니다. #69253 (Ilya Yatsishin).
  • CLICKHOUSE_PASSWORD가 clickhouse 이미지의 엔트리포인트에서 XML용으로 올바르게 이스케이프 처리됩니다. #69301 (aohoyd).
  • arrayZip/arrayZipUnaligned에서 https://github.com/ClickHouse/ClickHouse/pull/65887의 concat과 마찬가지로 빈 인수를 허용하도록 했습니다. 이는 Gluten CH Backend에서 Spark 호환성을 위한 것입니다. #69576 (李扬).
  • Keeper의 내부 통신에서 더 고급 SSL 옵션(예: 패스프레이스가 설정된 개인 키)을 지원합니다. #69582 (Antonio Andelic).
  • 파트 또는 파티션이 많은 대형 테이블에서는 인덱스 분석에 상당한 시간이 걸릴 수 있습니다. 이 변경으로 해당 단계에서 부하가 큰 쿼리를 강제 종료할 수 있게 됩니다. #69606 (Alexander Gololobov).
  • gcs 테이블 함수에서 민감한 정보 마스킹 기능 추가. #69611 (Vitaly Baranov).
  • 행 수를 줄이는 머지 시 프로젝션을 다시 빌드합니다. #62364 (cangyin).

버그 수정(공식 안정 릴리스에서 사용자에게 드러나는 오동작)

  • pg dbname에 ”-“가 포함된 경우, 실험적이고 지원되지 않는 MaterializedPostgreSQL 엔진에서 테이블 ATTACH가 되지 않던 문제를 수정했습니다. #62730 (takakawa).
  • 실험적이며 전혀 지원되지 않는 MaterializedPostgreSQL 엔진에서 adnum 순서가 잘못된 경우 생성 컬럼에서 발생하던 오류를 수정했습니다 #63161. 실험적이며 전혀 지원되지 않는 MaterializedPostgreSQL에서 테이블에 생성 컬럼이 있을 때 기본값이 nextval 표현식인 id 컬럼에서 발생하던 오류를 수정했습니다. [a-z1-9-] 이외의 기호가 포함된 publication을 삭제할 때 발생하던 오류를 수정했습니다. #67664 (Kruglov Kirill).
  • 왼쪽 테이블의 널 허용 컬럼을 지원하도록 Storage Join을 개선해 #61247을 해결했습니다. #66926 (vdimir).
  • IN 연산자에 Decimal() 변환이 포함되어 있을 때 병렬 레플리카(쿼리도 분산)에서 쿼리 결과가 잘못 반환되던 문제가 있었습니다. 이 버그는 새로운 분석기 도입과 함께 발생했습니다. #67234 (Igor Nikonov).
  • ALTER MODIFY ORDER BY로 인해 메타데이터 불일치가 발생하는 문제를 수정했습니다. #67436 (iceFireser).
  • 함수 fromModifiedJulianDay의 상한을 수정했습니다. 원래는 9999-12-31이어야 했지만, 잘못 9999-01-01로 설정되어 있었습니다. #67583 (PHO).
  • IN 쿼리에서 인덱스가 Tuple 시작 부분에 없을 때 발생하는 문제를 수정했습니다. #67626 (Yarik Briukhovetskyi).
  • RoleCache의 만료 처리 문제를 수정했습니다. #67748 (Vitaly Baranov).
  • 뷰로 플러시가 지연되어 window view에서 블록이 누락되던 문제를 수정했습니다. #67983 (Raúl Marín).
  • 잘못된 날짜 포맷으로 인해 발생한 MSan 문제를 해결했습니다. #68105 (JackyWoo).
  • 파일 내 데이터 타입이 요청된 타입과 크게 다를 때 Parquet 필터링 중 발생하던 충돌을 수정했습니다(예: ... FROM file('a.parquet', Parquet, 'x String')를 요청했지만, 파일에는 x Int64가 있는 경우). 이 수정이 포함되지 않은 경우 우회책으로 input_format_parquet_filter_push_down = 0을 사용하십시오. #68131 (Michael Kolupaev).
  • #67091에서 도입된 lag/lead 관련 충돌 문제를 수정했습니다. #68262 (lgbo).
  • 쿼리 취소 시 postgres 충돌 문제를 수정했습니다. #68288 (Kseniia Sumarokova).
  • https://github.com/ClickHouse/ClickHouse/pull/61984 이후 schema_inference_make_columns_nullable=0이어도 Parquet/Arrow 포맷에서는 여전히 컬럼이 Nullable로 추론될 수 있었습니다. 이 변경은 하위 호환되지 않았고, 사용자들도 동작 변화을 인지했습니다. 이 PR은 schema_inference_make_columns_nullable=0이 이전처럼 동작하도록(즉, 널 허용 컬럼이 추론되지 않도록) 복원하고, 데이터에 null 허용 여부 정보가 있을 때만 컬럼을 Nullable로 만드는 이 설정의 새 값 auto를 도입합니다. #68298 (Kruglov Pavel).
  • #50868를 수정했습니다. 분산 쿼리 내부의 중첩된 하위 쿼리가 반환한 작은 DateTime64 상수값들이 잘못 NULL로 변환되어, 그 결과 오류가 발생하고 쿼리 결과가 잘못될 수 있었습니다. #68323 (Shankar).
  • 쿼리 SYSTEM SYNC REPLICA에서 누락된 sync replica 모드 문제를 수정했습니다. #68326 (Duc Canh Le).
  • 키 조건의 버그를 수정했습니다. #68354 (Han Fei).
  • LDAP 외부 사용자 디렉터리에서 사용 중인 Role을 삭제하거나 이름을 변경할 때 발생하는 충돌을 수정했습니다. #68355 (Andrey Zvonov).
  • system.view_refreshes에서 Progress 컬럼 값이 1보다 크게 표시되던 문제를 수정했습니다 #68377. #68378 (megao).
  • regexp 플래그를 올바르게 처리하도록 수정했습니다. #68389 (Han Fei).
  • PostgreSQL 스타일 CAST 연산자(::)는 SQL 스타일 16진수 및 바이너리 문자열 리터럴(예: SELECT x'414243'::String)에서도 올바르게 동작합니다. 이로써 #68324가 수정되었습니다. #68482 (Alexey Milovidov).
  • https://github.com/ClickHouse/ClickHouse/pull/68131에 대한 경미한 패치입니다. #68494 (Chang chen).
  • #68239 n이 정수인 경우의 SAMPLE n 문제를 수정했습니다. #68499 (Denis Hananein).
  • 두 분포의 크기가 서로 다를 때 mann-whitney-utest의 버그를 수정했습니다. #68556 (Han Fei).
  • 예기치 않게 재시작된 후 covered-by-broken part가 비정상적으로 처리되어 ReplicatedMergeTree의 복제가 시작되지 않던 문제를 수정했습니다. #68584 (baolin).
  • 함수 sipHash64Keyed, sipHash128Keyed 또는 sipHash128ReferenceKeyed를 빈 배열이나 튜플에 적용할 때 발생하던 LOGICAL_ERROR를 수정했습니다. #68630 (Robert Schulze).
  • 텍스트 인덱스는 여러 컬럼에 인덱스를 생성할 때 잘못된 컬럼을 필터링할 수 있었는데, 이는 서로 다른 컬럼 사이에서 row_id를 재설정하지 않았기 때문입니다. 재현 절차는 tests/queries/0_stateless/03228_full_text_with_multi_col.sql에 있습니다. 이 문제가 수정되었습니다. #68644 (siyuan).
  • Replicated 테이블을 생성할 때 replica_name에 포함된 잘못된 문자 ‘\t’ 및 ‘\n’를 수정했습니다. 이로 인해 LogEntry에서 ‘source replica’가 잘못 파싱되는 문제가 발생했습니다. 이 내용은 이슈 #68640에서 언급되었습니다. #68645 (Zhigao Hong).
  • 분산 테이블에 가상 컬럼 _table_database가 다시 추가되었습니다. 이 컬럼들은 24.3 버전까지 제공되었습니다. #68672 (Anton Popov).
  • Variant 컬럼 순열 처리 중 발생할 수 있는 오류 Size of permutation (0) is less than required (...)를 수정했습니다. #68681 (Kruglov Pavel).
  • 새 JSON 컬럼 사용 시 발생할 수 있는 오류 DB::Exception: Block structure mismatch in joined block stream: different columns:를 수정했습니다. #68686 (Kruglov Pavel).
  • 함수 sipHash(64/128)Keyed에서 배열을 키로 사용하는 맵을 해시할 때 발생하던 구체화된 상수 키 관련 문제를 수정했습니다. #68731 (Salvatore Mesoraca).
  • ColumnsDescription::toString이 동일한 IAST::FormatState object를 사용해 각 컬럼을 포맷하도록 변경했습니다. 이로써 일관된 컬럼 메타데이터가 디스크와 ZooKeeper에 기록됩니다. #68733 (Miсhael Stetsyuk).
  • grouping sets의 집계 데이터 병합 문제를 수정했습니다. #68744 (Nikolai Kochetov).
  • 복제된 merge tree를 생성한 뒤 컬럼을 변경하고 modify statistics를 실행할 때 발생하는 논리 오류를 수정했습니다. #68820 (Han Fei).
  • 분석기에서 서브쿼리의 동적 서브컬럼을 해석할 때 발생하던 문제를 수정했습니다. #68824 (Kruglov Pavel).
  • DeltaLake의 복합 타입 메타데이터 파싱을 수정했습니다. #68739을 해결합니다. #68836 (Kseniia Sumarokova).
  • 삽입 후 테이블에 플러시되기 전에 ALTER ADD/MODIFY COLUMN 쿼리로 테이블 메타데이터가 변경되는 경우 발생하던 asynchronous inserts 문제를 수정했습니다. #68837 (Anton Popov).
  • 배열에 빈 튜플을 전달할 때 발생하던 예기치 않은 예외를 수정했습니다. 이 수정으로 #68618이 해결되었습니다. #68848 (Amos Bird).
  • 순수 메타데이터 뮤테이션 명령 파싱을 수정했습니다. #68935 (János Benjamin Antal).
  • anyHeavy 상태 머지 시 발생할 수 있는 잘못된 결과 문제를 수정했습니다. #68950 (Raúl Marín).
  • optimize_functions_to_subcolumns 설정이 활성화된 상태에서 구체화된 뷰(Materialized View)에 쓰기 시 발생하던 문제가 수정되었습니다. #68951 (Anton Popov).
  • const Dynamic 컬럼 메서드에서 serialization cache를 사용하지 않도록 했습니다. 이로 인해 집계 중 초기화되지 않은 값이 사용되거나 race condition이 발생할 수 있었습니다. #68953 (Kruglov Pavel).
  • 일부 경우 JSON 타입을 파싱하는 동안 null이 기본값으로 삽입되어야 할 때 발생하던 파싱 오류를 수정했습니다. #68955 (Kruglov Pavel).
  • 일부 압축 응답에서 Content-Encoding 헤더가 전송되지 않는 문제를 수정했습니다. #64802. #68975 (Konstantin Bogdanov).
  • 경로가 잘못 이어져 //가 포함되는 경우가 있었는데, 경로 정규화를 통해 이 문제를 해결했습니다. #69066 (Yarik Briukhovetskyi).
  • 빈 async insert가 있는 경우 발생하는 논리 오류를 수정했습니다. #69080 (Han Fei).
  • 쿼리 취소 중 clickhouse-client의 진행률 표시에서 발생하던 경쟁 상태를 수정했습니다. #69081 (Sergei Trifonov).
  • 거리 함수로 cosine distance를 사용할 때 현재 Experimental 상태인 벡터 유사도 인덱스가 사용되지 않던 버그를 수정했습니다. #69090 (flynn).
  • 이 변경은 초기 생성 과정에서 서버 장애가 발생한 후 복제된 데이터베이스를 다시 생성하려고 할 때 오류가 발생할 수 있는 문제를 해결합니다. #69102 (Miсhael Stetsyuk).
  • 문자열에서 bool 값을 읽는 것은 허용되지 않으므로, input_format_csv_try_infer_numbers_from_strings = 1일 때 CSV의 String에서 Bool 유형을 추론하지 않도록 했습니다. #69109 (Kruglov Pavel).
  • --multiquery가 활성화된 경우 클라이언트에서 발생하던 explain ast insert 쿼리의 파싱 오류를 수정했습니다. #69123 (wxybear).
  • 병렬 레플리카를 사용하는 쿼리에서 서브쿼리의 UNION 절이 제대로 처리되지 않아 LOGICAL_ERROR Duplicate announcement received for replica가 발생했습니다. #69146 (Igor Nikonov).
  • s3Cluster에서 structure 인수가 올바르게 전파되지 않던 문제를 수정했습니다. 이전에는 s3Cluster에서 레플리카로 쿼리를 전송할 때 컬럼의 DEFAULT 표현식이 누락될 수 있었습니다. #69147 (Kruglov Pavel).
  • 표현식에서 대상 유형으로 변환할 때 Values 형식의 포맷 설정을 준수하도록 했습니다. #69149 (Kruglov Pavel).
  • 읽기 전용 사용자의 clickhouse-client --queries-file 문제를 수정했습니다(이전에는 Cannot modify 'log_comment' setting in readonly mode 오류로 실패했습니다). #69175 (Azat Khuzhin).
  • 일찍 종료된 프로세스에 파이프로 연결될 때 clickhouse-client에서 발생하는 데이터 레이스 문제를 수정했습니다. #69186 (vdimir).
  • JSON/Dynamic 타입에서 uniq 및 GROUP BY의 잘못된 결과를 수정했습니다. #69203 (Kruglov Pavel).
  • 비동기 삽입에서 INFILE 포맷 감지 문제를 수정했습니다. FORMAT 절에서 포맷을 명시적으로 지정하지 않은 경우, INFILE 파일 확장자로 포맷을 감지할 수 있습니다. #69237 (Julia Kartseva).
  • this issue 이후, 운영 환경에서 metadata_version 노드 값이 0이면서 해당 테이블의 metadata 노드 버전과도 일치하지 않는 테이블 레플리카가 상당수 존재합니다. 이로 인해 해당 레플리카에서 alter 쿼리가 실패합니다. #69274 (Miсhael Stetsyuk).
  • Fields 관련 문제를 방지하기 위해 Dynamic type을 프라이머리 키(primary key)로 사용하기에 안전한 유형이 아닌 것으로 표시합니다. #69311 (Kruglov Pavel).
  • 액세스 엔터티 의존성 복원 기능을 개선했습니다. #69346 (Vitaly Baranov).
  • 삽입용 connection을 가져오는 과정에서 모든 connection 시도가 실패할 때 발생하던 정의되지 않은 동작을 수정했습니다. #69390 (Pablo Marcos).
  • #69135을 해결했습니다. cross join에 조인된 데이터를 재사용하려고 해도 현재 ClickHouse에서는 이런 상황이 발생할 수 없습니다. reuseJoinedDatahave_compressed를 그대로 유지하는 편이 더 낫습니다. #69404 (lgbo).
  • materialize() 함수가 매개변수가 희소 컬럼인 경우 전체 컬럼을 반환하도록 수정했습니다. #69429 (Alexander Gololobov).
  • 함수 sqidDecode에서 발생하던 LOGICAL_ERROR를 수정했습니다 (#69450). #69451 (Robert Schulze).
  • 24.6의 s3queue 문제 또는 Replicated 데이터베이스를 사용하는 CREATE 쿼리에 대한 빠른 수정입니다. #69454 (Kseniia Sumarokova).
  • INSERT INTO ... SELECT 또는 CREATE TABLE AS SELECT 쿼리에서 squashing 과정 때문에 메모리 사용량이 지나치게 높아지던 문제를 수정했습니다. #69469 (Yarik Briukhovetskyi).
  • SQL 문 SHOW COLUMNSSHOW INDEX가 이제 테이블 이름에 점이 포함된 경우에도 올바르게 작동합니다. #69514 (Salvatore Mesoraca).
  • 이제 오버플로우 모드가 != ‘throw’인 쿼리에서는 쿼리 캐시를 사용할 수 없습니다. 이를 통해 잘리거나 잘못된 쿼리 결과가 쿼리 캐시에 저장될 수 있는 상황을 방지합니다. (이슈 #67476). #69549 (Robert Schulze).
  • prewhere로 이동하는 동안 conditions의 원래 순서를 유지합니다. 이전에는 순서가 바뀔 수 있어, 순서가 중요한 경우 쿼리가 실패할 수 있었습니다. #69560 (Kruglov Pavel).
  • ZNOAUTH 오류 발생 후 Keeper의 다중 요청 전처리를 수정했습니다. #69627 (Antonio Andelic).
  • 새 레플리카를 생성할 때 DatabaseReplicated에서 TTL의 WHERE 절로 인해 발생할 수 있는 METADATA_MISMATCH를 수정했습니다. #69736 (Nikolay Degterinsky).
  • StorageS3(Azure)Queue 설정 tracked_file_ttl_sec를 수정했습니다. 이전에는 이 값을 tracked_file_ttl_sec 키로 Keeper에 기록했지만, tracked_files_ttl_sec로 읽고 있었으며, 이는 오타였습니다. #69742 (Kseniia Sumarokova).
  • gethyperrectangleforrowgroup에서 tryconvertfieldtotype를 사용하도록 변경했습니다. #69745 (Miсhael Stetsyuk).
  • “컬럼도 없고 adaptive index granularity도 없는 prewhere 수정(사실상 아무것도 없음)“‘을 되돌렸습니다. 이 변경을 되돌리면서 이전 CH 릴리스(아마 2021년 또는 그 이전)에서 생성된 데이터 파트를 읽을 때 일부 오류가 발생할 수 있습니다. #68897 (Alexander Gololobov).

ClickHouse 릴리스 24.8 LTS, 2024-08-20. 발표 자료, 동영상

하위 호환되지 않는 변경 사항

  • 이제 clickhouse-clientclickhouse-local은 기본적으로 단일 쿼리 모드가 아니라 다중 쿼리 모드로 동작합니다. 예를 들어 이제 clickhouse-client -q "SELECT 1; SELECT 2"가 동작하며, 이전에는 --multiquery(또는 -n)를 추가해야 했습니다. --multiquery/-n 스위치는 더 이상 사용되지 않습니다. 다중 쿼리 SQL 문에서 INSERT 쿼리는 FORMAT 절에 따라 특별히 처리됩니다. FORMAT이 VALUES인 경우(가장 일반적인 경우) INSERT 문의 끝은 쿼리 끝의 세미콜론 ;으로 표시됩니다. 다른 모든 FORMAT(예: CSV, JSONEachRow)에서는 INSERT 문의 끝이 쿼리 끝의 두 개의 개행 문자 \n\n로 표시됩니다. #63898 (FFish).
  • 이전 버전에서는 LowCardinality 데이터 타입 이름 뒤에 WithDictionary를 붙이는 대체 구문을 사용할 수 있었습니다. 이는 초기 구현 단계에서 동작하던 방식이었으며, 문서화되거나 공개된 적은 없습니다. 이제 이 구문은 더 이상 권장되지 않습니다. 이 구문을 사용했다면 테이블에 ALTER를 수행하여 데이터 타입 이름을 LowCardinality로 변경해야 합니다. #66842 (Alexey Milovidov).
  • 분산 대상 테이블과 함께 사용할 때 스토리지 Buffer의 논리 오류를 수정했습니다. 이는 하위 호환되지 않는 변경 사항입니다. 쿼리에서 해당 테이블이 두 번 이상 나타나는 경우(예: self-join) 분산 대상 테이블과 함께 Buffer를 사용하는 쿼리가 더 이상 동작하지 않을 수 있습니다. #67015 (vdimir).
  • 이전 버전에서는 감마 함수 기반 난수 분포 함수(예: Chi-Squared, Student, Fisher)를 0에 가까운 음수 인수로 호출하면 계산이 오래 걸리거나 무한 루프에 빠질 수 있었습니다. 새 버전에서는 이러한 함수를 0 또는 음수 인수로 호출하면 예외가 발생합니다. 이 변경으로 #67297가 해결되었습니다. #67326 (Alexey Milovidov).
  • system table `text_log“가 기본적으로 활성화됩니다. 이는 이전 버전과 완전히 호환되지만, 로컬 디스크 사용량이 약간 증가할 수 있습니다(이 system table은 매우 적은 디스크 공간만 사용합니다). #67428 (Alexey Milovidov).
  • 이전 버전에서는 arrayWithConstant가 매우 큰 배열을 생성할 때 느릴 수 있었습니다. 새 버전에서는 배열당 1 GB로 제한됩니다. 이 변경으로 #32754가 해결되었습니다. #67741 (Alexey Milovidov).
  • REPLACE 수정자의 포맷팅을 수정했습니다(괄호 생략 금지). #67774 (Azat Khuzhin).
  • #68349에 백포트됨: Dynamic 타입을 재구현했습니다. 이제 동적 데이터 타입 한도에 도달하면 새 타입은 String으로 캐스팅되지 않고, 바이너리 형식의 데이터와 바이너리 인코딩된 데이터 타입을 담는 특수 데이터 구조에 저장됩니다. 이제 Dynamic 컬럼에 한 번이라도 삽입된 모든 타입을 서브컬럼으로 읽을 수 있습니다. #68132 (Kruglov Pavel).

새로운 기능

  • 머지 중 프로젝션(특정 엔진용)과 OPTIMIZE DEDUPLICATE 쿼리에서의 동작을 제어하기 위해 새로운 MergeTree 설정 deduplicate_merge_projection_mode가 추가되었습니다. 지원되는 옵션은 다음과 같습니다. throw(프로젝션이 *MergeTree 엔진에서 완전히 지원되지 않는 경우 예외를 발생시킴), drop(프로젝션 자체를 일관되게 머지할 수 없는 경우 머지 중에 프로젝션을 제거함), rebuild(프로젝션을 처음부터 다시 빌드하며, 비용이 큰 작업임). #66672 (jsc0218).
  • S3 테이블 엔진에 _etag 가상 컬럼을 추가했습니다. #65312를 수정합니다. #65386 (skyoct).
  • 쿼리 캐시에 태깅(네임스페이스) 메커니즘이 추가되었습니다. 태그가 다르면 같은 쿼리라도 쿼리 캐시에서는 서로 다른 것으로 간주됩니다. 예시: SELECT 1 SETTINGS use_query_cache = 1, query_cache_tag = 'abc'SELECT 1 SETTINGS use_query_cache = 1, query_cache_tag = 'def'는 이제 서로 다른 쿼리 캐시 엔트리를 생성합니다. #68235 (sakulali).
  • 왼쪽 및 오른쪽 테이블의 컬럼이 모두 포함된 부등 조건에서 더 다양한 JOIN 엄격성(LEFT/RIGHT SEMI/ANTI/ANY JOIN)을 지원합니다. 예: t1.y < t2.y (allow_experimental_join_condition 설정 참조). #64281 (lgbo).
  • 다양한 엔진(File, URL, S3, AzureBlobStorage, HDFS)에서 Hive 스타일 파티셔닝을 해석합니다. Hive 스타일 파티셔닝은 데이터를 파티션된 하위 디렉터리로 구성하므로, 대규모 데이터셋을 더 효율적으로 쿼리하고 관리할 수 있습니다. 현재는 적절한 이름과 데이터를 가진 가상 컬럼만 생성합니다. 후속 PR에서는 적절한 데이터 필터링(성능 향상)을 도입할 예정입니다. #65997 (Yarik Briukhovetskyi).
  • Spark와의 호환성을 위해 printf 함수를 추가했습니다(기존 format 함수도 사용할 수 있습니다). #66257 (李扬).
  • 테스트에 유용하게 사용할 수 있도록 외부 엔진과 table_engines를 Null 엔진으로 대체하는 옵션 restore_replace_external_engines_to_nullrestore_replace_external_table_functions_to_null이 추가되었습니다. 이 옵션은 RESTORE와 명시적인 테이블 생성 모두에서 작동해야 합니다. #66536 (Ilya Yatsishin).
  • readWKTLineString 함수를 사용해 WKT 포맷의 MULTILINESTRING 지오메트리를 읽을 수 있도록 지원이 추가되었습니다. #67647 (Jacob Reckhard).
  • 새로운 테이블 함수 fuzzQuery가 추가되었습니다. 이 함수는 주어진 쿼리 문자열에 무작위 변형을 적용할 수 있습니다. 예시: SELECT query FROM fuzzQuery('SELECT 1') LIMIT 5;. #67655 (pufit).
  • 모든 분리된 파티션을 삭제하는 쿼리 ALTER TABLE ... DROP DETACHED PARTITION ALL를 추가했습니다. #67885 (Duc Canh Le).
  • 새로운 설정인 rows_before_aggregation이 활성화되면 쿼리 응답에 rows_before_aggregation_at_least 통계를 추가합니다. 이 통계는 집계 전에 읽은 행 수를 나타냅니다. 분산 쿼리에서는 limit 없이 group by 또는 max 집계 함수를 사용할 경우 rows_before_aggregation_at_least가 쿼리가 읽은 행 수를 반영할 수 있습니다. #66084 (morning-color).
  • Join 테이블의 메모리 사용량을 줄일 수 있도록 OPTIMIZE 쿼리 지원을 추가했습니다. #67883 (Duc Canh Le).
  • URL에 &run=1을 추가하면 실행에서 쿼리를 즉시 실행할 수 있도록 했습니다 #66457 (Aleksandr Musorin).

실험적 기능

  • 새로운 JSON 데이터 타입을 구현했습니다. #66444 (Kruglov Pavel).
  • 새로운 TimeSeries 테이블 엔진을 추가했습니다. #64183 (Vitaly Baranov).
  • 오프셋을 Kafka에 커밋하는 대신 Keeper에 저장하는 새로운 실험적 Kafka 스토리지 엔진을 추가했습니다. 이를 통해 큐에서 데이터를 소비하는 작업과 ClickHouse 테이블에 커밋하는 작업을 원자적으로 처리할 수 있습니다. #57625 (János Benjamin Antal).
  • 병렬 레플리카에 적응형 읽기 작업 크기 계산 메서드(즉, 읽는 컬럼 크기에 따라 달라지는 방식)를 사용합니다. #60377 (Nikita Taranov).
  • col = 'val'과 같은 동등 프레디케이트에 대한 선택도 추정치를 제공하는 통계 유형 count_min(count-min sketches)을 추가했습니다. 지원되는 데이터 타입은 string, date, datetime 및 numeric 타입입니다. #65521 (JackyWoo).

성능 개선

  • optimize_functions_to_subcolumns 설정이 기본적으로 활성화됩니다. #68053 (Anton Popov).
  • plain_rewritable 디스크의 메타데이터를 객체 스토리지의 MergeTree 데이터와 분리해 __meta 레이아웃에 저장합니다. 또한 plain_rewritable 디스크를 평면 디렉터리 구조로 변경합니다. #65751 (Julia Kartseva).
  • 모든 서브컬럼에 필요한 메모리를 미리 예약해 String/Array/Map/Variant/Dynamic 타입의 컬럼 스쿼싱(INSERT 쿼리에서 발생하는 작업)을 개선했습니다. #67043 (Kruglov Pavel).
  • SYSTEM FLUSH LOGS를 더 빠르게 수행하고, 종료 시 로그를 플러시합니다. #67472 (Sema Checherinda).
  • 머지의 스케줄링 단계에서 발생하는 오버헤드를 줄여 전반적인 머지 성능을 개선했습니다. #68016 (Anton Popov).
  • DROP DATABASE 쿼리에서 테이블 삭제 속도를 높이고, database_catalog_drop_table_concurrency의 기본값을 16으로 늘렸습니다. #67228 (Nikita Mikhaylov).
  • ORC를 기록할 때 배열 컬럼에 과도한 용량을 할당하지 않도록 했습니다. Array 컬럼의 성능이 15% 향상됩니다. #67879 (李扬).
  • non-replicated MergeTree의 뮤테이션 속도를 크게 높였습니다. #66911 #66909 (Alexey Milovidov).

개선

  • Setting allow_experimental_analyzer의 이름이 enable_analyzer로 변경되었습니다. 이전 이름도 별칭(alias)으로 유지됩니다. 이는 분석기가 더 이상 베타가 아니며, 정식 프로덕션 환경에서 완전히 지원됨을 의미합니다. #66438 (Nikita Mikhaylov).
  • 날짜/시간 값에 대한 스키마 추론을 개선했습니다. 이제 날짜/시간 값에 소수점 이하가 있을 때만 DateTime64를 사용하고, 그렇지 않으면 일반 DateTime을 사용합니다. 이제 Date/DateTime 추론이 더 엄격해졌으며, 특히 date_time_input_format='best_effort'일 때는 예외적인 경우의 문자열을 날짜/시간으로 추론하지 않도록 했습니다. #68382 (Kruglov Pavel).
  • ClickHouse 서버가 이제 새로운 설정 max_keep_alive_requests를 지원합니다. 서버와의 keep-alive HTTP 연결에서는 이 설정이 keep_alive_timeout과 함께 동작합니다. 유휴 시간 제한이 아직 만료되지 않았더라도, 해당 연결을 통해 처리된 요청 수가 이미 max_keep_alive_requests를 초과한 경우 서버가 해당 연결을 종료합니다. #61793 (Nikita Taranov).
  • Advanced dashboard가 여러 면에서 개선되었습니다. 이로써 #67697가 해결되었습니다. 이로써 #63407가 해결되었습니다. 이로써 #51129가 해결되었습니다. 이로써 #61204가 해결되었습니다. #67701 (Alexey Milovidov).
  • 분산 테이블을 생성할 때는 REMOTE에 대한 권한이 필요하지 않으며, Distributed 엔진에 대한 권한만으로 충분합니다. #65419 (jsc0218).
  • 재정의할 수 있도록 Docker image에서 Keeper 로그를 명시적으로 지정하지 않도록 했습니다. #65564 (Azat Khuzhin).
  • 암호로 보호된 아카이브에 대해 증분 백업을 생성하고 복원할 수 있도록 BACKUPRESTORE 쿼리에 use_same_password_for_base_backup 설정이 추가되었습니다. #66214 (Samuele).
  • ATTACH 쿼리에서는 async_load_databases를 무시합니다(이전에는 테이블이 attached 상태가 되기 전에 ATTACH가 반환될 수 있었습니다). #66240 (Azat Khuzhin).
  • 리소스 부족으로 거부된 연결에 대한 로그와 메트릭이 추가되었습니다. #66410 (Alexander Tokmakov).
  • MongoDB 엔진에서 UUID 유형을 올바르게 지원합니다. #66671 (Azat Khuzhin).
  • 복제 지연과 복구 시간 메트릭을 추가했습니다. #66703 (Miсhael Stetsyuk).
  • DiskS3NoSuchKeyErrors 메트릭이 추가되었습니다. #66704 (Miсhael Stetsyuk).
  • 모든 테이블 엔진에서 COMMENT 절이 작동하도록 했습니다. #66832 (Joe Lynch).
  • 이제 mapFromArrays 함수는 첫 번째 인수로 Map(K, V)를 받을 수 있습니다. 예시: 이제 SELECT mapFromArrays(map('a', 4, 'b', 4), ['aa', 'bb'])가 정상적으로 동작하며 {('a',4):'aa',('b',4):'bb'}를 반환합니다. 또한 첫 번째 인수가 배열인 경우, 실제 배열 값이 NULL이 아니기만 하면 Array(Nullable(T)) 또는 Array(LowCardinality(Nullable(T))) 유형도 사용할 수 있습니다. #67103 (李扬).
  • clickhouse-local~/.clickhouse-local에서 설정을 읽습니다. #67135 (Azat Khuzhin).
  • 설정 input_format_orc_read_use_writer_time_zone의 이름을 input_format_orc_reader_timezone로 변경하고, 사용자가 reader 시간대를 설정할 수 있게 했습니다. #67175 (kevinyhzou).
  • 연결 직후 상대편에서 HTTP connection을 즉시 재설정하는 경우 발생하는 Socket is not connected 오류의 수준을 낮추고, #34218을 해결했습니다. #67177 (vdimir).
  • config에서 system.dashboards용 대시보드를 로드할 수 있는 기능을 추가했습니다(설정하면 기본 대시보드 프리셋을 재정의합니다). #67232 (Azat Khuzhin).
  • SQL의 윈도우 함수는 전통적으로 snake case를 사용합니다. ClickHouse는 camelCase를 사용하므로 새 별칭 denseRank()percentRank()가 추가되었습니다. 이 새 함수들은 기존 dense_rank()percent_rank() 함수와 완전히 동일하게 호출할 수 있습니다. snake case와 camelCase 구문은 모두 계속 사용할 수 있습니다. 각 함수에 대한 새 테스트도 추가되었습니다. 이로써 #67042가 해결되었습니다. #67334 (Peter Nguyen).
  • .xml, .yml 또는 .yaml이 아닌 경우 설정 파일 포맷을 자동으로 감지합니다. 파일이 <로 시작하면 XML일 가능성이 있고, 그렇지 않으면 YAML일 가능성이 있습니다. 파이프를 통해 설정 파일을 제공할 때 유용합니다: clickhouse-server --config-file <(echo "hello: world"). #67391 (sakulali).
  • formatDateTimeformatDateTimeInJodaSyntax 함수는 이제 포맷 매개변수를 선택적으로 처리합니다. 이 매개변수를 지정하지 않으면 포맷 문자열 %Y-%m-%d %H:%i:%syyyy-MM-dd HH:mm:ss가 사용되는 것으로 간주합니다. 예시: 이제 SELECT parseDateTime('2021-01-04 23:12:34')는 DateTime 값 2021-01-04 23:12:34를 반환합니다(이전에는 예외가 발생했습니다). #67399 (Robert Schulze).
  • timeout 또는 연결 손실로 발생한 KeeperMap의 Keeper 요청을 자동으로 재시도합니다. #67448 (Antonio Andelic).
  • Aarch64 Linux 빌드에 -no-pie를 추가하여 ClickHouse 재시작 후 올바른 내부 검사와 스택트레이스 심볼화가 가능하도록 합니다. #67916 (filimonov).
  • 내부 검사를 강화하기 위해 머지 및 뮤테이션용 profile events를 추가했습니다. #68015 (Anton Popov).
  • 복제되지 않은 MergeTree의 불필요한 로그를 제거했습니다. #68238 (Daniil Ivanik).

빌드/테스트/패키징 개선

  • 테스트에서 더 많은 문제를 찾아내고 신뢰성을 높일 수 있도록, 통합 테스트의 flaky check가 이제 각 테스트 케이스를 여러 번 실행합니다. 동일한 환경에서 테스트 케이스를 반복 실행하기 위해 pytest-repeat 라이브러리를 사용합니다. 테스트를 통과하려면 테스트 케이스가 끝날 때 테이블(table)과 기타 엔터티를 정리하는 것이 중요합니다. 필요한 컨테이너를 한 번만 시작하므로, 여러 차례 pytest를 실행하는 것보다 반복 실행이 훨씬 빠릅니다. #66986 (Ilya Yatsishin).
  • ClickHouse에서 CLion을 사용할 수 있도록 했습니다. 이전 버전에서는 키를 누를 때마다 CLion이 1분 동안 멈췄습니다. 이로써 #66994가 해결됩니다. #66995 (Alexey Milovidov).
  • getauxval: 최신 Linux 커널에서 ASLR 엔트로피가 높아 sanitizer 재실행 중 충돌이 발생하는 문제를 방지합니다. #67081 (Raúl Marín).
  • 클라이언트 코드의 일부를 단일 파일로 분리하고, 디버그 빌드에서도 해당 코드에 가능한 최고 수준의 최적화를 적용했습니다. 이로써 #65745가 해결됩니다. #67215 (Nikita Mikhaylov).

버그 수정

  • 실험적 Variant 데이터 타입에만 적용됩니다. Variant + AggregateFunction 타입에서 발생하던 크래시를 수정했습니다. #67122 (Kruglov Pavel).
  • connection이 비어 있는 경우 DistributedAsyncInsert가 충돌하던 문제를 수정했습니다. #67219 (Pablo Marcos).
  • tuple() 인수 사용 시 uniquniqTheta 에서 발생하던 크래시를 수정했습니다. #67303를 해결합니다. #67306 (flynn).
  • #66026를 수정했습니다. ReplaceTableNodeToDummyVisitor에서 아직 해결되지 않은 테이블 함수 인수를 순회하지 않도록 했습니다. #67522 (Dmitry Novik).
  • JSONMergePatch 함수에서 발생할 수 있는 스택 오버플로우를 수정했습니다. 기존 이름이 잘못되어 이 함수의 이름을 jsonMergePatch에서 JSONMergePatch로 변경했습니다. 이전 이름도 호환성을 위해 계속 유지합니다. 함수의 오류 진단 기능을 개선했습니다. 이 변경으로 #67304가 해결되었습니다. #67756 (Alexey Milovidov).
  • 특수하게 조작된 쿼리로 인해 발생하며 hopEnd, hopStart, tumbleEnd, tumbleStart를 통해 서버를 충돌시키던 NULL 포인터 역참조 문제를 수정했습니다. #68098 (Salvatore Mesoraca).
  • 일부 시스템 테이블에서 서브쿼리로 필터링할 때 발생하던 Not-ready Set 문제를 수정했습니다. #66018 (Michael Kolupaev).
  • ALTER ADD COLUMN 쿼리 이후 서브컬럼을 읽는 동작이 수정되었습니다. #66243 (Anton Popov).
  • 외부 데이터베이스로 전송되는 쿼리의 불리언 리터럴을 수정했습니다(PostgreSQL과 같은 엔진). #66282 (vdimir).
  • 별칭이 지정된 JOIN ON 표현식이 있는 쿼리의 포맷팅을 수정했습니다. 예를 들어 ... JOIN t2 ON (x = y) AS e ORDER BY x... JOIN t2 ON ((x = y) AS e) ORDER BY x로 포맷되어야 합니다. #66312 (vdimir).
  • 서버 간 시크릿용 cluster() 수정(기존과 같이 초기 사용자를 유지). #66364 (Azat Khuzhin).
  • null 값이 포함된 배열 필드를 Array(Variant)로 변환할 때 발생할 수 있는 런타임 오류를 수정했습니다. #66727 (Kruglov Pavel).
  • Context::getDDLWorker에서 간헐적으로 발생하던 교착 상태를 수정했습니다. #66843 (Alexander Gololobov).
  • 불완전하게 삭제된 후 KeeperMap 테이블이 생성되지 않던 문제를 수정했습니다. #66865 (Antonio Andelic).
  • s3_plain_rewritable 디스크로 복원하는 중 발생하던 손상된 part 오류를 수정했습니다. #66881 (Vitaly Baranov).
  • 드물게 디스크에 예기치 않은 프로젝션이 있으면 ClickHouse가 파트를 손상된 것으로 판단할 수 있었는데, 이제 수정되었습니다. #66898 (alesapin).
  • 스키마 추론에서 잘못된 포맷 감지를 수정해 “Format doesn’t support schema inference”라는 논리적 오류가 발생할 수 있던 문제를 해결했습니다. #66899 (Kruglov Pavel).
  • 병렬 레플리카에서 쿼리 취소 시 발생할 수 있는 교착 상태를 수정했습니다. #66905 (Nikita Taranov).
  • database_replicated_allow_heavy_create가 설정되어 있더라도 create as select를 금지합니다. 23.12에서는 무조건 금지되었고, 아직 릴리스되지 않은 24.7에서는 이 설정으로 인해 실수로 허용되었습니다. #66980 (vdimir).
  • numbers에서 읽을 때 max_rows_to_read 제한이 설정되어 있으면 예외가 잘못 발생할 수 있었습니다. 이로써 #66992가 해결되었습니다. #66996 (Alexey Milovidov).
  • lagInFrame 및 leadInFrame 윈도우 함수에 적절한 형 변환을 추가 - msan 테스트 문제를 수정합니다. #67091 (Yakov Olkhovskiy).
  • TRUNCATE DATABASE가 DROP DATABASE 쿼리처럼 복제를 중지하던 문제가 수정되었습니다. #67129 (Alexander Tokmakov).
  • clickhouse-local에서 별도의 클라이언트 Context를 사용하도록 했습니다. #67133 (Vitaly Baranov).
  • 세그먼트가 1개인 Distriburted 테이블 위에서 동작하는 Merge 테이블을 읽는 쿼리에서 발생하던 Cannot convert column because it is non constant in source stream but must be constant in result. 오류를 수정했습니다. #67146 (Nikolai Kochetov).
  • enable_order_by_all이 비활성화된 상태와 병렬 레플리카 환경(분산 쿼리 포함)에서 ORDER BY all이 올바르게 동작하도록 수정했습니다. #67153 (Igor Nikonov).
  • schema cache에서 schema 추론용 input_format_max_bytes_to_read_for_schema_inference의 잘못된 사용을 수정했습니다. #67157 (Kruglov Pavel).
  • 단일 널 허용 키에 대해 GROUP BY를 수행하는 중 예외가 발생할 때 count distinct에서 발생하던 메모리 누수를 수정했습니다. #67171 (Jet He).
  • OUTER JOIN을 INNER JOIN으로 변환하는 최적화 과정에서 발생한 오류를 수정했습니다. 이로써 #67156가 해결되었습니다. 이로써 #66447가 해결되었습니다. 이 버그는 https://github.com/ClickHouse/ClickHouse/pull/62907에서 도입되었습니다. #67178 (Maksim Kita).
  • 오류 Conversion from AggregateFunction(name, Type) to AggregateFunction(name, Nullable(Type)) is not supported를 수정했습니다. 이 버그는 optimize_rewrite_aggregate_function_with_if 최적화 때문에 발생했습니다. #67112를 수정했습니다. #67229 (Nikolai Kochetov).
  • IN 함수의 좌변으로 빈 Tuple을 사용할 때 쿼리가 멈추는 문제를 수정했습니다. #67295 (Duc Canh Le).
  • 알 수 없는 필드를 스키핑하는 과정에서 스택 오버플로우를 유발하는 매우 깊은 중첩 JSON 데이터를 생성할 수 있었습니다. 이로써 #67292가 해결되었습니다. #67324 (Alexey Milovidov).
  • 시작 중 예외가 발생한 뒤 ReplicatedMergeTree 테이블 ATTACH 문제를 수정했습니다. #67360 (Antonio Andelic).
  • Aggregator에서 스레드 그룹으로부터 잘못 분리되면서 발생하던 segfault를 수정했습니다. #67385 (Antonio Andelic).
  • PK에 비결정적 함수가 지정된 또 다른 경우를 수정했습니다. #67395 (Nikolai Kochetov).
  • bloom_filter 인덱스로 인해 (k=2)=(k=2) 또는 has([1,2,3], k)처럼 다소 특이한 조건식에서 쿼리가 실패하던 문제를 수정했습니다. #67423 (Michael Kolupaev).
  • 아카이브가 아닌 경우 ::가 포함된 파일 이름/URI를 올바르게 파싱합니다. #67433 (Antonio Andelic).
  • WriteBuffer가 취소된 경우 ~WriteBufferFromS3의 작업 대기 문제를 수정했습니다. #67459 (Kseniia Sumarokova).
  • RESTORE 중 임시 part 디렉터리가 삭제되는 것을 방지합니다. #67491 (Vitaly Baranov).
  • 중첩된 단락 평가(short-circuit) 함수의 실행 문제를 수정했습니다. #67520 (Kruglov Pavel).
  • Logical error: Expected the argument №N of type T to have X rows, but it has 0 오류를 수정했습니다. 이 오류는 GROUP BY에 상수 표현식이 포함된 원격 쿼리에서(새 분석기 사용 시) 발생할 수 있었습니다. #67536 (Nikolai Kochetov).
  • NULL이 포함된 튜플에 대한 조인 수정: 새 분석기에서 JOIN ON 절의 튜플 내부에 NULL이 있는 일부 쿼리가 잘못된 결과를 반환하던 문제를 수정했습니다. #67538 (vdimir).
  • 가득 차 있어 제거할 수 없는 cache에서 FileCache::freeSpaceRatioKeepingThreadFunc()가 중복으로 다시 예약되는 문제를 수정했습니다. #67540 (Kseniia Sumarokova).
  • HTTP 인터페이스를 통해 스트림형 엔진(Kafka, RabbitMQ, NATS)에 데이터를 삽입할 때 발생하던 문제를 수정했습니다. #67554 (János Benjamin Antal).
  • 작은 DateTime64 값에서 잘못된 결과를 반환하던 toStartOfWeek 함수 수정. #67558 (Yarik Briukhovetskyi).
  • 재귀 CTE를 사용하는 뷰 생성 문제를 수정했습니다. #67587 (Yakov Olkhovskiy).
  • 파일 시스템 캐시에서 Logical error: 'file_offset_of_buffer_end <= read_until_position' 오류를 수정했습니다. #57508을 해결합니다. #67623 (Kseniia Sumarokova).
  • #62282를 수정했습니다. convertFieldToString() 호출을 제거하고 데이터 타입별 직렬화 코드를 추가했습니다. 매개변수 값이 데이터 타입 인스턴스를 반환하는 함수나 표현식일 때, 여러 데이터 타입에서 매개변수화된 뷰 치환이 올바르게 동작하지 않았습니다. #67654 (Shankar).
  • percent_rank에서 발생하던 충돌을 수정했습니다. percent_rank의 기본 frame 유형이 range unbounded preceding and unbounded following으로 변경되었습니다. IWindowFunction의 기본 윈도우 frame이 반영되어, 이제 SQL에서 윈도우 frame 정의가 없는 윈도우 함수를 서로 다른 WindowTransfomer에 올바르게 배치할 수 있습니다. #67661 (lgbo).
  • UNION 사용 시 SQL UDF를 다시 로드하는 과정에서 발생하던 문제를 수정했습니다. 이전에는 server를 다시 시작하면 UDF가 유효하지 않게 될 수 있었습니다. #67665 (Antonio Andelic).
  • 실험적 Variant 유형과 활성화된 use_variant_as_common_type 설정을 사용하는 if 함수에서 튜플과 맵에 대해 발생할 수 있는 논리 오류 “if의 예기치 않은 반환 유형”을 수정했습니다. #67687 (Kruglov Pavel).
  • Linux Kernel의 버그로 인해 쿼리가 TimerDescriptor::drain에서 중단될 수 있습니다. 이로써 #37686가 해결됩니다. #67702 (Alexey Milovidov).
  • RESTORE ON CLUSTER 명령의 자동 완성을 수정했습니다. #67720 (Vitaly Baranov).
  • 로딩 중 CANNOT_SCHEDULE_TASK가 발생할 때 딕셔너리가 멈추는 문제를 수정했습니다. #67751 (Azat Khuzhin).
  • SELECT count() FROM t WHERE cast(c = 1 or c = 9999 AS Bool) SETTINGS use_skip_indexes=1와 같은 쿼리가 이제 c에 블룸 필터 인덱스가 있을 때도 올바르게 작동합니다. #67781 (jsc0218).
  • 일부 쿼리에서 GROUP BY 키 없는 집계와 필터를 함께 사용할 때 잘못된 집계 결과가 나오던 문제를 수정하고, #67419를 해결했습니다. #67804 (vdimir).
  • ALTER ADD/MODIFY COLUMN에서 실험적이거나 의심스러운 데이터 타입을 검증합니다. #67911 (Kruglov Pavel).
  • 분산 쿼리에서 상수 폴딩 이후 DateTime64 파싱 문제를 수정하고, #66773을 해결했습니다. #67920 (vdimir).
  • 프레디케이트에 비결정적 함수가 포함된 경우 잘못된 count() 결과가 반환되던 문제를 수정했습니다. #67922 (János Benjamin Antal).
  • 사용 가능한 CPU 수가 제한된 컨테이너 환경에서 최대 스레드 소프트 리밋 계산을 수정했습니다. #67963 (Robert Schulze).
  • 이제 디스크에는 프로젝션이 없지만 checksums.txt에는 있는 경우에도, ClickHouse는 해당 part를 손상된 것으로 간주하지 않습니다. #68003 (alesapin).
  • 새 분석기에서 뮤테이션 수행 시 변경되지 않은 파트가 스키핑되지 않던 문제가 수정되었습니다. 이전에는 분석기가 활성화된 경우, 프레디케이트에 따라 뮤테이션이 해당 파트에 영향을 주지 않더라도 파트의 데이터가 뮤테이션에 의해 다시 기록될 수 있었습니다. #68052 (Anton Popov).
  • OFFSET를 사용하는 서브쿼리에서 정렬 제거를 수행하는 잘못된 최적화를 제거했습니다. #67906을 수정했습니다. #68099 (Graham Campbell).
  • 집계 프로젝션 최적화를 위해 Block structure mismatch in AggregatingStep stream: different types 오류 수정 시도. #68107 (Nikolai Kochetov).
  • 쿼리가 취소될 때 발생하는 postgres 충돌을 수정하려고 시도합니다. #68288 (Kseniia Sumarokova).
  • 쿼리 SYSTEM SYNC REPLICA에서 누락된 sync replica 모드 문제를 수정했습니다. #68326 (Duc Canh Le).

ClickHouse 릴리스 24.7, 2024-07-30. 발표 자료, 동영상

하위 호환되지 않는 변경 사항

  • 복제된 데이터베이스에서는 CRATE MATERIALIZED VIEW ... ENGINE Replicated*MergeTree POPULATE AS SELECT ...를 사용할 수 없도록 변경되었습니다. #63963 (vdimir).
  • clickhouse-keeper-client는 이제 ls '/hello/world'와 같은 문자열 리터럴 형태의 경로만 허용하며, ls /hello/world와 같은 따옴표 없는 문자열은 허용하지 않습니다. #65494 (Alexey Milovidov).
  • 메트릭 KeeperOutstandingRequets의 이름이 KeeperOutstandingRequests로 변경되었습니다. #66206 (Robert Schulze).
  • system.functions 테이블에서 is_deterministic 필드가 제거되었습니다. #66630 (Alexey Milovidov).
  • 이제 함수 tuple은 쿼리에서 이름이 지정된 Tuple을 구성하려고 시도합니다(enable_named_columns_in_function_tuple로 제어됨). 또한 튜플에서 이름을 추출하는 함수 tupleNames가 도입되었습니다. #54881 (Amos Bird).
  • 구체화된 뷰(Materialized View)의 중복 제거 동작 방식이 변경되었습니다. 다음과 같은 여러 경우가 수정되었습니다. - 대상 테이블: 데이터가 2개 이상의 블록으로 분할되고, 해당 블록이 병렬로 삽입될 때 중복으로 간주되던 경우. - MV 대상 테이블: 동일한 블록이 중복 제거되던 경우. 이는 MV가 집계를 수행하면서 서로 다른 입력 데이터에 대해서도 동일한 결과 데이터를 자주 생성할 수 있기 때문입니다. - MV 대상 테이블: 서로 다른 MV에서 온 동일한 블록이 중복 제거되던 경우. #61601 (Sema Checherinda).
  • 함수 bitShiftLeftbitShitfRight는 범위를 벗어난 shift 위치에 대해 오류를 반환합니다. #65838 (Pablo Marcos).

새로운 기능

  • full_sorting_join 알고리즘에 ASOF JOIN 지원을 추가했습니다. #55051 (vdimir).
  • clickhouse-client에서 JWT 인증(authentication)을 지원합니다(ClickHouse Cloud에서만 사용 가능). #62829 (Konstantin Bogdanov).
  • SQL 함수 changeYear, changeMonth, changeDay, changeHour, changeMinute, changeSecond를 추가했습니다. 예를 들어 SELECT changeMonth(toDate('2024-06-14'), 7)는 날짜 2024-07-14를 반환합니다. #63186 (cucumber95).
  • 시작 단계에서 미리 구성된 쿼리를 실행할 수 있는 시작 스크립트를 도입했습니다. #64889 (pufit).
  • 자체 서명 인증서를 사용하는 server에 클라이언트가 보안 TCP로 연결할 수 있도록, 클라이언트 설정의 accept_invalid_certificate를 지원합니다. 이는 해당 openSSL 클라이언트 설정 verificationMode=none + invalidCertificateHandler.name=AcceptCertificateHandler를 축약해서 사용할 수 있는 기능입니다. #65238 (peacewalker122).
  • system.errors 테이블의 오류 값 이력을 포함하고 주기적으로 디스크에 플러시되는 system.error_log를 추가했습니다. #65381 (Pablo Marcos).
  • 집계 함수 groupConcat를 추가했습니다. 이는 arrayStringConcat( groupArray(column), ',')와 거의 같습니다. 문자열 구분자와 처리할 요소 수, 총 2개의 매개변수를 받을 수 있습니다. #65451 (Yarik Briukhovetskyi).
  • AzureQueue 스토리지를 추가했습니다. #65458 (Kseniia Sumarokova).
  • Parquet 파일에 페이지 인덱스를 기록하는 기능을 비활성화하거나 활성화하는 새로운 설정을 추가했습니다. #65475 (lgbo).
  • 콘솔 로그 레벨을 제어하는 logger.console_log_level server 구성을 도입했습니다(활성화된 경우). #65559 (Azat Khuzhin).
  • 테이블 함수 file에서 디렉터리 경로 끝에 와일드카드 *를 자동으로 추가합니다. #66019 (Zhidong (David) Guo).
  • 비대화형 모드의 클라이언트에 --memory-usage 옵션을 추가했습니다. #66393 (vdimir).
  • clickhouse-disks용 대화형 클라이언트를 만들고, 로컬 디렉터리에서 로컬 디스크를 추가할 수 있게 했습니다. #64446 (Daniil Ivanik).
  • projection이 있는 테이블에서 경량한 삭제가 발생하면, 예외를 발생시키거나(기본값) projection을 삭제하도록 선택할 수 있습니다. #65594 (jsc0218).
  • 모든 분리된 테이블의 주요 정보를 담은 system tables를 추가했습니다. #65400 (Konstantin Morozov).

실험적 기능

  • Variant 데이터 타입의 바이너리 직렬화를 변경했습니다. 단일 variant만 있거나 NULL 값만 있는 그래뉼에서 동일한 discriminator를 여러 번 기록하지 않도록 compact 모드를 추가했습니다. 기본적으로 활성화되는 MergeTree 설정 use_compact_variant_discriminators_serialization도 추가했습니다. Variant 타입은 여전히 실험적이므로, 직렬화의 하위 호환되지 않는 변경도 허용된다는 점에 유의하십시오. #62774 (Kruglov Pavel).
  • ClickHouse Keeper에 대한 디스크 기반 백엔드 스토리지 지원을 추가했습니다. #56626 (Han Fei).
  • JSONExtract 함수를 리팩터링하고, 실험적인 Dynamic 타입을 포함한 더 많은 타입을 지원합니다. #66046 (Kruglov Pavel).
  • VariantDynamic 서브컬럼에 대해 null 맵 서브컬럼을 지원합니다. #66178 (Kruglov Pavel).
  • 변경된 Memory 테이블에서 Dynamic 서브컬럼을 읽는 문제를 수정했습니다. 이전에는 Memory 테이블에서 ALTER를 통해 Dynamic 타입의 max_types 매개변수를 변경하면 이후 서브컬럼 읽기에서 잘못된 결과가 반환될 수 있었습니다. #66066 (Kruglov Pavel).
  • 사용자 지정 키 병렬 레플리카를 사용할 때 cluster_for_parallel_replicas 지원을 추가했습니다. 이를 통해 MergeTree 테이블에서 사용자 지정 키와 함께 병렬 레플리카를 사용할 수 있습니다. #65453 (Antonio Andelic).

성능 개선

  • int를 string으로 변환하는 알고리즘을 더 빠른 알고리즘으로 대체했습니다(수정된 amdn/itoa에서 수정된 jeaiii/itoa로). #61661 (Raúl Marín).
  • join(parallel_hash 알고리즘)에서 생성되는 해시 테이블의 크기를 이제 수집해 캐시합니다. 이 정보는 이후 쿼리 실행 시 해시 테이블 공간을 미리 할당하는 데 사용되어, 해시 테이블 크기 재조정 시간을 줄여줍니다. #64553 (Nikita Taranov).
  • 버퍼링을 사용해, 선택도가 높은 조건이 있는 WHERE와 프라이머리 키 기준 ORDER BY를 사용하는 쿼리를 최적화했습니다. 이 동작은 read_in_order_use_buffering 설정으로 제어되며(기본적으로 활성화), 쿼리의 메모리 사용량이 증가할 수 있습니다. #64607 (Anton Popov).
  • plain_rewritable 메타데이터 로딩 성능을 개선했습니다. #65634 (Alexey Milovidov).
  • 읽기 전용 디스크에서 테이블을 ATTACH할 때 오래된 파트를 로드하지 않도록 해 리소스 사용량을 줄였습니다. #65635 (Alexey Milovidov).
  • Set 인덱스에 minmax hyperrectangle을 지원합니다. #65676 (AntiTopQuark).
  • 전체 메모리 사용량을 줄이기 위해 오래된 파트의 프라이머리 인덱스를 언로드합니다. #65852 (Anton Popov).
  • replaceRegexpAllreplaceRegexpOne 함수는 이제 pattern이 단순한 경우, 즉 메타문자, pattern class, 플래그, 그룹화 문자 등을 포함하지 않으면 훨씬 더 빠르게 동작합니다. (Taiyang Li에게 감사드립니다.) #66185 (Robert Schulze).
  • S3 요청: 쿼리의 retry 시간을 줄이고 backups의 retries 횟수를 늘렸습니다. 쿼리는 8.5분에 100회 재시도, backup 복원은 1.2시간에 1000회 재시도입니다. #65232 (Sema Checherinda).
  • 쿼리 계획 LIMIT 최적화를 지원합니다. PostgreSQL storage와 테이블 함수에 LIMIT pushdown을 지원합니다. #65454 (Maksim Kita).
  • ZooKeeper 로드 밸런싱을 개선했습니다. fallback_session_lifetime에도 불구하고 최적의 노드를 사용할 수 있게 될 때까지 현재 session은 만료되지 않습니다. AZ 인식 밸런싱 지원도 추가했습니다. #65570 (Alexander Tokmakov).
  • DatabaseCatalog는 최대 database_catalog_drop_table_concurrency개의 thread를 사용해 테이블을 더 빠르게 삭제합니다. #66065 (Sema Checherinda).

개선

  • ZooKeeper 로드 밸런싱이 개선되었습니다. fallback_session_lifetime가 설정되어 있어도 현재 session은 최적의 노드를 사용할 수 있게 될 때까지 만료되지 않습니다. AZ를 고려한 밸런싱 지원이 추가되었습니다. #65570 (Alexander Tokmakov).
  • optimize_trivial_insert_select 설정은 기본적으로 비활성화되어 있습니다. 대부분의 경우 이 설정을 사용하면 이점이 있습니다. 다만 INSERT SELECT가 더 느려지거나 메모리 사용량이 증가하는 경우에는 이 설정을 다시 활성화하거나 SET compatibility = '24.6'를 설정할 수 있습니다. #58970 (Alexey Milovidov).
  • clickhouse-client 또는 clickhouse-local가 비정상 종료되면 스택 트레이스와 진단 정보를 출력합니다. #61109 (Alexander Tokmakov).
  • 이전에는 SHOW INDEX | INDEXES | INDICES | KEYS의 결과가 프라이머리 키(primary key) 컬럼 이름 기준으로 정렬되었습니다. 이는 직관적이지 않았기 때문에, 이제는 결과가 프라이머리 키 내 각 컬럼의 위치를 기준으로 정렬됩니다. #61131 (Robert Schulze).
  • Materialized View의 중복 제거 방식이 변경되었습니다. 다음과 같은 여러 사례가 수정되었습니다: - 대상 테이블에서: 데이터가 2개 이상의 block으로 분할될 때, 해당 block이 병렬로 삽입되면 중복으로 간주되던 문제입니다. - MV 대상 테이블에서: 집계를 수행하는 과정에서 서로 다른 입력 데이터에 대해서도 MV가 동일한 결과 데이터를 자주 생성해, 동일한 block이 중복 제거되던 문제입니다. - MV 대상 테이블에서: 서로 다른 MV에서 생성된 동일한 block이 중복 제거되던 문제입니다. #61601 (Sema Checherinda).
  • 파티션된 DeltaLake 데이터 읽기를 지원합니다. 데이터가 아니라 메타데이터를 읽어 DeltaLake 스키마를 추론합니다. #63201 (Kseniia Sumarokova).
  • 조합형 프로토콜에서는 TLS 계층에서 certificateFileprivateKeyFile 매개변수만 허용되었습니다. https://clickhouse.com/docs/operations/settings/composable-protocols. #63985 (Anton Ivashkin).
  • WHERE 절 평가에 기본 키(primary key)를 사용하는 SELECT 쿼리 수를 나타내는 profile 이벤트 SelectQueriesWithPrimaryKeyUsage가 추가되었습니다. #64492 (0x01f).
  • StorageS3Queue 관련 수정 및 개선 사항입니다. s3queue_processing_threads_num의 기본값이 기존의 1이 아니라 서버의 물리적 CPU 코어 수에 따라 결정되도록 변경했습니다. s3queue_loading_retries의 기본값을 10으로 설정했습니다. system.s3queue의 exception 컬럼에 모호한 “포착되지 않은 예외”가 표시될 수 있던 문제를 수정했습니다. MEMORY_LIMIT_EXCEEDED 예외가 발생한 경우 재시도 횟수를 증가시키지 않도록 했습니다. 파일이 테이블에 삽입되기 전에 커밋되는 상황을 방지하기 위해, 파일 커밋 시점을 테이블 삽입이 완전히 끝난 이후 단계로 옮겼습니다. 커밋 및 플러시 시점을 더 세밀하게 제어할 수 있도록 s3queue_max_processed_files_before_commit, s3queue_max_processed_rows_before_commit, s3queue_max_processed_bytes_before_commit, s3queue_max_processing_time_sec_before_commit 설정을 추가했습니다. #65046 (Kseniia Sumarokova).
  • 매개변수화된 view function에서 별칭 사용을 지원합니다(새 분석기에서만). #65190 (Kseniia Sumarokova).
  • azureBlobStorage 로그에서 계정 키를 마스킹하도록 개선했습니다. #65273 (SmitaRKulkarni).
  • IN 프레디케이트에서, 필터 표현식이 PARTITION BY 표현식의 일부인 경우 파티션 프루닝을 지원합니다. #65335 (Eduard Karacharov).
  • arrayMin/arrayMax는 비교 가능한 모든 데이터 타입에 적용됩니다. #65455 (pn).
  • 페이지 캐시가 차지하는 용량을 제외하도록 cgroups v2의 메모리 집계를 개선했습니다. #65470 (Nikita Taranov).
  • 청크를 직렬화해 EmbeddedRocksDB 테이블에 삽입할 때 각 행마다 포맷 설정을 생성하지 않도록 개선했습니다. #65474 (Duc Canh Le).
  • clickhouse-local 프롬프트를 :)만 표시하도록 줄였습니다. getFQDNOrHostName()는 macOS에서 실행 시 시간이 너무 오래 걸리고, clickhouse-local 프롬프트에는 호스트명을 표시할 필요도 없기 때문입니다. #65510 (Konstantin Bogdanov).
  • 저사양 가상 머신에서 CPU별 Arena 관련 jemalloc 메시지가 출력되지 않도록 했습니다. #65532 (Alexey Milovidov).
  • 기본적으로 파일 시스템 캐시의 백그라운드 다운로드를 비활성화합니다. 백그라운드 다운로드 스레드를 사용할 때 메모리 해제가 쿼리 Context 외부에서 수행되고(buffer는 쿼리 Context 내부에서 할당됨), 이로 인해 “Memory limit exceeded” 문제가 발생할 수 있는데, 이 문제를 수정한 후 다시 활성화할 예정입니다. 또한 백그라운드 worker의 최대 다운로드 크기를 정의하는 별도의 setting도 추가해야 합니다(현재는 max_file_segment_size로 제한되는데, 이 값이 너무 클 수 있습니다). #65534 (Kseniia Sumarokova).
  • config <config_reload_interval_ms>에 ClickHouse가 config를 다시 로드하는 주기를 지정할 수 있는 새 옵션을 추가했습니다. #65545 (alesapin).
  • ClickHouse 데이터 타입을 위한 바이너리 인코딩을 구현하고, 해당 명세를 문서에 추가했습니다. 이를 Dynamic 바이너리 직렬화에 사용하고, 설정을 통해 RowBinaryWithNamesAndTypes 및 Native 포맷에서도 사용할 수 있도록 했습니다. #65546 (Kruglov Pavel).
  • 서버 설정 compiled_expression_cache_sizecompiled_expression_cache_elements_size가 이제 system.server_settings에 표시됩니다. #65584 (Robert Schulze).
  • x509 SubjectAltName 확장을 기반으로 사용자 식별을 지원하도록 추가했습니다. #65626 (Anton Kozlov).
  • clickhouse-local은 설정 파일의 max_server_memory_usagemax_server_memory_usage_to_ram_ratio를 따릅니다. 또한 clickhouse-server와 마찬가지로 기본적으로 최대 메모리 사용량을 시스템 메모리의 90%로 설정합니다. #65697 (Alexey Milovidov).
  • 파일을 ClickHouse에 백업하기 위한 스크립트를 추가했습니다. #65699 (Alexey Milovidov).
  • 쿼리 취소를 지원하도록 PostgreSQL 소스를 개선했습니다. #65722 (Maksim Kita).
  • 분산 쿼리에서는 allow_experimental_analyzer를 initiator가 제어하도록 했습니다. 이를 통해 버전이 혼재된 클러스터에서 작업하는 동안 호환성과 정확성이 보장됩니다. #65777 (Nikita Mikhaylov).
  • Keeper에서 cgroup CPU 제한을 따르도록 했습니다. #65819 (Antonio Andelic).
  • 빈 인수로도 concat 함수를 사용할 수 있게 했습니다 :) select concat();. #65887 (李扬).
  • clickhouse-local에서 이름이 지정된 컬렉션을 제어할 수 있습니다. #65973 (Alexey Milovidov).
  • Azure 관련 profile events를 개선했습니다. #65999 (alesapin).
  • 작성자의 시간대(time zone)를 사용해 ORC 파일을 읽을 수 있도록 지원합니다. #66025 (kevinyhzou).
  • PostgreSQL 연결을 제어하는 설정이 추가되었습니다. 설정 postgresql_connection_attempt_timeout은 연결 URL의 connect_timeout 매개변수에 전달할 값을 지정합니다. 설정 postgresql_connection_pool_retries는 PostgreSQL 엔드포인트에 대한 연결을 설정할 때 재시도할 횟수를 지정합니다. #66232 (Dmitry Novik).
  • system.processors_profile_loginput_wait_elapsed_us/elapsed_us 부정확도를 줄였습니다. #66239 (Azat Khuzhin).
  • 파일 시스템 캐시의 ProfileEvents를 개선했습니다. #66249 (zhukai).
  • 복제 스토리지 사용 시 명명된 컬렉션 관리 쿼리에서 ON CLUSTER 절을 무시하도록 하는 설정을 추가했습니다. #66288 (MikhailBurdukov).
  • 이제 함수 generateSnowflakeID에서 대규모 클러스터의 충돌을 방지할 수 있도록 매개변수로 머신 ID를 지정할 수 있습니다. #66374 (ZAWA_ll).
  • Ctrl+Z를 사용한 interactive mode에서의 일시 중단을 비활성화합니다. 이는 흔히 빠지기 쉬운 함정이며, 거의 모든 사용자에게 기대되는 동작이 아닙니다. 터미널 애플리케이션을 백그라운드로 보내는 기능을 반기는 극소수의 아주 숙련된 사용자도 있을 수 있겠지만, 저는 그런 사용자를 본 적이 없습니다. #66511 (Alexey Milovidov).
  • Dictionaries에서 기본 키(primary key) 유형을 검증하는 옵션이 추가되었습니다. 이 옵션이 없으면 단순 layout에서는 모든 컬럼 유형이 암묵적으로 UInt64로 변환됩니다. #66595 (MikhailBurdukov).

버그 수정(공식 안정 릴리스에서 사용자에게 드러나는 오동작)

  • CREATE/REPLACE/RENAME/EXCHANGE 쿼리의 순환 종속성을 검사하고, 순환 종속성이 있으면 예외를 발생시킵니다. 이전에는 이러한 순환 종속성으로 인해 server 시작 중 교착 상태가 발생할 수 있었습니다. 또한 종속성 생성 과정의 일부 버그도 수정했습니다. #65405 (Kruglov Pavel).
  • 함수 호출에서 LowCardinality 컬럼의 크기가 예상과 다르게 처리되던 문제를 수정했습니다. #65298 (Raúl Marín).
  • maxIntersections의 비정상 종료 문제를 수정했습니다. #65689 (Raúl Marín).
  • 재시작 후 사용자 정의문에서 VALID UNTIL 절이 다시 초기화되는 문제를 수정했습니다. #66409 (Nikolay Degterinsky).
  • SHOW MERGES의 잔여 시간 컬럼을 수정했습니다. #66735 (Alexey Milovidov).
  • clickhouse-client에서 Query was cancelled가 두 번 출력될 수 있었습니다. 이 동작은 수정되었습니다. #66005 (Nikita Mikhaylov).
  • MySQL의 NULL 필드를 ClickHouse의 NOT NULL 필드로 매핑하는 TABLE OVERRIDE와 함께 MaterializedMySQL(지원되지 않는 실험적 기능)을 사용할 때 발생하던 충돌을 수정했습니다. #54649 (Filipp Ozinov).
  • PREWHERE 표현식이 어떤 컬럼도 읽지 않고 테이블에 적응형 인덱스 세분화 수준이 없는 경우(매우 오래된 테이블)에 발생하는 논리 오류를 수정했습니다. #59173 (Alexander Gololobov).
  • 쿼리 취소 시 취소 버퍼 관련 버그를 수정했습니다. #64478 (Sema Checherinda).
  • 메타데이터에서 파트 컬럼을 채우도록 수정했습니다 (columns.txt가 없을 때). #64757 (Azat Khuzhin).
  • ALTER TABLE ... ON CLUSTER ... MODIFY SQL SECURITY에서 발생하던 크래시를 수정했습니다. #64957 (pufit).
  • AccessControl 제거 시 발생하는 충돌 수정: 명시적 종료를 추가했습니다. #64993 (Vitaly Baranov).
  • 함수 uniq*의 인수에 있는 injective 함수를 재귀적으로 제거합니다. 이전에는 올바르게 동작했지만 새 분석기에서 깨졌습니다. #65140 (Duc Canh Le).
  • CTE가 포함된 쿼리에서 예기치 않은 프로젝션 이름 문제를 수정했습니다. #65267 (wudidapaopao).
  • 딕셔너리에 직접 쿼리하거나 Dictionary 테이블 엔진을 통해 접근할 때 dictGet 권한이 필요하도록 변경했습니다. #65359 (Joe Lynch).
  • 증분 백업에서 발생하던 사용자별 S3 인증 문제 수정. #65481 (Antonio Andelic).
  • read-in-order 최적화가 활성화된 경우, FINAL이 포함된 쿼리에서는 non-intersecting-parts 최적화를 비활성화합니다. 이로 인해 잘못된 쿼리 결과가 발생할 수 있었습니다. 임시 해결책으로, 이 수정이 머지되기 전까지 do_not_merge_across_partitions_select_finalsplit_parts_ranges_into_intersecting_and_non_intersecting_final을 비활성화하십시오. #65505 (Nikolai Kochetov).
  • 목록 배치에 포함된 모든 파일이 필터링된 경우 Index out of bound for blob metadata 예외가 발생하던 문제를 수정했습니다. #65523 (Kseniia Sumarokova).
  • 프로젝션 중복 제거 머지에서 발생하던 NOT_FOUND_COLUMN_IN_BLOCK를 수정했습니다. #65573 (Yakov Olkhovskiy).
  • MergeJoin의 버그를 수정했습니다. 희소 직렬화에서 필요한 변환이 수행되지 않았는데도 컬럼이 중첩 타입의 컬럼으로 처리될 수 있던 문제를 해결했습니다. #65632 (Nikita Taranov).
  • 호환성 수준 ‘23.4’가 제대로 적용되지 않던 버그를 수정했습니다. #65737 (cw5121).
  • 널 허용 필드가 있는 ODBC 테이블 관련 문제를 수정했습니다. #65738 (Rodolphe Dugé de Bernonville).
  • 치명적 오류 발생 시 발생할 수 있던 TCPHandler의 데이터 경쟁 문제를 수정했습니다. #65744 (Kseniia Sumarokova).
  • 함수 parseDateTime에서 %F%D 플레이스홀더와 관련된 잘못된 예외를 수정했습니다. #65768 (Antonio Andelic).
  • PostgreSQL에서 데이터를 읽는 쿼리에서는 ClickHouse 쿼리가 완료되면 내부 PostgreSQL 쿼리도 취소됩니다. 그렇지 않으면 내부 PostgreSQL 쿼리가 완료될 때까지 ClickHouse 쿼리를 취소할 수 없습니다. #65771 (Maksim Kita).
  • 이전 분석기와 dictGetOrDefault를 사용할 때 단락 평가 로직에서 발생하는 버그를 수정했습니다. #65802 (jsc0218).
  • TTL 쓰기 과정에서 EmbeddedRocksDB가 손상된 SST 파일을 생성하던 버그를 수정했습니다. #65816 (Duc Canh Le).
  • 함수 bitTest, bitTestAll, bitTestAny는 이제 지정한 비트 인덱스가 범위를 벗어나면 오류를 반환합니다 #65818 (Pablo Marcos).
  • join_any_take_last_row 설정은 해시 조인을 사용하는 모든 쿼리에서 지원됩니다. #65820 (vdimir).
  • IS NULL 검사가 포함된 join 조건 처리 방식이 개선되었습니다(예: ON (a = b AND (a IS NOT NULL) AND (b IS NOT NULL) ) OR ( (a IS NULL) AND (b IS NULL) )ON a <=> b로 다시 작성됩니다). IS NULL 이외의 조건이 있을 때 발생하던 잘못된 최적화도 수정했습니다. #65835 (vdimir).
  • S3Queue에서 증가하던 메모리 사용량 문제를 수정했습니다. #65839 (Kseniia Sumarokova).
  • arrayAUC의 동점 처리 방식이 sklearn과 일치하도록 수정했습니다. #65840 (gabrielmcg44).
  • MySQL server 프로토콜의 TLS 연결에서 발생할 수 있는 문제를 수정했습니다. #65917 (Azat Khuzhin).
  • MySQL 클라이언트 프로토콜의 TLS 연결에서 발생할 수 있는 문제를 수정했습니다. #65938 (Azat Khuzhin).
  • timeout 값이 0일 때 SSL_ERROR_WANT_READ/SSL_ERROR_WANT_WRITE 처리 문제를 수정했습니다. #65941 (Azat Khuzhin).
  • 결과 스키마를 변경할 수 있으므로, 스키마 추론 캐시에 누락된 설정 input_format_csv_skip_first_lines/input_format_tsv_skip_first_lines/input_format_csv_try_infer_numbers_from_strings/input_format_csv_try_infer_strings_from_quoted_tuples을 추가했습니다. 이를 통해 이러한 설정이 변경되었을 때 스키마 추론 결과가 잘못되는 것을 방지합니다. #65980 (Kruglov Pavel).
  • S3 엔진 및 S3 테이블 함수에서 _size 컬럼은 아카이브 자체의 크기가 아니라 아카이브 내부 파일의 크기를 나타냅니다. #65993 (Daniil Ivanik).
  • 분석기에서 동적 서브컬럼 해석 문제를 수정하고, 동적 서브컬럼을 읽을 때 전체 컬럼을 읽지 않도록 개선했습니다. #66004 (Kruglov Pavel).
  • replace 재정의가 있을 때 from_env 구성 병합을 수정했습니다. #66034 (Azat Khuzhin).
  • 종료 중 GRPCServer에서 발생할 수 있는 멈춤 현상을 수정했습니다. #66061 (Vitaly Baranov).
  • 비상수 LowCardinality 인수를 사용하는 함수 has의 여러 사례를 수정했습니다. #66088 (Anton Popov).
  • groupArrayIntersect 수정. merge() 함수에서 동작이 잘못되던 문제를 해결했습니다. 또한 숫자 데이터와 일반 데이터에 대한 deserialise() 동작도 수정했습니다. #66103 (Yarik Briukhovetskyi).
  • unbin/unhex 구현에서 발생하던 버퍼 오버플로우 버그를 수정했습니다. #66106 (Nikita Taranov).
  • #64760에서 도입된 merge-filters 최적화를 비활성화했습니다. 이 최적화가 두 개의 필터 표현식을 머지하면서 단락 평가를 적용하지 않으면 예외가 발생할 수 있습니다. #66126 (Nikolai Kochetov).
  • 이제 Avro 사양에서 허용되는 음수 block 크기로 인코딩된 배열이 포함된 Avro 파일을 서버가 파싱하지 못하던 문제를 수정했습니다. #66130 (Serge Klochkov).
  • ZooKeeper 클라이언트의 버그를 수정했습니다. ZooKeeper에서 하드웨어 오류를 받은 후 session이 사용할 수 없는 상태에 멈출 수 있었습니다. 예를 들어, ClickHouse Keeper의 “soft memory limit” 때문에 이런 문제가 발생할 수 있습니다. #66140 (Alexander Tokmakov).
  • SumIfToCountIfVisitor와 부호 있는 정수 관련 문제를 수정했습니다. #66146 (Raúl Marín).
  • 분산 쿼리 결과에서 데이터가 누락되는 드문 경우를 수정했습니다. #66174 (vdimir).
  • StorageDeltaLake에서 메타데이터 필드의 파싱 순서를 수정했습니다. #66211 (Kseniia Sumarokova).
  • distributed_ddl_output_modenone_only_active 모드에서는 TIMEOUT_EXCEEDED를 발생시키지 않도록 수정했습니다. #66218 (Alexander Tokmakov).
  • 인덱스를 사용할 수 없을 때 system.numbers_mt의 LIMIT 처리 방식을 수정했습니다. #66231 (János Benjamin Antal).
  • Docker와 같은 컨테이너에서 서버가 실행될 때, ClickHouse 서버가 cgroups v2에 지정된 사용 가능한 최대 CPU 코어 수를 감지하는 방식을 수정했습니다. 구체적으로, 컨테이너는 이름이 비어 있는 루트 cgroup에서 프로세스를 실행하는 경우가 많습니다. 이런 경우 ClickHouse는 cgroups v2에서 설정된 CPU 제한을 무시했습니다. #66237 (filimonov).
  • 제약 조건에 IN이 포함된 서브쿼리를 사용할 때 발생하던 Not-ready set 오류를 수정했습니다. #66261 (Nikolai Kochetov).
  • S3 또는 AzureBlobStorage로 복사하는 동안 오류 보고가 올바르게 이루어지도록 수정했습니다. #66295 (Vitaly Baranov).
  • watchdog가 unlink된(rotate된) 로그 파일의 파일 디스크립터를 유지하지 않도록 했습니다. #66334 (Aleksei Filatov).
  • logicalexpressionoptimizerpass에서 상수의 논리 타입이 손실되던 버그를 수정했습니다. #66344 (pn).
  • 새 분석기와 group_by_use_nulls=true 사용 시 발생하는 Column identifier is already registered 오류를 수정했습니다. #66400 (Nikolai Kochetov).
  • 과도한 filter pushdown으로 인해 외부 테이블 engine(예: PostgreSQL)에서 join 및 filter를 수행하는 쿼리에서 잘못된 결과가 발생할 수 있던 문제를 수정했습니다. 이제 external table과 outer join하는 경우 where 절의 조건은 외부 데이터베이스로 전송되지 않습니다. #66402 (vdimir).
  • cross join에 누락된 컬럼 머티리얼라이즈 처리를 추가했습니다. #66413 (lgbo).
  • GROUP BY 키에 상수 표현식이 포함되고 새 분석기가 활성화된 쿼리에서 발생하던 Cannot find column 오류를 수정했습니다. #66433 (Nikolai Kochetov).
  • Npy 포맷에서 가져오는 중 배열 중첩 수준이 잘못된 경우 발생할 수 있는 논리 오류를 방지하고, 다른 유형의 오류에 대한 테스트도 수정했습니다. #66461 (Yarik Briukhovetskyi).
  • 프레디케이트에 비결정적 함수가 있을 때 count() 결과가 잘못되던 문제를 수정했습니다. #66510 (Duc Canh Le).
  • Allocator::realloc의 메모리 추적이 올바르게 이루어지도록 수정했습니다. #66548 (Antonio Andelic).
  • 빈 튜플을 해시할 때 초기화되지 않은 메모리를 읽던 문제를 수정했습니다. #66562 (Alexey Milovidov).
  • WINDOW를 사용하는 쿼리에서 잘못된 결과가 반환되는 문제를 수정했습니다. 이 문제는 PARTITION 컬럼에 희소 직렬화가 적용되어 있고 윈도우 함수가 병렬로 실행될 때 발생할 수 있었습니다. #66579 (Nikolai Kochetov).
  • 로컬 스토리지에서 이름이 지정된 컬렉션을 삭제할 때 발생하던 문제를 수정했습니다. #66599 (János Benjamin Antal).
  • ColumnTuple::insertManyFrom에서 column_length가 업데이트되지 않던 문제를 수정했습니다. #66626 (lgbo).
  • 표현식 (column IS NULL).이 있는 쿼리에서 발생하는 Unknown identifierColumn is not under aggregate function 오류를 수정했습니다. 이 버그는 분석기가 비활성화된 경우에만 #65088으로 인해 발생했습니다. #66654 (Nikolai Kochetov).
  • 스칼라 서브쿼리를 IN의 첫 번째 인수로 사용했을 때 발생하던 Method getResultType is not supported for QUERY query node 오류를 수정했습니다(새 분석기 사용 시). #66655 (Nikolai Kochetov).
  • Variant 하위 컬럼을 읽는 중 발생할 수 있는 PARAMETER_OUT_OF_BOUND 오류를 수정했습니다. #66659 (Kruglov Pavel).
  • 드물게 발생하던 컬럼 삭제 후 머지가 멈추는 문제를 수정했습니다. #66707 (Raúl Marín).
  • 원격 소스에서 insert select를 수행할 때 발생하던 isUniqTypes assertion 문제를 수정했습니다. #66722 (Sema Checherinda).
  • PrometheusRequestHandler의 논리적 오류를 수정했습니다. #66621 (Vitaly Baranov).
  • 퍼저가 발견한 indexHint 함수의 대소문자 처리 문제를 수정했습니다. #66286 (Anton Popov).
  • ‘create table b empty as a’의 AST 포맷을 수정했습니다. #64951 (Michael Kolupaev).

ClickHouse 릴리스 24.6, 2024-07-01. 발표, 동영상

하위 호환되지 않는 변경 사항

  • 기본적으로 데이터베이스와 테이블의 비동기 로드를 활성화합니다. config.xml의 async_load_databases를 참조하십시오. 이 변경은 완전히 호환되지만 동작상의 차이를 일으킬 수 있습니다. 이전 버전처럼 async_load_databases가 false이면 모든 테이블이 로드될 때까지 서버가 연결을 수락하지 않습니다. 새 버전처럼 async_load_databases가 true이면 모든 테이블이 로드되기 전에도 서버가 연결을 수락할 수 있습니다. 아직 로드되지 않은 테이블에 쿼리가 수행되면 해당 테이블의 로딩이 완료될 때까지 대기하며, 이 과정에는 상당한 시간이 걸릴 수 있습니다. 서버가 로드 밸런서 뒤에 있는 대규모 분산 시스템의 일부인 경우, 이 변경으로 서버 동작이 달라질 수 있습니다. 첫 번째 경우에는 로드 밸런서가 연결 거부를 받고 빠르게 다른 서버로 장애 조치할 수 있습니다. 두 번째 경우에는 로드 밸런서가 아직 테이블을 로드 중인 서버에 연결할 수 있으며, 이 경우 쿼리 지연 시간이 더 길어집니다. 또한 대기 상태의 쿼리가 많이 누적되면 이들이 동시에 처리를 시작할 때 “thundering herd” 문제가 발생할 수 있습니다. 이 차이는 높은 부하의 분산 백엔드에서만 문제가 될 수 있습니다. 이 문제를 피하려면 async_load_databases 값을 false로 설정할 수 있습니다. #57695 (Alexey Milovidov).
  • replace_long_file_name_to_hash 설정은 MergeTree 테이블에서 기본적으로 활성화됩니다. #64457 (Anton Popov). 이 설정은 완전히 호환되며 업그레이드 중 별도의 조치는 필요하지 않습니다. 새로운 데이터 포맷은 23.9부터의 모든 버전에서 지원됩니다. 이 설정을 활성화한 후에는 23.8 이하 버전으로 더 이상 다운그레이드할 수 없습니다.
  • 일부 잘못된 쿼리는 구문 분석 단계에서 더 일찍 실패합니다. 참고: 문자열 리터럴 없이 인라인 KQL 표현식(실험적인 Kusto 언어)을 kql 테이블 함수에 넣는 방식의 지원이 비활성화되었습니다. 예를 들어 kql('garbage | trash') 또는 kql($$garbage | trash$$) 대신 kql(garbage | trash)를 사용하는 경우입니다. 이 기능은 의도치 않게 도입되었으며 존재해서는 안 되는 기능입니다. #61500 (Alexey Milovidov).
  • storage S3QueueOrdered 모드에서 병렬 처리를 재구성했습니다. 이 PR은 s3queue_processing_threads_num 또는 s3queue_total_shards_num 설정을 사용한 경우 Ordered 모드에서 하위 호환되지 않습니다. s3queue_total_shards_num 설정은 삭제되었으며, 이전에는 현재 더 이상 권장되지 않는 s3queue_allow_experimental_sharded_mode에서만 사용할 수 있었습니다. 새로운 설정 s3queue_buckets가 추가되었습니다. #64349 (Kseniia Sumarokova).
  • 새로운 함수 snowflakeIDToDateTime, snowflakeIDToDateTime64, dateTimeToSnowflakeID, dateTime64ToSnowflakeID가 추가되었습니다. 기존 함수 snowflakeToDateTime, snowflakeToDateTime64, dateTimeToSnowflake, dateTime64ToSnowflake와 달리, 새 함수는 generateSnowflakeID 함수와 호환됩니다. 즉, generateSnowflakeID가 생성한 Snowflake ID를 받아들이고 generateSnowflakeID와 동일한 유형(즉 UInt64)의 Snowflake ID를 생성합니다. 또한 새 함수는 generateSnowflakeID와 마찬가지로 기본적으로 UNIX epoch(즉 1970-01-01)를 사용합니다. 필요한 경우 다른 epoch를 전달할 수도 있으며, 예를 들어 Twitter/X의 epoch인 2010-11-04(즉 UNIX epoch 이후 1288834974657밀리초)를 사용할 수 있습니다. 기존 변환 함수는 더 이상 권장되지 않으며 전환 기간 후 제거될 예정입니다. 계속 사용하려면 allow_deprecated_snowflake_conversion_functions 설정을 활성화하십시오. #64948 (Robert Schulze).

새 기능

  • ClickHouse Keeper에 이름이 지정된 컬렉션을 저장할 수 있게 했습니다. #64574 (Kseniia Sumarokova).
  • 빈 튜플 지원. #55061 (Amos Bird).
  • Hilbert Curve 인코딩 및 디코딩 함수를 추가했습니다. #60156 (Artem Mustafin).
  • hilbertEncode에 대한 인덱스 분석 지원이 추가되었습니다. #64662 (Artem Mustafin).
  • WKT 포맷의 LINESTRING geometry를 readWKTLineString 함수로 읽을 수 있는 지원이 추가되었습니다. #62519 (Nikita Mikhaylov).
  • 다른 디스크의 파트를 ATTACH할 수 있도록 허용합니다. #63087 (Unalian).
  • Twitter 스타일의 Snowflake ID를 생성하는 새로운 SQL 함수 generateSnowflakeID가 추가되었습니다. #63577 (Danila Puzov).
  • 머지, 뮤테이션 및 기타 워크로드 간의 리소스 사용 및 공유 방식을 조정할 수 있도록 merge_workloadmutation_workload 설정을 추가했습니다. #64061 (Sergei Trifonov).
  • = 연산자를 사용해 IPv4IPv6 타입을 비교할 수 있도록 지원이 추가되었습니다. #64292 (Francisco J. Jurado Moreno).
  • 이항 수학 함수(pow, atan2, max2, min2, hypot)에서 Decimal 인수를 지원합니다. #64582 (Mikhail Gorshkov).
  • SQL 함수 parseReadableSize가 추가되었습니다(OrNullOrZero 버전 포함). #64742 (Francisco J. Jurado Moreno).
  • CREATE 쿼리에서 데이터베이스 또는 테이블의 수를 제한하는 서버 설정 max_table_num_to_throwmax_database_num_to_throw를 추가했습니다. #64781 (Xu Jia).
  • 파일과 유사한 스토리지(s3/file/hdfs/url/azureBlobStorage)에 _time 가상 컬럼이 추가되었습니다. #64947 (Ilya Golshtein).
  • 새로운 함수 base64URLEncode, base64URLDecode, tryBase64URLDecode가 추가되었습니다. #64991 (Mikhail Gorshkov).
  • 두 UTF8 문자열 간의 편집 거리를 계산하는 새 함수 editDistanceUTF8를 추가했습니다. #65269 (LiuNeng).
  • 사용자 지정 HTTP 핸들러에서 사용자 지정 응답 헤더를 지원할 수 있도록 http_response_headers 구성을 추가했습니다. #63562 (Grigorii).
  • 쿼리 결과를 무한 반복으로 반환할 수 있도록 새로운 테이블 함수 loop가 추가되었습니다. #63452 (Sariel). 테스트에 유용합니다.
  • system.query_logused_privilegesmissing_privileges라는 2개의 컬럼이 추가되었습니다. 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).

실험적 기능

  • “고유값 개수” 유형의 통계를 도입했습니다. #59357 (Han Fei).
  • ReplicatedMergeTree에서 통계를 지원합니다. #64934 (Han Fei).
  • Replicated 데이터베이스에 “replica group”이 구성된 경우, 모든 그룹의 레플리카를 포함하는 클러스터를 자동으로 생성합니다. #64312 (Alexander Tokmakov).
  • 범위 필터 사용 시 동적 세그먼트를 사용하는 병렬 레플리카가 쿼리를 병렬 처리하는 방식을 제어할 수 있도록 parallel_replicas_custom_key_range_lowerparallel_replicas_custom_key_range_upper 설정을 추가했습니다. #64604 (josh-hildred).

성능 개선

  • PRIMARY KEY로 설정된 순서를 위반하지 않으면서 크기 최적화를 위해 삽입 시 행 순서를 재배열하는 기능이 추가되었습니다. 이 기능은 설정 optimize_row_order로 제어되며(기본적으로 비활성화됨), #63578 (Igor Markelov).
  • Parquet 바이너리를 ClickHouse 컬럼으로 직접 읽어들일 수 있는 네이티브 Parquet 리더를 추가했습니다. 이 기능은 설정 input_format_parquet_use_native_reader로 제어되며, 기본적으로는 비활성화되어 있습니다. #60361 (ZhiHong Zhang).
  • 쿼리 filter가 MergeTree 테이블에서 정확한 범위를 선택할 수 있는 경우, 부분적인 단순 count 최적화를 지원합니다. #60463 (Amos Bird).
  • 여러 스레드의 청크를 단일 변환에서 수집하도록 하여 다중 스레드 INSERT의 최대 메모리 사용량을 줄였습니다. #61047 (Yarik Briukhovetskyi).
  • 고정 메모리 할당을 사용해 추가 버퍼를 할당하지 않도록 함으로써 Azure 객체 스토리지 사용 시 메모리 사용량을 줄였습니다. #63160 (SmitaRKulkarni).
  • ColumnNullable::size에서 가상 함수 호출 횟수를 줄였습니다. #60556 (HappenLee).
  • 정규식 인수가 단일 문자일 때 splitByRegexp의 속도를 향상했습니다. #62696 (Robert Schulze).
  • 사용된 최소 및 최대 키를 추적해 8비트 및 16비트 키의 집계 속도를 높였습니다. 이를 통해 검증해야 하는 셀 수를 줄일 수 있습니다. #62746 (Jiebin Sun).
  • 왼쪽 피연산자가 LowCardinality이고 오른쪽이 상수 집합인 경우 IN 연산자를 최적화했습니다. #64060 (Zhiguo Zhou).
  • ConcurrentHashJoin 내부에서 해시 테이블의 초기화 및 제거에 스레드 풀을 사용합니다. #64241 (Nikita Taranov).
  • 희소 컬럼이 있는 테이블의 수직 병합을 최적화했습니다. #64311 (Anton Popov).
  • 수직 병합 중 원격 파일 시스템에서 데이터를 프리페치하도록 활성화했습니다. 이를 통해 원격 파일 시스템에 데이터가 저장된 테이블에서 수직 병합의 지연 시간이 개선됩니다. #64314 (Anton Popov).
  • ColumnSparse::filterisDefault에 대한 중복 호출을 줄여 성능을 개선했습니다. #64426 (Jiebin Sun).
  • 여러 개의 비동기 getChildren 요청을 사용해 find_super_nodesfind_big_family keeper-client 명령의 속도를 개선했습니다. #64628 (Alexander Gololobov).
  • 널 허용 숫자형 인수에 대한 함수 least/greatest를 개선했습니다. #64668 (KevinyhZou).
  • 쿼리 계획(query plan)에서 연이어지는 두 개의 필터링 단계를 병합할 수 있도록 했습니다. 이렇게 하면 필터 조건을 상위 단계에서 푸시다운할 수 있을 때 필터 푸시다운(filter-push-down) 최적화가 개선됩니다. #64760 (Nikolai Kochetov).
  • vertical final 구현의 잘못된 최적화를 제거하고, vertical final 알고리즘이 기본적으로 다시 활성화되도록 했습니다. #64783 (Duc Canh Le).
  • 필터 표현식에서 ALIAS 노드를 제거했습니다. 이로 인해 PREWHERE가 있는 쿼리(새 분석기 사용 시)의 성능이 약간 향상됩니다. #64793 (Nikolai Kochetov).
  • OpenSSL 세션 캐싱을 다시 활성화했습니다. #65111 (Robert Schulze).
  • 삽입 시 스킵 인덱스와 통계를 구체화하지 않도록 하는 설정(materialize_skip_indexes_on_insertmaterialize_statistics_on_insert)이 추가되었습니다. #64391 (Anton Popov).
  • 할당된 메모리 크기를 바탕으로 row group 크기를 계산해, 단일 스레드 모드에서 Parquet writer의 최대 메모리 사용량을 줄였습니다. #64424 (LiuNeng).
  • 희소 컬럼의 이터레이터를 개선하여 size 호출 횟수를 줄였습니다. #64497 (Jiebin Sun).
  • Azure blob storage 백업에 서버 측 복사를 사용하도록 조건을 수정했습니다. #64518 (SmitaRKulkarni).
  • 스킵 인덱스가 많은 테이블의 수직 병합에 대한 메모리 사용량을 최적화했습니다. #64580 (Anton Popov).

개선 사항

  • SHOW CREATE TABLE을 system tables에서 실행하면 이제 각 테이블에 고유한 매우 유용한 comment가 표시되며, 이 comment를 통해 해당 테이블이 왜 필요한지 알 수 있습니다. #63788 (Nikita Mikhaylov).
  • 이제 round(), roundBankers(), floor(), ceil(), trunc() 함수의 두 번째 인수(scale)는 상수가 아니어도 됩니다. #64798 (Mikhail Gorshkov).
  • 새 디스크를 추가할 때 Distributed 테이블의 스토리지 정책을 핫 리로드합니다. #58285 (Duc Canh Le).
  • 서비스가 포화된 상태에서 스레드를 스케줄링할 때 MergeTree 인덱스 분석 중 발생할 수 있는 교착 상태를 방지합니다. #59427 (Sean Haynes).
  • S3 프록시 지원 및 터널링 관련 여러 사소한 예외 상황을 수정했습니다. #63427 (Arthur Passos).
  • io_uring 재제출 동작의 가시성을 개선했습니다. 프로파일 이벤트 IOUringSQEsResubmits의 이름을 IOUringSQEsResubmitsAsync로 변경하고, 새 이벤트 IOUringSQEsResubmitsSync를 추가했습니다. #63699 (Tomer Shafir).
  • 메타데이터 저장소 디스크에 여유 공간을 유지하기 위한 새로운 설정 metadata_keep_free_space_bytes가 추가되었습니다. #64128 (MikhailBurdukov).
  • plain_rewritable 메타데이터 저장소에서 생성되거나 제거된 디렉터리 수와 로컬-원격 간 인메모리 맵의 항목 수를 추적하는 메트릭을 추가했습니다. #64175 (Julia Kartseva).
  • 이제 쿼리 캐시는 설정이 다른 동일한 쿼리를 서로 다른 쿼리로 간주합니다. 이로써 서로 다른 설정(예: limit 또는 additional_table_filters)이 쿼리 결과에 영향을 미치는 경우에도 더 안정적으로 동작합니다. #64205 (Robert Schulze).
  • 객체 스토리지에서 비표준 오류 코드 QpsLimitExceeded를 재시도 가능한 오류로 처리하도록 지원합니다. #64225 (Sema Checherinda).
  • 이 테이블의 ZooKeeper 경로가 이미 존재하는 경우, MergeTree 테이블을 복제된 테이블로 변환하지 못하게 했습니다. #64244 (Kirill).
  • 평균 출력 블록 바이트 수를 제어하는 새로운 설정 input_format_parquet_prefer_block_bytes가 추가되었으며, input_format_parquet_max_block_size의 기본값은 65409로 변경되었습니다. #64427 (LiuNeng).
  • no_proxy env variable 및 ClickHouse 프록시 구성에 지정된 호스트에서는 프록시를 우회할 수 있도록 허용합니다. #63314 (Arthur Passos).
  • Keeper를 시작할 때는 항상 Global Thread 풀에 충분한 수의 스레드가 있도록 하십시오. #64444 (Duc Canh Le).
  • 사용자 구성의 설정은 객체 스토리지 기반 MergeTree의 머지 및 뮤테이션에 영향을 주지 않습니다. #64456 (alesapin).
  • 객체 스토리지에서 비표준 오류 코드 TotalQpsLimitExceeded를 재시도 가능한 오류로 처리하도록 지원합니다. #64520 (Sema Checherinda).
  • 오픈소스 버전과 ClickHouse Cloud 버전 모두의 Advanced Dashboard에 ‘최대 동시 네트워크 연결’ 차트를 추가했습니다. #64610 (Thom O’Connor).
  • zeros_mtgenerateRandom의 진행 상황 보고를 개선했습니다. #64804 (Raúl Marín).
  • 샘플링이 현재 활성화되어 있는지 표시하는 비동기 메트릭 jemalloc.profile.active를 추가합니다. 이는 prof.active에 더해진 활성화 메커니즘이며, 호출한 thread에서 샘플링이 수행되려면 둘 다 활성화되어 있어야 합니다. #64842 (Unalian).
  • allow_experimental_join_condition의 중요 표시를 제거했습니다. 이 표시는 서로 다른 버전이 혼재된 클러스터에서 분산 쿼리가 성공적으로 실행되지 못하게 했을 수 있습니다. #65008 (Nikita Mikhaylov).
  • DiskGetObjectThrottler*DiskGetObjectThrottler* 서버 비동기 메트릭이 추가되었습니다. 이 메트릭은 s3_max_get_rpss3_max_put_rps 디스크 설정으로 정의된 초당 요청 수 제한과, 디스크에서 스로틀링 한도에 도달하지 않고 현재 전송할 수 있는 요청 수를 반영합니다. 이러한 메트릭은 제한이 구성된 각 디스크별로 정의됩니다. #65050 (Sergei Trifonov).
  • Poco::ThreadPool용 전역 trace collector를 초기화합니다(Keeper 등에 필요). #65239 (Kseniia Sumarokova).
  • bcrypt_hash로 사용자를 생성할 때 유효성 검사를 추가했습니다. #65242 (Raúl Marín).
  • PREWHERE 적용 중/후에 읽은 행 수를 위한 profile events를 추가했습니다. #64198 (Nikita Taranov).
  • 병렬 레플리카 사용 시 EXPLAIN PLAN에 쿼리를 출력합니다. #64298 (vdimir).
  • allow_deprecated_functionsallow_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).

버그 수정(공식 안정 릴리스에서 사용자에게 드러나는 오동작)

  • Apache ORC 라이브러리의 버그가 수정되었습니다. 쓰기 시 모든 플랫폼의 부호 없는 타입과 ARM의 Int8에 대한 ORC 통계 계산 문제를 수정했습니다. #64563 (Michael Kolupaev).
  • ClickHouse가 CSV 형식에서 튜플을 처리하고 해석하는 동작을 원래대로 되돌렸습니다. 이 변경은 사실상 https://github.com/ClickHouse/ClickHouse/pull/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).
  • 특정 상황에서 사용자가 필요한 권한 부여 없이 기본 데이터베이스에서 자신의 권한을 상승시킬 수 있던 권한 오류를 수정했습니다. #64769 (pufit).
  • UniqInjectiveFunctionsEliminationPass와 uniqCombined에서 발생하던 크래시를 수정했습니다. #65188 (Raúl Marín).
  • 세션 종료 시 digest 불일치가 발생하는 ClickHouse Keeper 버그를 수정했습니다. #65198 (Aleksei Filatov).
  • Distinct combinator에 올바른 메모리 정렬을 적용합니다. 이전에는 combinator를 사용할 때 잘못된 메모리 할당으로 인해 충돌이 발생할 수 있었습니다. #65379 (Antonio Andelic).
  • DISTINCT 및 윈도우 함수에서 발생하던 충돌을 수정했습니다. #64767 (Igor Nikonov).
  • ‘set’ 스킵 인덱스가 IN 및 indexHint()와 함께 동작하지 않던 문제를 수정했습니다. #62083 (Michael Kolupaev).
  • 매개변수화된 뷰 값 할당 시 함수 실행을 지원합니다. #63502 (SmitaRKulkarni).
  • Parquet 메모리 추적 문제를 수정했습니다. #63584 (Michael Kolupaev).
  • Tuple(Map(LowCardinality(String), String), ...) 유형의 컬럼을 읽을 때 발생하던 문제를 수정했습니다. #63956 (Anton Popov).
  • 서로 다른 유형(표현식과 함수)의 순환 별칭에서 발생하던 Cyclic aliases 오류를 수정했습니다. #63993 (Nikolai Kochetov).
  • 이 수정으로 쿼리 파이프라인의 각 개별 뷰에 올바른 정의자를 갖는 적절히 재정의된 Context가 사용됩니다. #64079 (pufit).
  • 분석기 수정: INTERPOLATE 사용 시 발생하던 “컬럼을 찾을 수 없음” 오류를 해결했습니다. #64096 (Yakov Olkhovskiy).
  • 파일이 저장된 디스크와 다른 자격 증명을 사용하는 S3 버킷으로 백업을 생성할 때 발생하던 문제를 수정했습니다. #64153 (Antonio Andelic).
  • 이제 쿼리 캐시는 서로 다른 데이터베이스에 대해 실행된 동일한 두 쿼리를 서로 다른 쿼리로 간주합니다. 이전 동작에서는 테이블 읽기 권한이 없어도 이를 우회할 수 있었습니다. #64199 (Robert Schulze).
  • StatusFile의 ~WriteBufferFromFileDescriptor에서 포착되지 않은 예외로 인해 발생할 수 있는 비정상 종료를 수정했습니다. #64206 (Kruglov Pavel).
  • ARRAY JOIN이 있는 분산 쿼리에서 발생하던 duplicate alias 오류를 해결했습니다. #64226 (Nikolai Kochetov).
  • string에서 integer로 변환할 때 발생하던 예상치 못한 accurateCast 문제를 수정했습니다. #64255 (wudidapaopao).
  • OR 그룹에 서로 배타적인 원자식이 포함된 경우 CNF 단순화가 올바르게 동작하도록 수정했습니다. #64256 (Eduard Karacharov).
  • Query Tree 크기 검증 문제를 수정했습니다. #64377 (Dmitry Novik).
  • PREWHERE를 사용하는 Buffer 테이블에서 발생하던 Logical error: Bad cast를 수정했습니다. #64388 (Nikolai Kochetov).
  • 객체 스토리지에 저장된 blob_storage_log에서 재귀 로깅이 발생하지 않도록 했습니다. #64393 (vdimir).
  • 기본값 표현식이 있는 테이블의 CREATE TABLE AS 쿼리를 수정했습니다. #64455 (Anton Popov).
  • 널 허용 키를 사용하는 테이블에서 ORDER BY … NULLS FIRST / LAST에 대한 optimize_read_in_order 동작을 수정했습니다. #64483 (Eduard Karacharov).
  • GLOBAL IN.의 별칭을 사용하는 쿼리에서 발생하던 Expression nodes list expected 1 projection namesUnknown expression or identifier 오류를 수정했습니다. #64517 (Nikolai Kochetov).
  • GROUP BY 키에 상수 CTE가 포함된 분산 쿼리에서 발생하던 Cannot find column 오류를 수정했습니다. #64519 (Nikolai Kochetov).
  • 아직 복원되지 않은 definer가 있는 MV 생성으로 인해 백업 복원이 막힐 때 발생하던 크래시 루프를 수정했습니다. #64595 (pufit).
  • Formatter가 홀수 개의 문자를 생성하고 마지막 문자가 0일 때 formatDateTimeInJodaSyntax 함수의 출력이 올바르게 수정되었습니다. 예를 들어, SELECT formatDateTimeInJodaSyntax(toDate('2012-05-29'), 'D')는 이제 이전의 15가 아니라 150을 올바르게 반환합니다. #64614 (LiuNeng).
  • -If combinator가 이미 사용된 경우에는 집계를 재작성하지 않습니다. #64638 (Dmitry Novik).
  • float의 타입 추론을 수정했습니다(버퍼가 작은 경우, 즉 --max_read_buffer_size 1). #64641 (Azat Khuzhin).
  • 표현식이 포함된 TTL이 정상적으로 작동하지 않을 수 있던 버그를 수정했습니다. #64694 (alesapin).
  • 항상 참으로 평가되는 WHEREPREWHERE 표현식이 제거되던 문제를 수정했습니다(새 분석기에서). #64695 (Nikolai Kochetov).
  • startsWith, endsWith, match, multiSearchAny의 결과로 필터링할 때 토큰 기반 텍스트 인덱스(ngrambf , full_text)가 파트를 과도하게 제외하던 문제를 수정했습니다. #64720 (Eduard Karacharov).
  • UTF8::computeWidth 함수에서 ANSI CSI 이스케이프 처리의 비정상 동작을 수정했습니다. #64756 (Shaun Struwig).
  • 서브쿼리 전반에 걸쳐 ORDER BY / LIMIT BY가 잘못 제거되는 문제를 수정했습니다. #64766 (Raúl Marín).
  • 혼합 join 조건에 포함된 Set에 대한 서브쿼리가 있는 비등가 join(실험적)을 수정했습니다. #64775 (lgbo).
  • plain_rewritable 디스크의 로컬 캐시에서 발생하던 크래시를 수정했습니다. #64778 (Julia Kartseva).
  • Keeper 수정: mntr 명령에서 zk_latest_snapshot_size가 올바른 값을 반환하도록 했습니다. #64784 (Antonio Andelic).
  • 분산 쿼리에서 Nested 컬럼에 대해 ARRAY JOIN을 사용할 때 발생하는 Cannot find column 문제를 수정했습니다. #64755를 수정합니다. #64801 (Nikolai Kochetov).
  • slru 캐시 정책에서 발생하던 메모리 누수를 수정했습니다. #64803 (Kseniia Sumarokova).
  • 여러 유형의 쿼리에서 메모리 추적이 잘못될 수 있던 문제를 수정했습니다: S3에서 데이터를 읽는 쿼리, HTTP 프로토콜을 통한 쿼리, 비동기 삽입. #64844 (Anton Popov).
  • materialized view에 원본 테이블과 타입이 다른 컬럼이 있을 때, materialized view에서 PREWHERE로 읽는 쿼리에서 발생하던 Block structure mismatch 오류를 수정했습니다. #64611을 해결합니다. #64855 (Nikolai Kochetov).
  • 테이블에 TTL이 있고 서브쿼리 + 복제된 데이터베이스 + 병렬 레플리카 + 분석기를 함께 사용하는 경우 드물게 발생하던 충돌을 수정했습니다. 매우 드문 경우이지만, TTL을 서브쿼리와 함께 사용하지 마십시오. #64858 (alesapin).
  • 삭제할 항목이 많은 배치에서 blob_storage_logDelete 이벤트가 중복 기록되던 문제를 수정했습니다. #64924 (vdimir).
  • config에 [Zoo]Keeper에서 가져오는 include가 있는 경우, 서버 시작 후 발생할 수 있는 [Zoo]Keeper의 Session moved to another server 오류를 수정했습니다. #64986 (Alexander Tokmakov).
  • https://github.com/ClickHouse/ClickHouse/pull/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 계열 스토리지에서 finalized buffer에 쓰지 않도록 합니다. #65063 (Kruglov Pavel).
  • 순환 alias로 인해 쿼리 Duration이 무한대로 계산될 수 있는 문제를 수정했습니다. #64849. #65081 (Nikolai Kochetov).
  • INTERPOLATE (alias)(새 분석기)를 사용하는 원격 쿼리에서 Unknown expression identifier 오류를 수정합니다. #64636를 해결합니다. #65090 (Nikolai Kochetov).
  • 집계 밖으로 산술 연산을 이동시키는 최적화를 수정했습니다. 새로운 분석기에서는 최적화가 한 번만 적용되었습니다. #65104 (Dmitry Novik).
  • 새 분석기에서 집계 함수 이름이 잘못 재작성되는 문제를 수정했습니다. #65110 (Dmitry Novik).
  • 클라이언트 socket에서 요청 본문(일부)을 읽는 중 수신 타임아웃이 발생하면 200 OK 대신 5xx로 응답합니다. #65118 (Julian Maicher).
  • 헤지드 요청으로 인해 발생할 수 있는 비정상 종료를 수정했습니다. #65206 (Azat Khuzhin).
  • Hashed 및 Hashed_Array 딕셔너리의 단락 평가에서 발생하던 버그를 수정해, 초기화되지 않은 숫자를 읽어 다양한 오류가 발생할 수 있던 문제를 해결했습니다. #65256 (jsc0218).
  • 이 PR은 IN 연산자의 형 변환 과정에서 상수(IN 연산자의 두 번째 매개변수)의 타입 정보가 항상 유지되도록 합니다. 그렇지 않으면 타입 정보가 손실되어 DateTime에서 Date로 변환하는 경우처럼 일부 변환이 실패할 수 있습니다. 이 변경으로 (#64487) 문제가 수정됩니다. #65315 (pn).

빌드/테스트/패키징 개선

  • LLVM XRay 지원을 추가했습니다. #64592 #64837 (Tomer Shafir).
  • s3/hdfs/azure 스토리지 구현을 IObjectStorage와 함께 작동하는 단일 클래스로 통합했습니다. *Cluster, 데이터 레이크 및 Queue 스토리지에도 동일하게 적용했습니다. #59767 (Kseniia Sumarokova).
  • MergeTreeData와 DataPart에 대한 의존성을 제거하도록 data part writer를 리팩터링했습니다. #63620 (Alexander Gololobov).
  • PartitionPruner와 단순 count 최적화를 개선하기 위해 KeyCondition 및 키 분석을 리팩터링했습니다. 이는 #60463에서 분리된 작업입니다. #61459 (Amos Bird).
  • 모든 함수가 올바른 크기의 컬럼으로 호출되는지 검증하는 assertion을 도입했습니다. #63723 (Raúl Marín).
  • rc init 스크립트로 ClickHouse 서버 데몬을 시작할 때 network service가 필수이도록 변경했습니다. #60650 (Chun-Sheng, Li).
  • 일부 느린 테스트의 크기를 줄였습니다. #64387 #64452 (Raúl Marín).
  • keeper-bench를 사용해 ZooKeeper 로그를 재생했습니다. #62481 (Antonio Andelic).

ClickHouse 릴리스 24.5, 2024-05-30. 발표 자료, 동영상

하위 호환되지 않는 변경 사항

  • “inverted indexes”의 이름을, 더 덜 기술적인 표현이자 사용자 친화적인 이름인 “full-text indexes”로 변경했습니다. 이 변경은 내부 테이블 메타데이터에도 영향을 미치며, 기존의 (experimental) inverted indexes가 있는 테이블과의 호환성을 깨뜨립니다. 업그레이드 전에 이러한 인덱스를 반드시 삭제하고, 업그레이드 후 다시 생성하십시오. #62884 (Robert Schulze).
  • neighbor, runningAccumulate, runningDifferenceStartingWithFirstValue, runningDifference 함수의 사용은 오류를 유발하기 쉬우므로 더 이상 권장되지 않습니다. 대신 적절한 윈도우 함수를 사용해야 합니다. 다시 활성화하려면 allow_deprecated_error_prone_window_functions = 1을 설정하거나, compatibility = '24.4' 이하로 설정하십시오. #63132 (Nikita Taranov).
  • 컬럼 수가 매우 많고 SHOW TABLES 권한이 부여되지 않은 데이터베이스 또는 테이블도 많은 경우, system.columns에 대한 쿼리가 더 빠르게 동작합니다. 이전 버전에서는 해당 테이블에 SHOW TABLES 권한을 부여하지 않고 개별 컬럼에 SHOW COLUMNS만 부여한 경우에도 system.columns 테이블에 이러한 컬럼이 표시되었지만, 새 버전에서는 해당 테이블 전체를 건너뜁니다. 또한 쿼리를 느리게 만들던 trace 로그 메시지 “Access granted”와 “Access denied”를 제거했습니다. #63439 (Alexey Milovidov).

새 기능

  • 단일 레코드를 application/x-www-form-urlencoded 포맷으로 읽고 쓸 수 있는 Form 포맷이 추가되었습니다. #60199 (Shaun Struwig).
  • CROSS JOIN에서 압축을 사용할 수 있게 되었습니다. #60459 (p1rattttt).
  • 크기가 제한을 초과하면 임시 파일에서 CROSS JOIN을 수행할 수 있는 기능이 추가되었습니다. #63432 (p1rattttt).
  • 왼쪽 테이블과 오른쪽 테이블의 컬럼을 모두 포함하는 부등 조건이 있는 join을 지원합니다. 예: t1.y < t2.y. 활성화하려면 SET allow_experimental_join_condition = 1을 설정하십시오. #60920 (lgbo).
  • 이제 맵의 키로 Float32, Float64, Array(T), Map(K, V), Tuple(T1, T2, ...)를 사용할 수 있습니다. #54537을 해결했습니다. #59318 (李扬).
  • rocksdb 내장 memtable에 의존하는 대신 SST 파일을 생성해 수집하는 방식으로 EmbeddedRocksDB에 대량 로딩 기능을 도입했습니다. 이를 통해 특히 StorageEmbeddedRocksDB 테이블에 대해 장시간 실행되는 삽입 쿼리의 가져오기 속도를 높일 수 있습니다. 또한 EmbeddedRocksDB 테이블 설정도 도입했습니다. #59163 #63324 (Duc Canh Le).
  • 이제 input_format_tsv_crlf_end_of_line 설정을 사용하면 TSV 포맷에서 CRLF를 파싱할 수 있습니다. #56257를 해결합니다. #59747 (Shaun Struwig).
  • 누락된 필드에 NULL 값을 강제로 설정하는 새로운 설정 input_format_force_null_for_omitted_fields입니다. #60887 (Constantine Peresypkin).
  • 이전에는 S3 storage와 s3 테이블 함수에서 tarball, zip, 7z와 같은 아카이브 컨테이너 파일을 대상으로 SELECT를 수행할 수 없었습니다. 이제는 S3에 저장된 아카이브 내부 파일을 순회할 수 있습니다. #62259 (Daniil Ivanik).
  • 조건 함수 clamp를 지원합니다. #62377 (skyoct).
  • NPy 출력 형식을 추가했습니다. #62430 (豪肥肥).
  • Raw 포맷을 TSVRaw의 별칭으로 지원합니다. #63394 (Unalian).
  • 버전 7 UUID, 즉 무작위 구성 요소가 포함된 timestamp 기반 UUID를 생성하는 새로운 SQL 함수 generateUUIDv7가 추가되었습니다. 또한 UUID에서 바이트를 추출하는 새로운 함수 UUIDToNum과 버전 7 UUID에서 timestamp 구성 요소를 추출하는 새로운 함수 UUIDv7ToDateTime도 추가되었습니다. #62852 (Alexey Petrunyaka).
  • Linux 및 MacOS에서 프로그램의 stdout이 압축 확장자가 있는 파일로 리디렉션된 경우, 아무것도 사용하지 않는 대신 해당 압축 방식을 사용하도록 했습니다(INTO OUTFILE와 비슷하게 동작함). #63662 (v01dXYZ).
  • attached 상태인 테이블 수가 많을 때 표시되는 경고를 변경해 테이블, 뷰, 딕셔너리를 구분하도록 했습니다. #64180 (Francisco J. Jurado Moreno).
  • ClickHouse 서버에서 azureBlobStorage 함수가 Azure Workload Identity를 사용해 Azure blob storage에 인증할 수 있도록 지원합니다. config에서 use_workload_identity 매개변수를 설정하면 인증에 workload identity를 사용합니다. #57881 (Vinay Suryadevara).
  • system.parts_columns 테이블에 TTL 정보를 추가했습니다. #63200 (litlig).

실험적 기능

  • 미리 모든 타입을 알지 못해도 내부에 임의의 타입 값을 저장할 수 있는 Dynamic 데이터 타입을 구현했습니다. Dynamic 타입은 allow_experimental_dynamic_type 설정을 통해 사용할 수 있습니다. 참고: #54864. #63058 (Kruglov Pavel).
  • MySQL에 연결하지 않아도 MaterializedMySQL 데이터베이스를 생성할 수 있도록 허용했습니다. #63397 (Kirill).
  • 일부 DDL 작업이 동일한 오류로 연속해서 max_retries_before_automatic_recovery(기본값 100)번보다 많이 실패하면, 복제된 데이터베이스의 레플리카를 자동으로 손실된 것으로 표시하고 복구를 시작합니다. 또한 entry 실행 초기 단계에서 예외가 발생할 경우 DDL entry가 스키핑될 수 있던 버그도 수정했습니다. #63549 (Alexander Tokmakov).
  • StorageS3Queue에서 실패한 파일도 s3queue_tracked_file_ttl_secs3queue_traked_files_limit에 포함되도록 했습니다. #63638 (Kseniia Sumarokova).

성능 개선

  • 파일 시스템 캐시의 경합을 줄였습니다(4부). 백그라운드에서 추가 eviction을 수행해 파일 시스템 캐시가 한계까지 차지되지 않도록 유지할 수 있게 했습니다(keep_free_space_size(elements)_ratio로 제어). 이를 통해 쿼리의 공간 예약(tryReserve 메서드) 부담을 줄일 수 있습니다. 또한 가능한 한 lock-free 방식으로 처리되어, 일반적인 캐시 사용을 차단하지 않습니다. #61250 (Kseniia Sumarokova).
  • INSERT 중 새로 생성된 projection 블록의 머지를 건너뜁니다. #59405 (Nikita Taranov).
  • 입력 문자열이 모두 ASCII 문자이면 ...UTF8 문자열 함수를 ASCII 방식으로 처리합니다. https://github.com/apache/doris/pull/29799 에서 영감을 받았습니다. 전체적으로 1.07배~1.62배 빨라졌습니다. 일부 경우에는 최대 메모리 사용량도 감소했습니다. #61632 (李扬).
  • StorageS3에서 선택({}) 글롭 패턴의 성능을 개선했습니다. #62120 (Andrey Zvonov).
  • HostResolver는 각 IP 주소를 여러 번 보유합니다. 원격 호스트에 여러 IP가 있고, 어떤 이유로든(예: firewall 규칙) 일부 IP는 접근이 허용되고 다른 IP는 금지된 경우, 금지된 IP들 중 첫 번째 레코드만 실패로 표시되며 매번 시도할 때마다 해당 IP들이 다시 선택될 수 있습니다(그리고 다시 실패합니다). 이 문제를 수정하더라도 120초마다 DNS 캐시가 삭제되므로 해당 IP가 다시 선택될 수 있습니다. #62652 (Anton Ivashkin).
  • 메모리 사용량을 제어하고 컬럼이 많을 때 머지 중 정렬 속도를 2배 높일 수 있도록 새 구성 prefer_merge_sort_block_bytes를 추가했습니다. #62904 (LiuNeng).
  • clickhouse-local이 더 빠르게 시작됩니다. 이전 버전에서는 실수로 임시 디렉터리를 삭제하지 않았습니다. 이제는 삭제합니다. 이로써 #62941이 해결됩니다. #63074 (Alexey Milovidov).
  • 새 분석기에 대한 미세 최적화입니다. #63429 (Raúl Marín).
  • DateTimeDateTime64와 비교하는 경우에도 인덱스 분석이 동작합니다. 이로써 #63441이 해결됩니다. #63443 #63532 (Alexey Milovidov).
  • 불필요한 요소를 제거해 set 유형 인덱스를 약간(약 1.5배) 더 빠르게 만들었습니다. #64098 (Alexey Milovidov).
  • 파일 시스템 캐시에 쓸 때 데이터 복사를 제거했습니다. #63401 (Kseniia Sumarokova).
  • 이제 Azure blob storage를 사용하는 backups는 multicopy를 사용합니다. #64116 (alesapin).
  • 서로 다른 Container에서도 Azure 네이티브 copy를 사용할 수 있습니다. #64154 (alesapin).
  • 마침내 Azure 네이티브 copy를 활성화했습니다. #64182 (alesapin).

개선 사항

  • clickhouse-local과 해당 축약 명령인 clickhousech에서 쿼리 또는 쿼리 파일을 위치 인수로 사용할 수 있습니다. 예시: ch "SELECT 1", ch --param_test Hello "SELECT {test:String}", ch query.sql. 이 변경으로 #62361이 해결되었습니다. #63081 (Alexey Milovidov).
  • 로컬 및 Azure (azure_blob_storage) 객체 스토리지에서 plain_rewritable 메타데이터를 활성화합니다. #63365 (Julia Kartseva).
  • 영문 스타일의 유니코드 따옴표를 지원합니다. 예: “Hello”, ‘world’. 전반적으로는 다소 미묘한 기능이지만, Google Docs와 같은 워드 프로세서에서 쿼리를 입력할 때 유용합니다. 이로써 #58634가 해결되었습니다. #63381 (Alexey Milovidov).
  • INSERT 쿼리의 컬럼 목록에서 끝에 오는 쉼표를 허용합니다. 예를 들어, INSERT INTO test (a, b, c, ) VALUES .... #63803 (Alexey Milovidov).
  • Regexp 포맷의 예외 메시지가 개선되었습니다. #63804 (Alexey Milovidov).
  • Values 포맷에서 후행 쉼표를 허용합니다. 예를 들어 다음 쿼리가 허용됩니다: INSERT INTO test (a, b, c) VALUES (4, 5, 6,);. #63810 (Alexey Milovidov).
  • 손상된 메시지에 대해 RabbitMQ가 nack를 보내도록 변경했습니다. #45350을 해결합니다. #60312 (Kseniia Sumarokova).
  • 디버그 정보를 해석하는 과정에서 비동기 스택 언와인딩(예: 샘플링 쿼리 프로파일러 사용 시) 중 발생하던 충돌을 수정했습니다. 이로써 #60460이 해결되었습니다. #60468 (Alexey Milovidov).
  • 디스크와 스토리지의 경우 S3 오류 ‘no key’에 대해 구분된 메시지를 제공합니다. #61108 (Sema Checherinda).
  • 진행률 표시줄이 system.zeros, system.zeros_mt에서 LIMIT를 사용하는 간단한 쿼리와 generateRandom 테이블 함수에서도 작동합니다(system.numberssystem.numbers_mt에서는 이미 작동함). 추가로, 전체 레코드 수가 max_rows_to_read 제한보다 크면 예외를 더 일찍 발생시킵니다. 이로써 #58183가 해결됩니다. #61823 (Alexey Milovidov).
  • YAML 구성에서 “Merge Key”를 지원합니다(이것은 YAML의 다소 특이한 기능이므로, 무시하셔도 됩니다). #62685 (Azat Khuzhin).
  • Replicated 소스에서 비결정적 함수를 사용할 때 발생하는 오류 메시지를 개선했습니다. #62896 (Grégoire Pineau).
  • remote의 Distributed over Distributed에 대한 서버 간 시크릿 수정. #63013 (Azat Khuzhin).
  • YAML 파일에서 include_from을 지원합니다. 하지만 config.d를 사용하는 편이 더 좋습니다 #63106 (Eduard Karacharov).
  • skim 제안에서 항목을 선택한 후에도 터미널의 이전 데이터를 유지하도록 했습니다. #63261 (FlameFactory).
  • 필드의 너비는(Pretty 형식 또는 visibleWidth 함수에서) 이제 ANSI 이스케이프 시퀀스를 올바르게 무시합니다. #63270 (Shaun Struwig).
  • 적절한 경우 오류 코드 NUMBER_OF_ARGUMENTS_DOESNT_MATCH 대신 더 정확한 오류 코드를 사용하도록 변경했습니다. #63406 (Yohann Jardin).
  • 이제 clickhouse-client의 명령줄 자동 완성 제안용 쿼리에서 os_userclient_hostname이 올바르게 설정됩니다. 이로써 #63430이 해결되었습니다. #63433 (Alexey Milovidov).
  • max_block_size가 0인 경우 자동으로 기본값으로 보정합니다. #63587 (Antonio Andelic).
  • 바이너리 변경이 감지되면 자동으로 이름을 변경할 수 있도록 trace_logbuild_id ALIAS 컬럼을 추가합니다. 이는 #52086을 해결하기 위한 것입니다. #63656 (Zimu Li).
  • 객체 스토리지 디스크에서 TRUNCATE 작업을 사용할 수 있도록 했습니다. #63693 (MikhailBurdukov).
  • 키워드 목록 로딩은 이제 서버 리비전에 따라 결정되며, 구버전의 ClickHouse 서버에서는 비활성화됩니다. CC @azat. #63786 (Nikita Mikhaylov).
  • ClickHouse 디스크는 실제 메타데이터 포맷 버전을 확인하기 위해 서버 설정을 읽어야 합니다. #63831 (Sema Checherinda).
  • stdout가 TTY가 아닐 때 Pretty 형식 제한(output_format_pretty_max_rows/output_format_pretty_max_value_width)을 해제합니다. #63942 (Azat Khuzhin).
  • 이제 ClickHouse를 AWS Lambda 환경에서 사용할 때도 예외 처리가 작동합니다. 작성자: Alexey Coolnev. #64014 (Alexey Milovidov).
  • HTTP를 통해 전달된 잘못된 압축 데이터에 대해 CORRUPTED_DATA 대신 CANNOT_DECOMPRESS 예외를 발생시킵니다. #64036 (vdimir).
  • Pretty 형식의 단일 큰 숫자 표시가 이제 널 허용 및 LowCardinality에서도 작동합니다. 이로써 #61993가 해결되었습니다. #64084 (Alexey Milovidov).
  • 인덱스를 활용한 파트 필터링 시 메트릭, 로그 및 스레드 이름을 추가했습니다. #64130 (Alexey Milovidov).
  • ATTACH에서는 allow_suspicious_primary_key를 무시하고, ALTER에서는 검증합니다. #64202 (Azat Khuzhin).

빌드/테스트/패키징 개선

버그 수정

  • 기본적으로 enable_vertical_final 설정을 비활성화했습니다. 버그가 있으므로 이 기능은 사용하지 마십시오: #64543. #64544 (Alexander Tokmakov).
  • 여러 세그먼트를 사용할 때 백업 생성 시 발생하는 문제 수정 #57684 (Vitaly Baranov).
  • CREATE 쿼리의 컬럼 목록에서 MV 내부 테이블로 프로젝션/인덱스/기본 키(primary key)가 전달되지 않던 문제를 수정 #59183 (Azat Khuzhin).
  • boundRatio의 잘못된 머지 문제 수정 #60532 (Tao Wang).
  • const 저카디널리티 컬럼에서 일부 함수를 호출할 때 발생하는 크래시 수정 #61966 (Michael Kolupaev).
  • 테이블이 적응형 세분화 수준을 사용하지 않을 때 FINAL이 포함된 쿼리에서 잘못된 결과가 나오는 문제를 수정했습니다 #62432 (Duc Canh Le).
  • 메모리 컨트롤러의 cgroups v2 지원 감지 개선 #62903 (Robert Schulze).
  • 클라이언트에서 외부 테이블을 후속으로 사용할 때 발생하는 문제 수정 #62964 (Azat Khuzhin).
  • untuple 및 미해결 람다와 관련된 충돌을 수정했습니다 #63131 (Raúl Marín).
  • 서버가 연결을 너무 일찍 수신 대기하기 시작하는 문제를 수정했습니다 #63181 (alesapin).
  • DROP PART 명령 후 재시작할 때 발생하는 겹치는 파트 문제 수정 #63202 (Han Fei).
  • 시작 시 SQL security 기본값을 올바르게 로드하도록 수정 #63209 (pufit).
  • JOIN filter push down filter join 문제 수정 #63234 (Maksim Kita).
  • AzureObjectStorage::listObjects의 무한 루프를 수정 #63257 (Julia Kartseva).
  • CROSS join에서 join_algorithm 설정을 무시하던 문제 #63273 (vdimir).
  • WriteBufferToFileSegment 및 StatusFile의 finalize 문제를 수정했습니다 #63346 (vdimir).
  • 드문 경우 ALTER 후 SELECT 쿼리에서 발생하는 논리 오류 수정 #63353 (alesapin).
  • session_timezone에 맞게 X-ClickHouse-Timezone 헤더를 수정했습니다 #63377 (Andrey Zvonov).
  • grouping WITH ROLLUP과 LowCardinality 타입을 사용할 때 발생하는 디버그 assert를 수정했습니다. #63398 (Raúl Marín).
  • group_by_use_nulls 관련 소규모 수정 #63405 (vdimir).
  • 테이블 메타데이터에서 프로젝션이 제거되었지만 파트에 여전히 프로젝션이 남아 있는 경우, 프로젝션 파트의 백업/복원 문제 수정 #63426 (Kseniia Sumarokova).
  • mysql 딕셔너리 소스 문제 수정 #63481 (vdimir).
  • 데이터가 없을 때 AsyncInsertFlush에 QueryFinish 삽입 #63483 (Raúl Marín).
  • 수정: system.query_log의 used_dictionaries가 비어 있는 문제 #63487 (Eduard Karacharov).
  • MergeTreePrefetchedReadPool의 안전성 강화 #63513 (Antonio Andelic).
  • sentry가 활성화된 상태에서 종료 시 발생하는 충돌을 수정했습니다(openssl이 sentry보다 먼저 제거되어 발생) #63548 (Azat Khuzhin).
  • 키 기반 해싱의 배열 및 맵 지원 수정 #63628 (Salvatore Mesoraca).
  • Parquet 및 StorageMerge의 filter pushdown을 수정 #63642 (Michael Kolupaev).
  • Zookeeper 경로가 이미 존재하면 Replicated로 변환되지 않도록 방지 #63670 (Kirill).
  • 분석기: 뷰가 필요한 컬럼만 읽습니다 #63688 (Maksim Kita).
  • 분석기: WINDOW 재정의 금지 #63694 (Dmitry Novik).
  • 실험적인 복제된 데이터베이스에서 flatten_nested가 올바르게 동작하지 않았습니다. #63695 (Nikolai Kochetov).
  • 수정 #63653 #63722 (Nikolai Kochetov).
  • Array(Nothing)에서 Map(Nothing, Nothing)으로의 형 변환 허용 #63753 (Nikolai Kochetov).
  • partial_merge join에서 ILLEGAL_COLUMN 문제 수정 #63755 (vdimir).
  • 수정: 윈도우 함수 사용 시 불필요한 distinct 제거 #63776 (Igor Nikonov).
  • SYSTEM UNLOAD PRIMARY KEY 실행 시 발생할 수 있는 비정상 종료 문제 수정 #63778 (Raúl Marín).
  • 중복된 순환 별칭이 있는 쿼리 문제를 수정했습니다. #63791 (Nikolai Kochetov).
  • TokenIterator가 원래 의도대로 지연 방식으로 동작하도록 변경 #63801 (Alexey Milovidov).
  • endpoint_subpath S3 URI 설정을 추가했습니다 #63806 (Julia Kartseva).
  • ParallelReadBuffer의 교착 상태 수정 #63814 (Antonio Andelic).
  • JOIN filter push down의 동등 컬럼 관련 수정 #63819 (Maksim Kita).
  • Lazy 데이터베이스에서 DROP 후 모든 디스크에서 데이터를 삭제합니다. #63848 (MikhailBurdukov).
  • 병렬 레플리카와 새 분석기를 사용하는 MV에서 읽을 때 잘못된 결과가 반환되던 문제를 수정했습니다 #63861 (Nikita Taranov).
  • keeper-clientfind_super_nodesfind_big_family 명령 수정 사항 #63862 (Alexander Gololobov).
  • 람다 실행 이름 업데이트 #63864 (Nikolai Kochetov).
  • CPU/Real 프로파일러로 인한 SIGSEGV 수정 #63865 (Azat Khuzhin).
  • EXPLAIN CURRENT TRANSACTION 쿼리를 수정했습니다 #63926 (Anton Popov).
  • 분석기 수정: 끝도 없이 거북이뿐입니다… #63930 (Yakov Olkhovskiy).
  • plain_rewritable 디스크에서 특정 ALTER TABLE 명령 허용 #63933 (Julia Kartseva).
  • 재귀 CTE 분산 관련 수정 #63939 (Maksim Kita).
  • 분석기: COLUMNS 해석 문제를 수정했습니다 #63962 (Dmitry Novik).
  • 분석기에서 LIMIT BY 및 skip_unused_shards 지원 #63983 (Nikolai Kochetov).
  • 일부 자잘한 문제(실험적 Kusto) 수정 #63992 (Yong Wang).
  • 신뢰할 수 없는 바이너리 입력을 보다 안전하게 역직렬화합니다 #64024 (Robert Schulze).
  • MergeTree 엔진 계열이 아닌 테이블을 기반으로 하는 분산 테이블에서 final = 1 설정이 적용된 쿼리의 분석을 수정했습니다. #64037 (Nikolai Kochetov).
  • recoverLostReplica에 누락되어 있던 설정을 추가했습니다 #64040 (Raúl Marín).
  • 분석기에서 SQL security 액세스 검사를 수정했습니다 #64079 (pufit).
  • 분석기 수정: DAG에는 보간 표현식만 사용되도록 합니다 #64096 (Yakov Olkhovskiy).
  • Azure 백업에서 (네이티브가 아닌 복사 사례의 경우) max_upload_part_size 대신 1 MiB(읽기 버퍼 크기) 단위로 멀티파트 블록을 기록하던 문제를 수정했습니다 #64117 (Kseniia Sumarokova).
  • 백업 복사 시 올바르게 폴백되도록 수정 #64153 (Antonio Andelic).
  • materialized view로 CREATE TABLE할 때 발생하는 LOGICAL_ERROR를 방지 #64174 (Raúl Marín).
  • 쿼리 캐시: 서로 다른 데이터베이스에 대해 실행된 동일한 쿼리를 서로 다른 쿼리로 간주합니다 #64199 (Robert Schulze).
  • Keeper에서 text_log를 무시합니다 #64218 (Antonio Andelic).
  • 논리 오류 수정: prewhere가 있는 Buffer 테이블에서의 잘못된 형변환. #64388 (Nikolai Kochetov).

ClickHouse 릴리스 24.4, 2024-04-30. 발표, 동영상

업그레이드 참고 사항

  • clickhouse-odbc-bridgeclickhouse-library-bridge가 이제 별도 패키지로 분리되었습니다. 이 변경으로 #61677이 해결되었습니다. #62114 (Alexey Milovidov).
  • 의미가 없으므로 max_parallel_replicas(레플리카에서 실험적으로 병렬 읽기를 수행하기 위한 설정)를 0으로 설정할 수 없도록 변경했습니다. 이 변경으로 #60140이 해결되었습니다. #61201 (Kruglov Pavel).
  • 사용 중단된 LIVE VIEW 기능의 일부인 INSERT WATCH 쿼리 지원을 제거했습니다. #62382 (Alexey Milovidov).
  • optimize_monotonous_functions_in_order_by 설정을 제거했습니다. #63004 (Raúl Marín).
  • Replicated 데이터베이스 엔진에서 Experimental 태그를 제거했습니다. 이제 베타 단계입니다. #62937 (Justin de Guzman).

새 기능

  • 재귀 CTE를 지원합니다. #62074 (Maksim Kita).
  • QUALIFY 절을 지원합니다. #47819를 해결합니다. #62619 (Maksim Kita).
  • 이제 테이블 엔진에 권한을 부여할 수 있으며, 기존 사용자 동작에는 영향을 주지 않습니다. #60117 (jsc0218).
  • INSERT 작업을 지원하고 로컬에 메타데이터를 저장할 필요가 없는, 재기록 가능한 S3 디스크를 추가했습니다. #61116 (Julia Kartseva). 주된 사용 사례는 시스템 테이블입니다.
  • 클라이언트에서 입력하는 동안의 구문 강조 표시가 이제 구문 수준에서 동작합니다(이전에는 렉서 수준에서 동작했습니다). #62123 (Alexey Milovidov).
  • DROP TABLE a, b, c와 같이 여러 테이블을 동시에 삭제할 수 있도록 지원합니다. #58705 (zhongyuankai).
  • 이제 ALTER MODIFY SETTING을 통해 Memory 테이블 설정을 수정할 수 있습니다. 예시: ALTER TABLE memory MODIFY SETTING min_rows_to_keep = 100, max_rows_to_keep = 1000;. #62039 (zhongyuankai).
  • HTTP 인터페이스에 role 쿼리 매개변수를 추가했습니다. 이 매개변수는 SET ROLE x와 비슷하게 동작하며, SQL 문이 실행되기 전에 역할을 적용합니다. 이를 통해 여러 SQL 문을 허용하지 않아 SET ROLE x와 SQL 문 자체를 동시에 보낼 수 없는 HTTP 인터페이스의 제한을 우회할 수 있습니다. 이 방식으로 여러 역할을 설정할 수도 있습니다. 예를 들어 ?role=x&role=ySET ROLE x, y와 동일합니다. #62669 (Serge Klochkov).
  • 테이블의 프라이머리 키가 사용하는 메모리 사용량을 해제할 수 있도록 SYSTEM UNLOAD PRIMARY KEY를 추가했습니다. #62738 (Pablo Marcos).
  • system.text_logvalue1, value2, …, value10 컬럼을 추가했습니다. 이 컬럼에는 메시지 포맷에 사용된 값이 들어 있습니다. #59619 (Alexey Katsman).
  • 삽입 시 block 내에서 할당된 원래 행 번호를 저장하는 영구 가상 컬럼 _block_offset을 추가했습니다. _block_offset 컬럼의 영속성은 MergeTree 설정 enable_block_offset_column으로 활성화할 수 있습니다. part의 최소 block 번호 또는 mutation 버전을 포함하는 가상 컬럼 _part_data_version도 추가했습니다. 영구 가상 컬럼 _block_number는 더 이상 Experimental로 간주되지 않습니다. #60676 (Anton Popov).
  • input_format_json_throw_on_bad_escape_sequence 설정을 추가했습니다. 이 설정을 비활성화하면 JSON 입력 형식에서 잘못된 이스케이프 시퀀스를 저장할 수 있습니다. #61889 (Kruglov Pavel).

성능 개선

  • 동등한 Set을 활용한 JOIN filter push down 개선. #61216 (Maksim Kita).
  • JOIN 이후의 필터가 항상 기본값을 걸러내는 경우, OUTER JOIN을 INNER JOIN으로 변환하는 최적화가 적용됩니다. 이 최적화는 query_plan_convert_outer_join_to_inner_join 설정으로 제어할 수 있으며, 기본적으로 활성화되어 있습니다. #62907 (Maksim Kita).
  • AWS S3 개선. 클라이언트는 서버에 헤더 ‘Keep-Alive: timeout=X’를 전송해야 합니다. 클라이언트가 서버로부터 해당 헤더가 포함된 응답을 받으면 서버의 값을 사용해야 합니다. 또한 connection close 경쟁 상태를 방지하려면 만료가 임박한 connection은 사용하지 않는 것이 좋습니다. #62249 (Sema Checherinda).
  • SELECT 시 뮤테이션 오버헤드 감소 (v2). #60856 (Azat Khuzhin).
  • PODArray에서 자주 호출되는 함수들이 이제 강제로 인라인되도록 변경되었습니다. #61144 (李扬).
  • 필수 컬럼을 모두 읽은 뒤에는 객체의 나머지 부분을 스키핑하여 JSON 파싱 속도를 높였습니다. #62210 (lgbo).
  • file/s3/hdfs/url/… 테이블 함수에서 파일로부터 수행하는 단순한 insert select를 개선했습니다. 병렬 파싱에 사용되는 스레드 수를 제어할 수 있도록 별도의 max_parsing_threads 설정을 추가했습니다. #62404 (Kruglov Pavel).
  • 함수 to_utc_timestampfrom_utc_timestamp는 이제 약 2배 더 빠르게 동작합니다. #62583 (KevinyhZou).
  • 함수 parseDateTimeOrNull, parseDateTimeOrZero, parseDateTimeInJodaSyntaxOrNull, parseDateTimeInJodaSyntaxOrZero는 이제 입력에 파싱되지 않는 값이 대부분 포함되어 있을 때 훨씬 더 빠르게(10배~1000배) 실행됩니다. #62634 (LiuNeng).
  • system.query_cache에 대한 SELECT는 이제 쿼리 캐시에 엔트리가 매우 많을 때(예: 100,000개 초과) 눈에 띄게 더 빠르게 실행됩니다. #62671 (Robert Schulze).
  • 파일 시스템 캐시 경합 감소(3부): 공간 예약 시도 시 잠금 없이 파일 시스템에서 삭제를 수행합니다. #61163 (Kseniia Sumarokova).
  • 파일 시스템 캐시의 동적 크기 조정 속도를 개선했습니다. #61723 (Kseniia Sumarokova).
  • INVALIDATE_QUERY가 있는 딕셔너리 소스는 시작 시 두 번 로드되지 않습니다. #62050 (vdimir).
  • 프라이머리 키(primary key)가 포함된 불리언 표현식 뒤에 불필요한 = 1 또는 = 0이 추가되면, 프라이머리 인덱스를 사용할 수 있음에도 사용하지 않던 문제를 수정했습니다. 예를 들어 SELECT * FROM <table> WHERE <primary-key> IN (<value>) = 1SELECT * FROM <table> WHERE <primary-key> NOT IN (<value>) = 0는 모두 프라이머리 인덱스를 사용할 수 있는데도 전체 테이블 스캔을 수행했습니다. #62142 (josh-hildred).
  • 전체 결과를 하나의 큰 청크에 누적하는 대신 system.remote_data_paths에서 청크 스트림을 반환하도록 했습니다. 이렇게 하면 메모리 사용량을 줄이고, 중간 진행 상황을 표시하며, 쿼리를 취소할 수 있습니다. #62613 (Alexander Gololobov).

실험적 기능

  • azure_allow_parallel_part_upload 설정으로 제어되는 Azure Blob Storage용 병렬 쓰기 버퍼를 지원합니다. #62534 (SmitaRKulkarni).
  • 이제 사용자 공간 페이지 캐시가 정적 웹 스토리지(disk(type = web))에서도 작동합니다. 활성화하려면 클라이언트 설정 use_page_cache_for_disks_without_file_cache=1을 사용하세요. #61911 (Michael Kolupaev).
  • Variant 유형에서 Bool 및 숫자 variant를 의심스러운 것으로 취급하지 않습니다. #61999 (Kruglov Pavel).
  • 파싱을 사용해 String에서 Variant로의 변환을 개선했습니다. #62005 (Kruglov Pavel).
  • JSONExtract 함수에서 Variant를 지원합니다. #62014 (Kruglov Pavel).
  • Variant 유형을 비교 가능한 것으로 표시해 프라이머리 키(primary key)에서 사용할 수 있도록 했습니다. #62693 (Kruglov Pavel).

개선 사항

  • 편의를 위해 SELECT * FROM numbers() 는 제한 없이 SELECT * FROM system.numbers와 동일하게 동작합니다. #61969 (YenchangChan).
  • Kafka 구성에 consumer/producer 태그를 분리해 도입합니다. 이렇게 하면 consumer 속성이 producer 인스턴스에 지정되었거나 그 반대로 지정되었다는 librdkafka(버그가 많고 좋지 않은 C 라이브러리)의 경고를 방지할 수 있습니다(예: Configuration property session.timeout.ms is a consumer property and will be ignored by this producer instance). 해결: #58983. #58956 (Aleksandr Musorin).
  • 함수 date_diffage는 이제 결과를 마이크로초 정밀도 대신 나노초 정밀도로 계산합니다. 또한 이제 unit 매개변수에 사용할 수 있는 값으로 nanosecond(또는 nanoseconds 또는 ns)를 지원합니다. #61409 (Austin Kothig).
  • date_trunc에 나노초, 마이크로초, 밀리초 단위를 추가했습니다. #62335 (Misz606).
  • 인증서를 다시 로드할 때 인증서 체인도 다시 로드합니다. #61671 (Pervakov Grigorii).
  • 해당 레플리카 경로에 활성 레플리카가 있으면 테이블을 ATTACH할 수 없도록 하여 오류 #60432를 방지하도록 했습니다. #61876 (Arthur Passos).
  • clickhouse-local에서 input을 지원하도록 구현했습니다. #61923 (Azat Khuzhin).
  • ANY 엄격성을 사용하는 Join 테이블 엔진은 다시 로드한 후에도 일관성이 유지됩니다. 동일한 키를 가진 여러 행이 삽입되면 첫 번째 행의 우선순위가 더 높아집니다(이전에는 테이블 로딩 시 무작위로 선택되었습니다). 해결 #51027. #61972 (vdimir).
  • Apache Arrow 스키마에서 널 허용 컬럼 타입을 자동 추론합니다. #61984 (Maksim Kita).
  • 집계 중 aggregate states의 병렬 머지를 취소할 수 있도록 했습니다. 예시: uniqExact. #61992 (Maksim Kita).
  • 제안 항목을 채우는 데 system.keywords를 사용하고, 내부 전반에서도 이를 사용합니다. #62000 (Nikita Mikhaylov).
  • ReplicatedMergeTree에서 OPTIMIZE FINAL은 이제 현재 진행 중인 머지가 완료될 때까지 기다린 다음, 최종 머지를 다시 예약합니다. 이로써 일반적인 MergeTree 동작에 더 가까워집니다. #62067 (Nikita Taranov).
  • Hive Text File에서 데이터를 읽을 때 입력 필드 수를 조정하기 위해 첫 번째 줄을 사용했는데, 경우에 따라 첫 번째 줄의 필드 수가 정의된 Hive 테이블과 일치하지 않았습니다. 예를 들어 Hive 테이블이 test_tbl(a Int32, b Int32, c Int32)처럼 3개의 컬럼을 갖도록 정의되어 있지만 텍스트 파일의 첫 번째 줄에는 필드가 2개만 있을 수 있습니다. 이런 경우 입력 필드 수가 2개로 조정되며, 텍스트 파일의 다음 줄에 필드가 3개 있더라도 세 번째 필드는 읽히지 않고 기본값 0으로 설정되는데, 이는 올바르지 않습니다. #62086 (KevinyhZou).
  • CREATE AS는 테이블 comment를 복사합니다. #62117 (Pablo Marcos).
  • zookeeper 테이블에 쿼리 진행 정보가 추가되었습니다. #62152 (JackyWoo).
  • 서버 전역에서 trace collector(Real 및 CPU)를 활성화할 수 있는 기능이 추가되었습니다. #62189 (alesapin).
  • 설정 lightweight_deletes_sync를 추가했습니다(기본값: 2 - 모든 레플리카가 동기적으로 완료될 때까지 대기). 이 설정은 mutations_sync 설정과 유사하지만 경량한 삭제의 동작에만 영향을 줍니다. #62195 (Anton Popov).
  • 사용자 지정 설정 값을 파싱할 때 Bool과 정수를 구분합니다: SET custom_a = true; SET custom_b = 1;. #62206 (Vitaly Baranov).
  • AWS Private Link Interface 엔드포인트를 통한 S3 액세스를 지원합니다. #60021, #31074#53761을 해결합니다. #62208 (Arthur Passos).
  • clickhouse-client에서 UDF용 디렉터리가 없더라도 생성하지 않습니다. 이로써 #59597가 해결됩니다. #62366 (Alexey Milovidov).
  • 이제 쿼리 캐시는 시스템 테이블(system.*, information_schema.*, INFORMATION_SCHEMA.*)에 대한 쿼리의 결과를 더 이상 캐시하지 않습니다. #62376 (Robert Schulze).
  • MOVE PARTITION TO TABLE 쿼리는 파트 수 제한 초과를 방지하기 위해 지연될 수 있으며, TOO_MANY_PARTS 예외를 발생시킬 수도 있습니다. INSERT 쿼리와 동일한 설정 및 제한이 적용됩니다(max_parts_in_total, parts_to_delay_insert, parts_to_throw_insert, inactive_parts_to_throw_insert, inactive_parts_to_delay_insert, max_avg_part_size_for_too_many_parts, min_delay_to_insert_ms, max_delay_to_insert 설정 참조). #62420 (Sergei Trifonov).
  • macOS의 기본 설치 디렉터리를 /usr/bin에서 /usr/local/bin으로 변경했습니다. 이는 macOS El Capitan(2015)에서 도입된 Apple의 System Integrity Protection으로 인해 sudo를 사용하더라도 /usr/bin에 쓸 수 없기 때문입니다. #62489 (haohang).
  • transform이 항상 첫 번째 일치 항목을 반환하도록 변경했습니다. #62518 (Raúl Marín).
  • system table blob_storage_log에 누락되어 있던 hostname 컬럼을 추가했습니다. #62456 (Jayme Bird).
  • 다른 system tables와의 일관성을 위해 system.backup_log에 이제 event_time 컬럼이 추가되었습니다. #62541 (Jayme Bird).
  • 테이블 system.backup_log은 이제 다른 _log 테이블 엔진과 마찬가지로 event_date, event_time인 “default” 정렬 키를 사용합니다. #62667 (Nikita Mikhaylov).
  • RESTORE 실행 중 테이블 DEFAULT 표현식을 평가하지 않도록 했습니다. #62601 (Vitaly Baranov).
  • S3 스토리지와 백업에도 s3 disk와 같은 기본 keep alive 설정이 필요합니다. #62648 (Sema Checherinda).
  • 단일 테이블의 서로 다른 컨슈머가 남긴 로그 메시지를 구분할 수 있도록, 로그 메시지에 librdkafka(버그가 많은 것으로 악명 높은 그 C 라이브러리)의 클라이언트 식별자를 추가했습니다. #62813 (János Benjamin Antal).
  • 복제된 데이터베이스 ZooKeeper 경로에서 특수 매크로 {uuid}{database}를 허용합니다. #62818 (Vitaly Baranov).
  • HTTP 요청에서 인증 방식이 달라도 quota 키를 허용합니다. #62842 (Kseniia Sumarokova).
  • clickhouse clientclickhouse local에서 명령줄 인수 --help의 출력 상세 수준을 낮췄습니다. 이전 출력은 이제 --help --verbose로 생성됩니다. #62973 (Yarik Briukhovetskyi).
  • MySQL 8.3에서 log_bin_use_v1_row_events가 제거되어, 이에 맞게 실험적 MaterializedMySQL 엔진을 조정했습니다 #60479. #63101 (Eugene Klimov). 작성자: Nikolay Yankin.

빌드/테스트/패키징 개선

버그 수정 (공식 안정 릴리스에서 사용자에게 드러나는 오동작)

  • quorum 삽입 트랜잭션을 롤백할 때 발생하는 논리 오류를 수정했습니다. #61953 (Han Fei).
  • COUNT(*)와 FILTER 절을 함께 사용할 때 발생하는 파서 오류를 수정했습니다 #61357 (Duc Canh Le).
  • group_by_use_nulls + grouping sets + 분석기 + 구체화/상수 관련 논리 오류 수정 #61567 (Kruglov Pavel).
  • 이동된 파트를 제거하기 전에 머지를 취소합니다 #61610 (János Benjamin Antal).
  • Apache Arrow의 abort 문제 수정 #61720 (Kruglov Pavel).
  • 특정 디스크에 해당하는 올바른 경로에서 convert_to_replicated 플래그를 검색하도록 수정했습니다 #61769 (Kirill).
  • distributed_foreground_insert/distributed_background_insert_batch의 연결에서 발생할 수 있는 데이터 레이스 문제 수정 #61867 (Azat Khuzhin).
  • CANNOT_PARSE_ESCAPE_SEQUENCE 오류를 파싱 오류로 표시해 행 기반 입력 형식에서 건너뛸 수 있도록 개선 #61883 (Kruglov Pavel).
  • http_wait_end_of_query를 사용할 때 HTTP에서 예외 메시지가 출력 형식으로 기록되는 문제를 수정했습니다 #61951 (Kruglov Pavel).
  • JSONExtact 함수와 함께 사용할 때 발생하는 LowCardinality 문제를 올바르게 수정 #61957 (Nikita Mikhaylov).
  • Row Policy에 표현식이 없을 경우 Engine Merge 충돌 #61971 (Ilya Golshtein).
  • WriteBufferAzureBlobStorage 소멸자에서 발생하는 미처리 예외를 수정했습니다 #61988 (SmitaRKulkarni).
  • ReplicatedMergeTree에서 컬럼 정의 없는 CREATE TABLE 문제 수정 #62040 (Azat Khuzhin).
  • 복합 세그먼트 분할 키에서 optimize_skip_unused_shards_rewrite_in 관련 문제 수정 #62047 (Azat Khuzhin).
  • 리디렉션될 때 ReadWriteBufferFromHTTP가 올바른 Host 헤더를 설정하도록 수정했습니다 #62068 (Sema Checherinda).
  • 외부 테이블에서 Bool 데이터 타입을 파싱하지 못하던 문제 수정 #62115 (Duc Canh Le).
  • 분석기: 쿼리 매개변수 해석 관련 문제 수정 #62186 (Dmitry Novik).
  • 읽기 전용 상태에서의 파트 복원 문제 수정 #62207 (Vitaly Baranov).
  • SQL UDF가 포함된 인덱스 정의의 충돌 문제 수정 #62225 (vdimir).
  • 분석기에서 generateRandom의 NULL 랜덤 시드 문제를 수정했습니다. #62248 (Nikolai Kochetov).
  • Distinct Transfom에서 const 컬럼이 올바르게 처리되도록 수정 #62250 (Antonio Andelic).
  • FINAL 수정자를 사용하는 쿼리의 Parts Splitter 수정 #62268 (Nikita Taranov).
  • 분석기: 매개변수화된 뷰에 대한 별칭 해석 수정 #62274 (Dmitry Novik).
  • 분석기: 상위 스코프에서의 이름 해석 문제 수정 #62281 (Dmitry Novik).
  • 널 허용 네이티브가 아닌 숫자 컬럼의 argMax 수정 #62285 (Raúl Marín).
  • Ordinary 데이터베이스에서 materialized view의 BACKUP 및 RESTORE 문제 수정 #62295 (Vitaly Baranov).
  • Context의 스칼라 값에서 발생하던 데이터 레이스를 수정했습니다 #62305 (Kruglov Pavel).
  • materialized view의 primary key 수정 #62319 (Murat Khairulin).
  • 지원되지 않는 테이블에 대해서는 멀티스레드 삽입 파이프라인을 빌드하지 않음 #62333 (vdimir).
  • 분산 쿼리에서 위치 인수를 사용할 때 발생하는 분석기 문제 수정 #62362 (flynn).
  • 분석기에서 Merge 엔진의 additional_table_filters로부터의 filter pushdown 문제를 수정했습니다 #62398 (Kruglov Pavel).
  • 분석기에서 테이블 쿼리의 GLOBAL IN 문제를 수정했습니다. #62409 (Nikolai Kochetov).
  • 파티션별 쓰기 시 s3/hdfs/azure 엔진에서 설정 truncate_on_insert/create_new_file_on_insert를 준수하도록 수정 #62425 (Kruglov Pavel).
  • AzureBlobStorage용 Backup 복원 경로 수정 #62447 (SmitaRKulkarni).
  • SimpleSquashingChunksTransform 문제 수정 #62451 (Nikita Taranov).
  • 중첩 람다의 캡처 문제를 수정했습니다. #62462 (Nikolai Kochetov).
  • 재귀 타입이 포함된 protobuf를 읽을 때 충돌이 발생하지 않도록 개선했습니다 #62506 (Raúl Marín).
  • 파티션을 자기 자신으로 이동할 때 발생하던 버그를 수정했습니다 #62524 (helifu).
  • LIMIT의 스칼라 서브쿼리 수정 #62567 (Nikolai Kochetov).
  • 어차피 별로 권장하지도 않는 실험적이며 지원되지 않는 Hive 엔진의 세그폴트를 수정했습니다 #62578 (Nikolay Degterinsky).
  • groupArraySorted의 메모리 누수 문제를 수정했습니다 #62597 (Antonio Andelic).
  • largestTriangleThreeBuckets에서 발생하던 충돌 수정 #62646 (Raúl Marín).
  • 더 높은 해상도에서 tumble[Start,End] 및 hop[Start,End] 문제를 수정했습니다 #62705 (Jordi Villar).
  • argMin/argMax 콤비네이터 상태 수정 #62708 (Raúl Marín).
  • 캐시 잠금 경합 최적화로 인해 캐시의 임시 데이터 처리가 실패하던 문제를 수정했습니다 #62715 (Kseniia Sumarokova).
  • 함수 mergeTreeIndex에서 발생하던 충돌을 수정했습니다 #62762 (Anton Popov).
  • 수정: 업데이트: 중첩된 materialized 컬럼: 크기 검사 관련 수정 #62773 (Eliot Hautefeuille).
  • 분석기 사용 시 CTE에서 FINAL 수정자가 제대로 적용되지 않던 문제를 수정했습니다 #62811 (Duc Canh Le).
  • JSON 포맷과 HTTP 인터페이스 사용 시 formatRow 함수에서 발생하던 충돌 수정 #62840 (Anton Popov).
  • Azure: endpoint 객체로부터 최종 URL을 생성하는 문제 수정 #62850 (Daniel Pozo Escalona).
  • GCD 코덱 수정 #62853 (Nikita Taranov).
  • hyperrectangle의 LowCardinality(널 허용) 키 문제 수정 #62866 (Amos Bird).
  • 입력 값이 UInt32 범위를 초과할 때 Joda 문법의 fromUnixtimestamp를 수정 #62901 (KevinyhZou).
  • sum(nullable)에서 optimize_rewrite_aggregate_function_with_if를 비활성화합니다 #62912 (Raúl Marín).
  • 소스 테이블의 컬럼 타입이 서로 다른 경우 StorageBuffer의 PREWHERE를 수정했습니다. #62916 (Nikolai Kochetov).
  • cache의 임시 데이터에서 cache 키 디렉터리 생성 실패를 잘못 처리하던 문제 수정 #62925 (Kseniia Sumarokova).
  • gRPC: IPv6 피어 연결 시 발생하는 크래시 수정 #62978 (Konstantin Bogdanov).
  • 복제 fetch 중 발생할 수 있는 CHECKSUM_DOESNT_MATCH(및 기타 문제) 수정 #62987 (Azat Khuzhin).
  • 캐시의 임시 데이터에서 포착되지 않은 예외로 종료되던 문제를 수정했습니다 #62998 (Kseniia Sumarokova).
  • optimize_rewrite_aggregate_function_with_if의 암시적 CAST 문제 수정 #62999 (Raúl Marín).
  • ~RestorerFromBackup에서 처리되지 않은 예외를 수정 #63040 (Vitaly Baranov).
  • 보조 쿼리의 GROUP BY 키에서 server 상수를 제거하지 않도록 했습니다. #63047 (Nikolai Kochetov).
  • 함수 abs의 단조성에 대한 잘못된 판정 수정 #63097 (Duc Canh Le).
  • MongoDB 엔진의 SSL 핸드셰이크에 사용할 서버 이름 설정 #63122 (Alexander Gololobov).
  • MongoDB wire 프로토콜 버전 확인 시 “config” 대신 사용자 지정 DB를 사용하도록 변경 #63126 (Alexander Gololobov).

ClickHouse 릴리스 24.3 LTS, 2024-03-27. 발표 자료, 동영상

업그레이드 참고사항

  • allow_experimental_analyzer 설정은 기본적으로 활성화되어 있으며, 더 나은 호환성과 더 완전한 기능을 제공하는 새로운 구현으로 쿌리 분석을 전환합니다. “분석기” 기능은 이제 experimental이 아니라 베타로 간주됩니다. compatibility24.2로 설정하거나 allow_experimental_analyzer 설정을 비활성화하면 이전 동작으로 되돌릴 수 있습니다. YouTube 동영상을 시청하십시오.
  • ClickHouse는 일반적으로 UTF-8로 간주되는 String 데이터 타입에서 임의의 binary 데이터를 허용합니다. Parquet/ORC/Arrow의 String은 UTF-8만 지원합니다. 따라서 ClickHouse의 String 데이터 타입에 대해 Arrow의 어떤 데이터 타입을 사용할지, 즉 String 또는 Binary를 선택할 수 있습니다. 이는 output_format_parquet_string_as_string, output_format_orc_string_as_string, output_format_arrow_string_as_string 설정으로 제어됩니다. Binary가 더 정확하고 호환성 측면에서도 더 적합하지만, 대부분의 경우 기본값으로 String을 사용하면 사용자 기대에 더 잘 부합합니다. Parquet/ORC/Arrow는 lz4와 zstd를 포함한 다양한 압축 방식(Compression method)을 지원합니다. ClickHouse는 이러한 모든 압축 방식을 지원합니다. 일부 성능이 떨어지는 도구는 더 빠른 lz4 압축 방식을 지원하지 않으므로, 기본값으로 zstd를 설정했습니다. 이는 output_format_parquet_compression_method, output_format_orc_compression_method, output_format_arrow_compression_method 설정으로 제어됩니다. Parquet와 ORC의 기본값은 zstd로 변경했지만 Arrow는 변경하지 않았습니다(Arrow는 저수준 사용에 중점을 두고 있기 때문입니다). #61817 (Alexey Milovidov).
  • 새 ClickHouse 버전에서는 geoDistance, greatCircleDistance, greatCircleAngle 함수의 모든 인수가 Float64인 경우, 내부 계산과 반환 타입에 64비트 배정밀도 부동소수점 데이터 타입을 사용합니다. 이로써 #58476가 해결되었습니다. 이전 버전에서는 이 함수들이 항상 Float32를 사용했습니다. geo_distance_returns_float64_on_float64_argumentsfalse로 설정하거나 compatibility24.2 이하로 설정하면 이전 동작으로 전환할 수 있습니다. #61848 (Alexey Milovidov). Geet Patel과 공동 작성했습니다.
  • 더 이상 사용되지 않는 인메모리 데이터 파트는 23.5 버전부터 Deprecated 상태였고, 23.10 버전부터는 지원이 중단되었습니다. 이제 남아 있던 관련 코드도 제거되었습니다. #55186#45409의 후속 작업입니다. 인메모리 데이터 파트는 23.5 버전 이전에만 사용할 수 있었고, MergeTree 테이블에 해당 SETTINGS를 지정해 수동으로 활성화한 경우에만 사용 가능했으므로, 실제로 사용했을 가능성은 높지 않습니다. 인메모리 데이터 파트가 있는지 확인하려면 다음 쿼리를 실행하세요: SELECT part_type, count() FROM system.parts GROUP BY part_type ORDER BY part_type. 인메모리 데이터 파트 사용을 비활성화하려면 ALTER TABLE ... MODIFY SETTING min_bytes_for_compact_part = DEFAULT, min_rows_for_compact_part = DEFAULT를 실행하세요. 이전 ClickHouse 릴리스에서 업그레이드하기 전에 먼저 인메모리 데이터 파트가 없는지 확인하십시오. 인메모리 데이터 파트가 있다면 먼저 이를 비활성화하고, 인메모리 데이터 파트가 모두 없어질 때까지 기다린 다음 업그레이드를 계속하십시오. #61127 (Alexey Milovidov).
  • system.zookeeper 테이블에서 duration이 마이크로초 해상도임을 반영하여 컬럼 이름을 duration_ms에서 duration_microseconds로 변경했습니다. #60774 (Duc Canh Le).
  • 쿼리 수준 설정 async_insertdeduplicate_blocks_in_dependent_materialized_views가 함께 활성화된 경우 들어오는 INSERT 쿼리를 거부합니다. 이 동작은 throw_if_deduplication_in_dependent_materialized_views_enabled_with_async_insert 설정으로 제어되며, 기본적으로 활성화되어 있습니다. 이는 https://github.com/ClickHouse/ClickHouse/pull/59915의 차단을 해소하기 위해 필요한 https://github.com/ClickHouse/ClickHouse/pull/59699의 후속 작업입니다. #60888 (Nikita Mikhaylov).
  • 유틸리티 clickhouse-copier가 GitHub의 별도 리포지토리로 이동되었습니다: https://github.com/ClickHouse/copier. 더 이상 번들에 포함되지 않지만, 별도로 다운로드하여 계속 사용할 수 있습니다. 다음 이슈를 해결합니다: #60734 다음 이슈를 해결합니다: #60540 다음 이슈를 해결합니다: #60250 다음 이슈를 해결합니다: #52917 다음 이슈를 해결합니다: #51140 다음 이슈를 해결합니다: #47517 다음 이슈를 해결합니다: #47189 다음 이슈를 해결합니다: #46598 다음 이슈를 해결합니다: #40257 다음 이슈를 해결합니다: #36504 다음 이슈를 해결합니다: #35485 다음 이슈를 해결합니다: #33702 다음 이슈를 해결합니다: #26702.
  • MySQL과의 호환성을 높이기 위해 호환성 별칭 locate는 이제 기본적으로 (needle, haystack[, start_pos]) 순서의 인수를 받습니다. 이전 동작인 (haystack, needle[, start_pos])function_locate_has_mysql_compatible_argument_order = 0을 설정하여 복원할 수 있습니다. #61092 (Robert Schulze).
  • 기본적으로 MergeTree 테이블의 ORDER BY에서는 SimpleAggregateFunction을 사용할 수 없도록 합니다(AggregateFunction이 금지되는 것과 마찬가지로, 비교할 수 없기 때문에 금지됩니다). 허용하려면 allow_suspicious_primary_key를 사용하십시오. #61399 (Azat Khuzhin).
  • Ordinary 데이터베이스 엔진은 더 이상 사용이 권장되지 않습니다. 서버에서 이를 사용 중인 경우 clickhouse-client에 경고가 표시됩니다. 이로써 #52229가 해결되었습니다. #56942 (shabroo).

새로운 기능

  • 백업을 zip뿐 아니라 tar 형식으로도 읽고 쓸 수 있도록 지원합니다. #59535 (josh-hildred).
  • S3 Express 버킷 지원을 구현했습니다. #59965 (Nikita Taranov).
  • 다른 디스크의 파트를 ATTACH할 수 있도록 지원합니다(하드 링크 대신 복사를 사용). #60112 (Unalian).
  • 크기 제한이 있는 Memory 테이블을 추가했습니다. min_bytes_to_keep, max_bytes_to_keep, min_rows_to_keep, max_rows_to_keep 설정으로 제어합니다. #60612 (Jake Bamrah).
  • 대기 중인 쿼리 수와 실행 중인 쿼리 수에 별도의 제한을 적용합니다. async_load_databases로 인해 대기하는 쿼리 수를 제한하는 새로운 서버 설정 max_waiting_queries를 추가했습니다. 기존의 실행 중인 쿼리 수 제한에는 이제 대기 중인 쿼리가 포함되지 않습니다. #61053 (Sergei Trifonov).
  • parser의 모든 키워드를 포함하는 테이블 system.keywords를 추가했습니다. 주로 더 나은 퍼징과 구문 강조를 위해 필요하며, 해당 용도로 사용될 예정입니다. #51808 (Nikita Mikhaylov).
  • ATTACH PARTITION ALL 지원을 추가했습니다. #61107 (Kirill Nikiforov).
  • 새 함수 getClientHTTPHeader를 추가했습니다. 이로써 #54665가 해결되었습니다. @lingtaolf와 공동 작성했습니다. #61820 (Alexey Milovidov).
  • generate_series를 테이블 함수로 추가했습니다(기존 numbers 함수에 대한 PostgreSQL 호환 alias). 이 함수는 자연수의 등차수열로 이루어진 테이블을 생성합니다. #59390 (divanik).
  • 값의 개수와 오차를 반환하는 topK/topkWeighed 지원 모드를 추가했습니다. #54508 (UnamedRus).
  • DateTime 또는 DateTime64 유형 값에서 밀리초 component를 반환하는 함수 toMillisecond를 추가했습니다. #60281 (Shaun Struwig).
  • clickhouse-server에서 HTTP 리디렉션 handler를 구성할 수 있도록 지원합니다. 예를 들어 /를 Play UI로 리디렉션되도록 설정할 수 있습니다. #60390 (Alexey Milovidov).

성능 개선

  • 불필요하고 비용이 많이 드는 메모리 복사를 생략할 수 있도록 dotProduct 함수를 최적화했습니다. #60928 (Robert Schulze).
  • 256비트 정수 출력 속도가 30배 빨라졌습니다. #61100 (Raúl Marín).
  • 테이블의 기본 키(primary key)에 사실상 불필요한 컬럼이 대부분 포함되어 있다면, 이를 메모리에 유지하지 마십시오. 이는 기본값이 0.9인 새로운 설정 primary_key_ratio_of_unique_prefix_values_to_skip_suffix_columns으로 제어되며, 의미는 다음과 같습니다. 복합 기본 키에서 어떤 컬럼의 값이 전체 경우의 90% 이상에서 변경되면, 그 뒤의 컬럼들은 로드되지 않습니다. #60255 (Alexey Milovidov).
  • 여러 Nullable 컬럼이 포함된 경우 직렬화된 집계 메서드의 성능을 개선했습니다. #55809 (Amos Bird).
  • JSON 출력을 지연 생성해 ALL JOIN 성능을 개선합니다. #58278 (LiuNeng).
  • AWS S3와 같은 외부 서비스와의 HTTP/HTTPS 연결을 모든 사용 사례에서 재사용할 수 있도록 개선했습니다. 응답이 3xx 또는 4xx인 경우에도 마찬가지입니다. #58845 (Sema Checherinda).
  • 집계 함수 argMin / argMax / any / anyLast / anyHeavyORDER BY {u8/u16/u32/u64/i8/i16/u32/i64) LIMIT 1 쿼리가 개선되었습니다. #58640 (Raúl Marín).
  • 컬럼 필터에 대한 소규모 최적화입니다. 일부 경우 최대 메모리 사용량을 원래의 44% 수준까지 줄일 수 있습니다. #59698 (李扬).
  • 결과 유형의 내부 타입이 숫자인 경우 multiIf 함수를 열 지향 방식으로 실행합니다. #60384 (李扬).
  • 뮤텍스 성능이 향상되었습니다(거의 2배). #60823 (Azat Khuzhin).
  • 분산 쿼리가 종료될 때 여러 연결을 병렬로 정리합니다. #60845 (lizhuoyu5).
  • 널 허용 숫자형 또는 널 허용 문자열형의 컬럼 간 데이터 이동을 최적화해 일부 마이크로 벤치마크가 개선되었습니다. #60846 (李扬).
  • 파일 시스템 캐시 작업은 lock 경합의 영향을 덜 받습니다. #61066 (Alexey Milovidov).
  • 잘못된 컴파일러 최적화를 방지해 array join 및 기타 JOIN을 최적화했습니다. #61074를 해결했습니다. #61075 (李扬).
  • 구문 오류가 있는 쿼리에 정규식이 포함된 COLUMNS 매처가 있으면, 정규식은 한 번만 컴파일되는 대신 parser가 역추적하는 동안 매번 컴파일되었습니다. 이는 근본적인 오류였습니다. 컴파일된 정규식은 AST에 저장되었습니다. 하지만 AST의 A는 “abstract”를 의미하므로, 무거운 객체를 포함해서는 안 됩니다. AST의 일부는 parsing 중에 생성되었다가 버려질 수 있으며, 여기에는 대량의 역추적도 포함됩니다. 이로 인해 parsing 성능이 저하되고, 결과적으로 읽기 전용 사용자가 DoS를 일으킬 수 있게 됩니다. 하지만 가장 큰 문제는 이것이 퍼저의 진행을 막는다는 점입니다. #61543 (Alexey Milovidov).
  • 단일 값에 대한 IN 연산자를 최적화하는 새 분석기 패스를 추가했습니다. #61564 (LiuNeng).
  • DNSResolver는 AWS S3의 여러 엔드포인트를 고르게 활용할 수 있도록, 확인된 IP 집합의 순서를 섞습니다. #60965 (Sema Checherinda).

실험적 기능

  • Azure Blob Storage의 병렬 읽기를 지원합니다. 이를 통해 실험적 Azure 객체 스토리지의 성능이 향상됩니다. #61503 (SmitaRKulkarni).
  • S3와 유사한 Azure Blob Storage용 비동기 WriteBuffer를 추가합니다. 이를 통해 실험적 Azure 객체 스토리지의 성능이 향상됩니다. #59929 (SmitaRKulkarni).
  • Azure Blob Storage를 사용할 때 Backup IO에 관리형 아이덴티티를 사용합니다. 또한 존재하지 않는 컨테이너를 ClickHouse가 생성하려고 시도하지 않도록 하는 설정을 추가했습니다. 이러한 작업에는 스토리지 계정 수준의 권한이 필요합니다. #61785 (Daniel Pozo Escalona).
  • IN 절의 서브쿼리가 병렬 레플리카와 함께 동작할 수 있도록 하는 설정 parallel_replicas_allow_in_with_subquery = 1을 추가했습니다. #60950 (Nikolai Kochetov).
  • “zero-copy” 복제에 대한 변경 사항입니다. table이 삭제되면 해당 table과 관련된 모든 zero-copy 잠금도 함께 삭제되어야 합니다. 이 잠금이 들어 있는 디렉터리도 제거해야 합니다. #57575 (Sema Checherinda).

개선 사항

  • 기본 테이블 엔진으로 MergeTree를 사용하도록 합니다. #60524 (Alexey Milovidov)
  • 기본적으로 output_format_pretty_row_numbers를 활성화했습니다. 사용성이 더 좋아집니다. #61791 (Alexey Milovidov).
  • 이전 버전에서는 Pretty 형식의 일부 숫자 표시가 충분히 보기 좋지 않았습니다. #61794 (Alexey Milovidov).
  • Pretty 형식에서는 결과 집합에 값이 하나만 있는 경우(예: SHOW CREATE TABLE 쿼리 결과) 긴 값이 잘리지 않습니다. #61795 (Alexey Milovidov).
  • clickhouse-local과 마찬가지로 clickhouse-client에서도 --output-format 옵션을 --format 옵션의 동의어로 사용할 수 있습니다. 이로써 #59848가 해결되었습니다. #61797 (Alexey Milovidov).
  • stdout가 터미널이고 출력 형식이 지정되지 않은 경우, clickhouse-client와 유사한 도구는 대화형 모드와 마찬가지로 기본적으로 PrettyCompact를 사용합니다. clickhouse-clientclickhouse-local은 입력 및 출력 형식의 명령줄 인수를 일관된 방식으로 처리합니다. 이로써 #61272가 해결되었습니다. #61800 (Alexey Milovidov).
  • 가독성을 높이기 위해 Pretty 형식에서 숫자 그룹 사이를 밑줄로 구분합니다. 이는 새로운 설정 output_format_pretty_highlight_digit_groups로 제어됩니다. #61802 (Alexey Milovidov).
  • SYSTEM FLUSH DISTRIBUTED를 통해 초기 INSERT 설정을 재정의하는 기능이 추가되었습니다. #61832 (Azat Khuzhin).
  • 정렬, 집계 등의 processor 프로파일링(소요 시간, 입출력 바이트)을 기본으로 활성화합니다. #61096 (Azat Khuzhin).
  • Filesystem 데이터베이스에서 포맷 확장자가 없는 파일도 지원합니다. #60795 (Kruglov Pavel).
  • 모든 포맷 이름이 대소문자를 구분하지 않도록 변경했습니다. 예를 들어 Tsv, TSV, tsv, 심지어 rowbinary도 모두 사용할 수 있습니다. #60420 (豪肥肥). 예를 들어 JSON 😇처럼 계속 올바르게 표기해 주시면 감사하겠습니다. 다만 Json 🤮처럼 표기하셔도 문제 삼지는 않습니다.
  • distributed_ddl_output_mode 설정에 none_only_active 모드가 추가되었습니다. #60340 (Alexander Tokmakov).
  • Advanced dashboard에서 다중 선 그래프의 색상이 약간 더 개선되었습니다. #60391 (Alexey Milovidov).
  • 이제 Advanced dashboard에서 스크롤하는 동안에도 컨트롤이 항상 표시됩니다. 따라서 위로 스크롤하지 않고도 새 차트를 추가할 수 있습니다. #60692 (Alexey Milovidov).
  • materialized view에 대해 MODIFY COLUMN 쿼리를 실행할 때 모든 컬럼이 존재하는지 확인하기 위해 내부 테이블 구조를 검사합니다. #47427 (sunny).
  • String 타입과 Enum은 배열, UNION 쿼리, 조건부 표현식 등 동일한 컨텍스트에서 함께 사용할 수 있습니다. 이 변경으로 #60726가 해결되었습니다. #60727 (Alexey Milovidov).
  • 쿼리 처리를 위해 외부 데이터 구조에서 Enum을 선언할 수 있도록 지원합니다(이는 쿼리에 제공할 수 있는 즉시 생성 임시 테이블입니다). #57857 (Duc Canh Le).
  • 머지할 파트를 선택할 때 경량한 삭제가 적용된 행도 고려하여, 결과 파트의 디스크 크기를 더 정확하게 추정할 수 있도록 했습니다. #58223 (Zhuo Qiu).
  • 더 많은 시스템 테이블에 컬럼 설명이 추가되었습니다. https://github.com/ClickHouse/ClickHouse/pull/58356의 후속 작업입니다. #59016 (Nikita Mikhaylov).
  • 이제 PREWHERE에서 가상 컬럼(virtual columns)을 사용할 수 있습니다. _part_offset와 같은 non-const 가상 컬럼에 특히 유용합니다. #59033 (Amos Bird). 가상 컬럼의 전반적인 사용성이 개선되었습니다. 이제 PREWHERE에서 가상 컬럼을 사용할 수 있으며(_part_offset와 같은 non-const 가상 컬럼에 특히 유용합니다), describe_include_virtual_columns 설정이 활성화된 경우 DESCRIBE 쿼리에서 컬럼 주석(comment)으로 가상 컬럼에 대한 내장 문서를 확인할 수 있습니다. #60205 (Anton Popov).
  • 상수 키를 사용하는 대신, 이제 객체 스토리지에서는 객체 삭제 가능 여부를 판단하기 위한 키를 생성합니다. #59495 (Sema Checherinda).
  • “local_blob_storage” 대신 객체 스토리지 유형으로 “local”을 사용할 수 있습니다. #60165 (Kseniia Sumarokova).
  • DETACH/서버 종료 시 및 SYSTEM FLUSH DISTRIBUTED에서 Distributed 엔진의 대기 중인 INSERT 블록을 병렬로 플러시합니다(병렬 처리는 테이블에 다중 디스크 정책이 있을 때만 작동하며, 현재는 Distributed 엔진의 모든 항목이 그렇습니다). #60225 (Azat Khuzhin).
  • 머지 시 리드스루 캐시를 강제하는 설정이 추가되었습니다. #60308 (Kseniia Sumarokova).
  • MySQL 호환성 프로토콜이 개선되었습니다. 이슈 #57598에서는 트랜잭션 처리와 관련된 동작 차이를 언급합니다. 활성 트랜잭션이 없을 때 COMMIT/ROLLBACK을 실행하면 MySQL의 동작과 달리 오류로 보고됩니다. #60338 (PapaToemmsn).
  • substring 함수에 새 alias byteSlice가 추가되었습니다. #60494 (Robert Schulze).
  • 모호함을 줄이기 위해 서버 설정 dns_cache_max_size의 이름을 dns_cache_max_entries로 변경했습니다. #60500 (Kirill Nikiforov).
  • SHOW INDEX | INDEXES | INDICES | KEYS는 더 이상 기본 키 컬럼 기준으로 정렬되지 않습니다(직관적이지 않았기 때문입니다). #60514 (Robert Schulze).
  • Keeper 개선: 데이터 손실을 방지하기 위해 시작 시 유효하지 않은 스냅샷이 감지되면 중단하도록 개선했습니다. #60537 (Antonio Andelic).
  • tzdata를 2024a로 업데이트했습니다. #60768 (Raúl Marín).
  • Keeper 개선: Keeper 설정에 leadership_expiry_ms 지원을 추가했습니다. #60806 (Brokenice0415).
  • 설정 input_format_try_infer_exponent_floats와 관계없이 JSON 포맷에서 지수 표기 숫자를 항상 추론합니다. JSON 객체에서 이름이 지정된 Tuple을 추론할 때, 예외를 발생시키는 대신 모호한 경로에 String 유형을 사용할 수 있도록 하는 설정 input_format_json_use_string_type_for_ambiguous_paths_in_named_tuples_inference_from_objects를 추가했습니다. #60808 (Kruglov Pavel).
  • MySQL 구문에서 일반적으로 사용되는 START TRANSACTION 구문 지원을 추가하여 https://github.com/ClickHouse/ClickHouse/discussions/60865를 해결했습니다. #60886 (Zach Naimon).
  • full-sorting 머지 조인 알고리즘에서 NULL을 가장 큰값/가장 작은값으로 처리할 수 있는 플래그를 추가했습니다. 이를 통해 Apache Spark와 같은 다른 SQL 시스템과 호환되는 동작을 할 수 있습니다. #60896 (loudongfeng).
  • clickhouse-clientclickhouse-local에서 파일 확장자를 기반으로 출력 형식을 감지할 수 있도록 지원합니다. #61036 (豪肥肥).
  • Linux의 CGroups 값이 변경되었을 때 런타임의 메모리 제한을 업데이트합니다. #61049 (Han Fei).
  • 실수로 누락된 함수 toUInt128OrZero를 추가했습니다(이 실수는 https://github.com/ClickHouse/ClickHouse/pull/945와 관련이 있습니다). 호환성 별칭 FROM_UNIXTIMEDATE_FORMAT은(SQL 호환성 별칭에 기대되는 대로) 대소문자를 구분하지 않도록 변경되었습니다(이들은 ClickHouse 네이티브가 아니며 MySQL 호환성을 위해서만 존재합니다). #61114 (Alexey Milovidov).
  • 액세스 검사가 개선되어, 대상 사용자가 해당 권한을 회수할 수 있는 권한 부여를 갖고 있지 않은 경우에도 보유하지 않은 권한을 회수할 수 있게 되었습니다. 예시: GRANT SELECT ON *.* TO user1; REVOKE SELECT ON system.* FROM user1;. #61115 (pufit).
  • Nullable 컬럼의 has() 함수 관련 문제를 수정했습니다(#60214 해결). #61249 (Mikhail Koviazin).
  • 이제 하위 트리 <include from_zk="/path" merge="true">의 구성 substitutions에서 속성 merge="true"를 지정할 수 있습니다. 이 속성을 지정하면 ClickHouse가 하위 트리를 기존 구성과 머지하며, 그렇지 않으면 기본적으로 새 내용을 구성에 추가합니다. #61299 (alesapin).
  • 가상 메모리 매핑용 비동기 메트릭 VMMaxMapCountVMNumMaps를 추가합니다. #60662를 해결합니다. #61354 (Tuan Pham Anh).
  • 임시 데이터를 생성하는 모든 경우에 temporary_files_codec 설정이 사용되도록 변경했습니다. 예를 들어 외부 메모리 정렬과 외부 메모리 GROUP BY가 여기에 해당합니다. 이전에는 partial_merge JOIN 알고리즘에서만 작동했습니다. #61456 (Maksim Kita).
  • 쿼리 파싱의 복잡도를 제한할 수 있는 새로운 설정 max_parser_backtracks를 추가했습니다. #61502 (Alexey Milovidov).
  • 파일 시스템 캐시를 동적으로 크기 조정하는 동안의 경합이 감소했습니다. #61524 (Kseniia Sumarokova).
  • 향후 재작성될 예정이므로 StorageS3 큐의 세그먼트 모드를 허용하지 않습니다. #61537 (Kseniia Sumarokova).
  • 오타를 use_leagcy_max_level에서 use_legacy_max_level로 수정했습니다. #61545 (William Schoeffel).
  • system.blob_storage_log에서 일부 중복된 항목을 제거했습니다. #61622 (YenchangChan).
  • MySQL과의 호환성을 위한 별칭으로 current_user 함수를 추가했습니다. #61770 (Yarik Briukhovetskyi).
  • 혼합 x86-64 / ARM 클러스터에서 일관되지 않던 부동소수점 집계 함수 상태 수정 #60610 (Harry Lee).

빌드/테스트/패키징 개선

  • 이제 실시간 쿼리 프로파일러가 AArch64에서도 작동합니다. 이전 버전에서는 프로그램이 syscall 내부에서 시간을 보내지 않을 때만 작동했습니다. #60807 (Alexey Milovidov).
  • Docker 레이블에 ClickHouse 버전이 추가되었습니다. #54224가 해결되었습니다. #60949 (Nikolay Monkov).
  • prqlc를 0.11.3으로 업그레이드했습니다. #60616 (Maximilian Roos).
  • clickhouse-local에 범용 쿼리 텍스트 퍼저를 추가했습니다. #61508 (Alexey Milovidov).

버그 수정(공식 안정 릴리스에서 사용자에게 드러나는 오동작)

  • MergeTree의 finished_mutations_to_keep=0 문제를 수정했습니다(문서에는 0이 모두 유지됨을 의미한다고 되어 있습니다) #60031 (Azat Khuzhin).
  • FINAL 최적화에 문제가 있었습니다. 작성자는 이를 다음과 같이 설명합니다: “같은 파트에 대한 PartsSplitter의 잘못된 범위”. #60041 (Maksim Kita).
  • 실험적이며 지원되지 않는 Apache Hive에 문제가 있었습니다. #60262 (shanfengp).
  • 실험적 병렬 레플리카 개선: 병렬 레플리카가 변경되면 재분석을 강제하도록 개선했습니다 #60362 (Raúl Marín).
  • 새 disks 구성 옵션에서 일반 메타데이터 유형을 사용하는 문제 수정 #60396 (Kseniia Sumarokova).
  • mapContainsKeyLike의 논리 오류 ‘타입이 호환되지 않아 컬럼을 캡처할 수 없습니다’ 수정 시도 #60451 (Kruglov Pavel).
  • CREATE TABLE에서 스칼라 서브쿼리를 계산하지 않도록 했습니다. #60464 (Nikolai Kochetov).
  • 오류로 인해 많은 행이 건너뛰어지는 경우 병렬 parsing에서 발생하는 데드락을 수정했습니다 #60516 (Kruglov Pavel).
  • 실험적 KQL(Kusto) 지원에 문제가 있어 max_query_size_for_kql_compound_operator를 수정했습니다: #60534 (Yong Wang).
  • Keeper 수정: 커밋 로그를 기다릴 때 타임아웃 추가 #60544 (Antonio Andelic).
  • 날짜 타입에는 숫자 팁을 출력하지 않음 #60577 (Raúl Marín).
  • filter에 비결정적 함수가 있을 때 MergeTree에서 읽는 문제를 수정 #60586 (Kruglov Pavel).
  • compatibility setting 값 유형이 잘못되었을 때 발생하는 논리 오류를 수정했습니다 #60596 (Kruglov Pavel).
  • 수정(prql): 더욱 안정적인 패닉 처리기 #60615 (Maximilian Roos).
  • Decimal 및 날짜 인수에 대한 intDiv 수정 #60672 (Yarik Briukhovetskyi).
  • 수정: alter modify 쿼리에서 CTE 확장 처리 #60682 (Yakov Olkhovskiy).
  • non-Atomic/Ordinary 데이터베이스 엔진(즉, Memory)용 system.parts 수정 #60689 (Azat Khuzhin).
  • 매개변수화된 뷰에서 “Invalid storage definition in metadata file” 오류를 수정했습니다 #60708 (Azat Khuzhin).
  • CompressionCodecMultiple의 버퍼 오버플로우 문제를 수정했습니다 #60731 (Alexey Milovidov).
  • SQL/JSON의 불필요한 요소 제거 #60738 (Alexey Milovidov).
  • 집계 함수 quantileGK의 잘못된 assertion 제거 #60740 (李扬).
  • streams를 1로 설정하여 insert-select + insert_deduplication_token 버그를 수정 #60745 (Jordi Villar).
  • 지원되지 않는 멀티파트 업로드 작업에서는 사용자 지정 메타데이터 헤더를 설정할 수 없도록 했습니다 #60748 (Francisco J. Jurado Moreno).
  • toStartOfInterval 문제 수정 #60763 (Andrey Zvonov).
  • arrayEnumerateRanked에서 발생하던 충돌을 수정했습니다 #60764 (Raúl Marín).
  • INSERT SELECT JOIN에서 input() 사용 시 발생하던 충돌을 수정했습니다 #60765 (Kruglov Pavel).
  • 서브쿼리에서 allow_experimental_analyzer 값이 서로 다를 때 발생하던 비정상 종료 수정 #60770 (Dmitry Novik).
  • S3에서 읽을 때 재귀 처리를 제거했습니다 #60849 (Antonio Andelic).
  • HashedDictionaryParallelLoader에서 오류 발생 시 멈춰 있을 수 있는 문제를 수정했습니다 #60926 (vdimir).
  • 복제된 데이터베이스의 비동기 RESTORE(실험적 기능) 문제 수정 #60934 (Antonio Andelic).
  • 네이티브 프로토콜을 통해 Log 테이블에 async 삽입하는 과정에서 발생하는 교착 상태를 수정 #61055 (Anton Popov).
  • RangeHashedDictionary에서 dictGetOrDefault의 기본 인수에 대한 지연 실행 문제를 수정했습니다 #61196 (Kruglov Pavel).
  • groupArraySorted의 여러 버그를 수정 #61203 (Raúl Marín).
  • 독립 실행형 바이너리에서 Keeper 재구성 문제를 수정 #61233 (Antonio Andelic).
  • S3 engine에서 session_token 사용 문제 수정 #61234 (Kruglov Pavel).
  • 집계 함수 uniqExact가 잘못된 결과를 반환할 수 있는 문제를 수정했습니다 #61257 (Anton Popov).
  • show database 관련 버그를 수정했습니다 #61269 (Raúl Marín).
  • RabbitMQ 스토리지에서 MATERIALIZED 컬럼 관련 논리 오류 수정 #61320 (vdimir).
  • CREATE OR REPLACE DICTIONARY 관련 문제 수정 #61356 (Vitaly Baranov).
  • external ON CLUSTER가 포함된 ATTACH 쿼리를 수정했습니다 #61365 (Nikolay Degterinsky).
  • 널 허용 키의 연속 키 최적화 문제를 수정했습니다 #61393 (Anton Popov).
  • actions DAG split 관련 문제 수정 #61458 (Raúl Marín).
  • 실패한 RESTORE를 완료할 때 발생하는 문제 수정 #61466 (Vitaly Baranov).
  • 호환성 설정에서 async_insert_use_adaptive_busy_timeout를 올바르게 비활성화합니다 #61468 (Raúl Marín).
  • 복원 풀에서 대기열 사용 허용 #61475 (Nikita Taranov).
  • UUID를 사용해 system.parts를 읽을 때의 불일치를 수정했습니다. #61479 (Dan Wu).
  • ALTER QUERY MODIFY SQL SECURITY 관련 문제 수정 #61480 (pufit).
  • 윈도우 뷰(window view) 실험 기능에서 발생하던 충돌을 수정했습니다 #61526 (Alexey Milovidov).
  • 네이티브가 아닌 정수형에서 repeat 수정 #61527 (Antonio Andelic).
  • 클라이언트의 -s 인수를 수정했습니다 #61530 (Mikhail f. Shiryaev).
  • arrayPartialReverseSort에서 발생하는 충돌 수정 #61539 (Raúl Marín).
  • const 위치를 사용하는 문자열 검색 문제 수정 #61547 (Antonio Andelic).
  • DateTime64와 함께 사용할 때 addDays에서 오류가 발생하던 문제를 수정했습니다 #61561 (Shuai li).
  • JSONExtract에서 LowCardinality 입력 유형을 허용하지 않도록 변경 #61617 (Julia Kartseva).
  • 중복 제거가 적용된 async insert의 system.part_log 문제 수정 #61620 (Antonio Andelic).
  • system.parts 관련 Non-ready set 예외를 수정했습니다. #61666 (Nikolai Kochetov).
  • REPLACE_RANGE의 actual_part_name을 수정 (Entry actual part isn't empty yet) #61675 (Alexander Tokmakov).
  • 잘못된 UTF-8로 인해 발생한 multiSearchAllPositionsCaseInsensitiveUTF8의 sanitizer 보고 문제를 수정했습니다 #61749 (pufit).
  • 널 허용 컬럼에서 RANGE frame을 지원하지 않던 문제를 수정했습니다. #61766 (YuanLiu).

ClickHouse 릴리스 24.2, 2024-02-29. 발표 자료, 동영상

하위 호환되지 않는 변경 사항

  • 중첩 타입에서 의심스럽거나 실험적(Experimental)인 타입을 검증하도록 변경했습니다. 이전에는 Array/Tuple/Map 같은 중첩 타입 안에서 이러한 타입을 검증하지 않았습니다(JSON 제외). #59385 (Kruglov Pavel).
  • 스레드 수와 블록 크기에 대한 sanity check를 추가했습니다. #60138 (Raúl Marín).
  • 기본적으로 지수 표기법의 부동소수점을 추론하지 않도록 변경했습니다. 이전 동작을 복원하는 설정인 input_format_try_infer_exponent_floats를 추가했습니다(기본적으로 비활성화). #59476을 해결합니다. #59500 (Kruglov Pavel).
  • alter 연산을 괄호로 감쌀 수 있도록 했습니다. 괄호 출력은 format_alter_operations_with_parentheses 설정으로 제어할 수 있습니다. 기본적으로는 일부 위치에서 포맷된 alter 연산을 메타데이터로 저장하므로(예: 뮤테이션) 포맷된 쿼리에 괄호가 출력됩니다. 새 구문은 alter 연산이 목록으로 끝나는 일부 쿼리를 더 명확하게 보여줍니다. 예를 들어 ALTER TABLE x MODIFY TTL date GROUP BY a, b, DROP COLUMN c는 기존 구문으로는 올바르게 파싱할 수 없습니다. 새 구문에서는 ALTER TABLE x (MODIFY TTL date GROUP BY a, b), (DROP COLUMN c) 쿼리의 의미가 분명합니다. 이전 버전은 새 구문을 읽을 수 없으므로, 하나의 cluster에서 최신 버전과 이전 버전의 ClickHouse를 함께 사용하는 경우 새 구문 사용 시 문제가 발생할 수 있습니다. #59532 (János Benjamin Antal).
  • materialized view 보안 문제를 수정했습니다. 이 문제로 인해 필요한 권한 없이도 사용자가 테이블에 삽입할 수 있었습니다. 이번 수정에서는 사용자가 materialized view뿐 아니라 그 기반이 되는 모든 테이블에도 삽입 권한이 있는지 검증합니다. 따라서 이전에는 동작하던 일부 쿼리가 이제 Not enough privileges 오류로 실패할 수 있습니다. 이 문제를 해결하기 위해 이번 릴리스에서는 뷰를 위한 SQL security의 새 기능을 도입합니다 https://clickhouse.com/docs/sql-reference/statements/create/view#sql&#95;security. #54901 #60439 (pufit).

새로운 기능

  • view/materialized view에서 definer USER를 지정할 수 있는 새 구문이 추가되었습니다. 이를 통해 기반 테이블에 대한 명시적인 권한 부여 없이도 view에서 SELECT/INSERT를 실행할 수 있습니다. 즉, View가 권한을 캡슐화합니다. #54901 #60439 (pufit).
  • file/s3/hdfs/url/azureBlobStorage 엔진에서 스키마 추론 시 파일 포맷을 알 수 없으면 자동으로 감지하도록 개선했습니다. #50576을 해결합니다. #59092 (Kruglov Pavel).
  • 비동기 삽입 timeout 자동 조정을 구현했습니다. 다음 설정이 도입되었습니다: async_insert_poll_timeout_ms, async_insert_use_adaptive_busy_timeout, async_insert_busy_timeout_min_ms, async_insert_busy_timeout_max_ms, async_insert_busy_timeout_increase_rate, async_insert_busy_timeout_decrease_rate. #58486 (Julia Kartseva).
  • 최대 연속 로그인 실패 횟수에 대한 쿼터를 설정할 수 있도록 했습니다. #54737 (Alexey Gerasimchuck).
  • 새 집계 함수 groupArrayIntersect가 추가되었습니다. 관련 이슈: #49862. #59598 (Yarik Briukhovetskyi).
  • AzureBlobStorage에 대한 Backup 및 복원 지원이 추가되었습니다. #50747을 해결합니다. #56988 (SmitaRKulkarni).
  • 이제 쿼리에서 format_template_row 대신 format_schema_rows_template를 사용해 템플릿 문자열을 직접 지정할 수 있습니다. #31363를 해결했습니다. #59088 (Shaun Struwig).
  • 서로 다른 종류의 MergeTree 테이블을 복제된 엔진으로 자동 변환하는 기능이 구현되었습니다. 테이블의 데이터 디렉터리(/clickhouse/store/xxx/xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy/)에 비어 있는 convert_to_replicated 파일을 생성하면 다음 서버 시작 시 해당 테이블이 자동으로 변환됩니다. #57798 (Kirill).
  • 빈 파티션과 관련된 ZooKeeper 노드를 제거하는 쿼리 ALTER TABLE table FORGET PARTITION partition이 추가되었습니다. #59507 (Sergei Trifonov). 이 기능은 전문가용 기능입니다.
  • NATS 테이블 엔진에서 JWT 자격 증명 파일을 지원합니다. #59543 (Nickolaj Jepsen).
  • DNS 문제 디버깅에 유용한 system.dns_cache 테이블이 구현되었습니다. #59856 (Kirill Nikiforov).
  • 코덱 LZ4HC는 새 레벨 2를 지원하며, 압축률이 다소 낮아지는 대신 기존 최소 레벨 3보다 더 빠릅니다. 이전 버전에서는 LZ4HC(2) 이하는 LZ4HC(3)와 동일하게 처리되었습니다. 작성자: Cyan4973. #60090 (Alexey Milovidov).
  • DNS 문제 디버깅에 유용한 system.dns_cache 테이블을 구현했습니다. 새로운 서버 설정 dns_cache_max_size가 추가되었습니다. #60257 (Kirill Nikiforov).
  • merge 테이블 함수에서 merge(['db_name', ] 'tables_regexp') 형태의 단일 인수 버전을 지원합니다. #60372 (豪肥肥).
  • 음수 위치 인수를 지원합니다. #57736을 종료합니다. #58292 (flynn).
  • config에서 user 키를 사용해 특정 S3 설정별로 허용된 사용자 집합을 지정할 수 있도록 지원합니다. #60144 (Antonio Andelic).
  • 테이블 함수 mergeTreeIndex가 추가되었습니다. 이 함수는 MergeTree 테이블의 인덱스 및 마크 파일 내용을 나타냅니다. 내부 검사에 사용할 수 있습니다. 구문: mergeTreeIndex(database, table, [with_marks = true]) 여기서 database.tableMergeTree 엔진을 사용하는 기존 테이블입니다. #58140 (Anton Popov).

실험적 기능

  • Tukey’s fences 알고리즘을 사용해 series data의 이상치를 탐지하는 함수 seriesOutliersDetectTukey를 추가했습니다. #58632 (Bhavna Jindal). 다음 패치 릴리스에서 동작이 변경될 예정이므로 유의하십시오.
  • 각 행에 대해 variant type name이 포함된 Enum을 반환하는 함수 variantType를 추가했습니다. #59398 (Kruglov Pavel).
  • 병렬 레플리카(분석기 사용 시에만)에서 LEFT JOIN, ALL INNER JOIN, 그리고 단순한 서브쿼리를 지원합니다. 새로운 설정 parallel_replicas_prefer_local_join은 로컬 JOIN 실행(기본값)과 GLOBAL JOIN 중 어느 방식을 사용할지 선택합니다. 모든 테이블은 cluster_for_parallel_replicas의 모든 레플리카에 존재해야 합니다. 새로운 설정 min_external_table_block_size_rowsmin_external_table_block_size_bytes는 임시 테이블로 전송되는 작은 블록을 더 큰 블록으로 합치는 데 사용됩니다(분석기 사용 시에만). #58916 (Nikolai Kochetov).
  • 새 레플리카를 추가하거나 복구하는 동안 Replicated 데이터베이스에서 테이블을 동시에 생성할 수 있도록 허용합니다. #59277 (Konstantin Bogdanov).
  • Variant 값에 대한 비교 연산자와 Variant 컬럼에 Field를 올바르게 삽입하는 기능을 구현했습니다. 기본적으로는 유사한 variant 타입으로 Variant 타입을 생성할 수 없으며, 설정 allow_suspicious_variant_types를 사용하면 허용할 수 있습니다. #59996를 해결했습니다. #59850를 해결했습니다. #60198 (Kruglov Pavel).
  • CTE와 함께 사용하는 병렬 레플리카 JOIN을 비활성화했습니다(분석기 미사용 시). #59239 (Raúl Marín).

성능 개선

  • 기본 키(primary key)의 메모리 사용량이 줄어듭니다. #60049 (Alexey Milovidov).
  • 기본 키(primary key) 및 일부 기타 작업의 메모리 사용량을 개선했습니다. #60050 (Alexey Milovidov).
  • 테이블의 프라이머리 키(primary key)는 처음 접근할 때 메모리에 지연 로드됩니다. 이는 기본적으로 활성화되어 있는 새로운 MergeTree setting primary_key_lazy_load로 제어됩니다. 이 방식에는 여러 장점이 있습니다: - 사용되지 않는 테이블에는 로드되지 않습니다; - 메모리가 충분하지 않은 경우, server 시작 시점이 아니라 처음 사용할 때 예외가 발생합니다. 반면 몇 가지 단점도 있습니다: - 프라이머리 키 로드에 따른 지연 시간은 연결을 수락하기 전에 발생하는 것이 아니라 첫 번째 쿼리 시점에 발생합니다; 이로 인해 이론적으로는 thundering-herd 문제가 생길 수 있습니다. 이 변경은 #11188를 해결합니다. #60093 (Alexey Milovidov).
  • 벡터 검색용 벡터화 거리 함수. #58866 (Robert Schulze).
  • 벡터 검색에 유용한 벡터화 함수 dotProduct. #60202 (Robert Schulze).
  • dictGetOrDefault 함수에 단락 평가를 지원하도록 했습니다. #52098를 해결합니다. #57767 (jsc0218).
  • Keeper 개선: latest_logs_cache_size_thresholdcommit_logs_cache_size_threshold로 제어하여 메모리 내에는 일정량의 로그만 캐시하도록 했습니다. #59460 (Antonio Andelic).
  • Keeper 개선: 데이터 노드 크기를 한층 더 줄였습니다. #59592 (Antonio Andelic).
  • 결과 유형이 Float*/Decimal*/*Int*인 경우 if 함수의 브랜치 미스를 추가로 최적화했습니다. https://github.com/ClickHouse/ClickHouse/pull/57885의 후속 작업입니다. #59148 (李扬).
  • 입력 유형이 Map일 때 if 함수를 최적화해 최대 약 10배까지 빨라집니다. #59413 (李扬).
  • Int8 타입에 엄격한 별칭 규칙(strict aliasing)을 구현해 성능을 개선했습니다(UInt8 및 다른 모든 정수 타입에는 이미 적용되어 있습니다). #59485 (Raúl Marín).
  • 분기 미스를 줄여 bigint 및 big decimal 타입에서 조건부 sum/avg 성능을 최적화했습니다. #59504 (李扬).
  • 활성 뮤테이션이 있을 때 SELECT 성능을 개선합니다. #59531 (Azat Khuzhin).
  • AVX2를 사용해 isNotNull 함수를 최적화했습니다. #59621 (李扬).
  • 정렬되었거나 거의 정렬된 데이터에서 ASOF JOIN 성능을 개선했습니다. #59731 (Maksim Kita).
  • 이전 async_insert_max_data_size의 기본값 1 MB는 너무 작은 것으로 판단되었습니다. 새 기본값은 10 MiB입니다. #59536 (Nikita Mikhaylov).
  • RESTORE 명령 실행 중 백업에서 테이블 메타데이터를 읽을 때 여러 스레드를 사용합니다. #60040 (Vitaly Baranov).
  • 이제 StorageBuffer에 세그먼트가 2개 이상(num_layers > 1) 있으면 모든 세그먼트에 대한 백그라운드 플러시가 여러 스레드에서 동시에 수행됩니다. #60111 (alesapin).

개선 사항

  • 출력 형식이 Pretty 포맷이고 블록이 100만을 초과하는 단일 숫자 값으로만 이루어진 경우, 읽기 쉬운 숫자가 테이블 오른쪽에 출력됩니다. #60379 (rogeryk).
  • 설정 split_parts_ranges_into_intersecting_and_non_intersecting_finalsplit_intersecting_parts_ranges_into_layers_final이 추가되었습니다. 이 설정은 FINAL이 포함된 쿼리의 최적화를 비활성화할 때 필요하며, 디버깅 용도로만 사용해야 합니다. #59705 (Maksim Kita). 다만 실제로는 그 용도에만 국한되지 않으며, 성능 저하를 감수하는 대신 메모리 사용량을 줄이는 데에도 사용할 수 있습니다.
  • 설정 extract_kvp_max_pairs_per_row의 이름을 extract_key_value_pairs_max_pairs_per_row로 변경했습니다. 이 문제(설정 이름에 불필요한 약어가 들어간 점)는 https://github.com/ClickHouse/ClickHouse/pull/43606에서 발생했습니다. 이 설정에 대한 문서를 수정했습니다. #59683 (Alexey Milovidov). #59960 (jsc0218).
  • DEFAULT 또는 MATERIALIZED 표현식이 있는 컬럼에서 ALTER COLUMN MATERIALIZE를 실행하면 이제 의미론에 맞게 정확히 동작합니다. #58023 (Duc Canh Le).
  • 뮤테이션 중 오류 발생 시 지수 백오프 로직을 활성화했습니다. 이를 통해 CPU 사용량, 메모리 사용량 및 로그 파일 크기를 줄입니다. #58036 (MikhailBurdukov).
  • InitialQuery Profile Event가 집계되도록 개선했습니다. #58195 (Unalian).
  • storage_configuration에서 volume_priority를 지정할 수 있게 되었습니다. #58533 (Andrey Zvonov).
  • T64 코덱에서 Date32 유형을 지원하도록 추가했습니다. #58738 (Hongbin Ma).
  • 여러 항목으로 이루어진 타입에서 후행 쉼표를 허용합니다. #59119 (Aleksandr Musorin).
  • 이제 분산 테이블 엔진의 설정을 서버 설정 파일에서 지정할 수 있습니다(MergeTree 설정과 유사). 예: <distributed> <flush_on_detach>false</flush_on_detach> </distributed>. #59291 (Azat Khuzhin).
  • system.zookeeper를 읽는 중 연결이 끊기거나 세션이 만료되면 재시도합니다. 이는 특히 장애 주입으로 연결 끊김이 발생하는 환경에서 system.zookeeper 테이블(table)에서 많은 행(row)을 읽을 때 유용합니다. #59388 (Alexander Gololobov).
  • input_format_values_interpret_expressions=0일 때 앞에 0이 붙은 숫자를 8진수로 해석하지 않도록 했습니다. #59403 (Joanna Hulboj).
  • 시작 시와 구성 파일이 변경될 때마다 ClickHouse는 전체 메모리 트래커의 하드 메모리 한도를 업데이트합니다. 이러한 한도는 다양한 서버 설정과 cgroups 한도(Linux에서)를 기반으로 계산됩니다. 이전에는 /sys/fs/cgroup/memory.max 설정(cgroups v2용)이 하드코딩되어 있었습니다. 그 결과, 예를 들어 /sys/fs/cgroup/my/nested/group/memory.max처럼 중첩된 그룹(계층)에 대해 구성된 cgroup v2 메모리 한도는 무시되었습니다. 이제 이 문제가 수정되었습니다. v1 메모리 한도의 동작은 그대로 유지됩니다. #59435 (Robert Schulze).
  • INSERT 중 PK/프로젝션/보조 인덱스 계산에 소요되는 시간을 확인할 수 있도록 새로운 프로파일 이벤트가 추가되었습니다. #59436 (Nikita Taranov).
  • 생성 시 s3queue_last_processed_path 설정을 사용해 Ordered 모드의 S3Queue 시작 지점을 지정할 수 있게 되었습니다. #59446 (Kseniia Sumarokova).
  • 시스템 테이블의 comment도 clickhouse-localsystem.tables에서 확인할 수 있게 했습니다. #59493 (Nikita Mikhaylov).
  • system.zookeeper 테이블: 이전에는 전체 결과를 메모리에 누적한 후 하나의 큰 청크로 반환했습니다. 이번 변경으로 system.zookeeper에서 많은 행을 읽을 때 메모리 사용량을 줄이는 데 도움이 되며, 중간 진행 상황(지금까지 몇 개의 행을 읽었는지)을 표시할 수 있고, 결과 집합이 클 경우 연결 타임아웃이 발생하는 것을 방지할 수 있습니다. #59545 (Alexander Gololobov).
  • 이제 대시보드는 URL의 #hash에 대해 압축된 상태와 비압축 상태를 모두 인식합니다(하위 호환성). #59124의 후속 작업입니다. #59548 (Amos Bird).
  • Intel QPL(DEFLATE_QPL 코덱에 사용)을 v1.3.1에서 v1.4.0으로 올렸습니다. 또한 폴링 timeout 메커니즘의 버그도 수정했습니다. 일부 경우에는 timeout이 제대로 동작하지 않아, timeout이 발생하면 IAA와 CPU가 버퍼를 동시에 처리할 수 있는 것으로 확인되었습니다. 현재로서는 IAA 코덱 상태가 QPL_STS_BEING_PROCESSED가 아닌지 확인한 뒤 SW 코덱으로 폴백하도록 했습니다. #59551 (jasperzhu).
  • ClickHouse Cloud에서는 원활한 업그레이드가 자동으로 처리되므로 서버 버전에 대한 경고를 표시하지 않습니다. #59657 (Alexey Milovidov).
  • 자체 추출 후에는 임시 바이너리를 복사하지 않고 이동합니다. #59661 (Yakov Olkhovskiy).
  • Apple macOS에서 스택 언와인딩을 수정했습니다. 이로써 #53653가 해결되었습니다. #59690 (Nikita Mikhaylov).
  • 사용자가 max_parser_depth 설정을 지나치게 큰 값으로 잘못 구성한 경우에도 파서의 스택 오버플로우를 점검합니다. 이로써 #59622가 해결됩니다. #59697 (Alexey Milovidov). #60434
  • Kafka 스토리지에서 XML과 SQL로 생성한 명명된 컬렉션의 동작을 통일했습니다. #59710 (Pervakov Grigorii).
  • merge_max_block_size_bytes가 충분히 작고 테이블에 wide 행(문자열 또는 튜플)이 포함된 경우, 백그라운드 머지가 무한 루프에 갇힐 수 있습니다. 이 문제는 수정되었습니다. https://github.com/ClickHouse/ClickHouse/pull/59340에 대한 후속 조치입니다. #59812 (Nikita Mikhaylov).
  • CREATE TABLE에 uuid가 명시적으로 지정된 경우 replica_path에서 uuid를 허용합니다. #59908 (Azat Khuzhin).
  • system.tables 시스템 테이블에 ReplicatedMergeTree 테이블의 metadata_version 컬럼이 추가되었습니다. #59942 (Maksim Kita).
  • Keeper 개선: Prometheus용으로 Keeper 관련 메트릭/이벤트만 전송합니다. #59945 (Antonio Andelic).
  • 대시보드는 업그레이드 후 시스템 테이블의 구조가 변경되었더라도 서로 다른 ClickHouse 버전의 메트릭을 표시합니다. #59967 (Alexey Milovidov).
  • 파일에서 AZ 정보를 로드할 수 있도록 허용합니다. #59976 (Konstantin Bogdanov).
  • Keeper 개선: Disk 관련 작업이 실패할 경우 재시도하도록 했습니다. #59980 (Antonio Andelic).
  • backups.remove_backup_files_after_failure 새 config 설정을 추가했습니다: <clickhouse> <backups> <remove_backup_files_after_failure>true</remove_backup_files_after_failure> </backups> </clickhouse>. #60002 (Vitaly Baranov).
  • GCP가 GATEWAY_TIMEOUT HTTP 오류 코드와 함께 Internal Error를 반환하면, S3 파일 복사 시 GCP 폴백 대신 버퍼 복사를 사용합니다. #60164 (Maksim Kita).
  • ULIDStringToDateTime에 단락 실행을 적용했습니다. #60211 (Juan Madurga).
  • 테이블 system.backupssystem.backup_logquery_id 컬럼이 추가되었습니다. error 컬럼에 오류 스택 트레이스가 추가되었습니다. #60220 (Maksim Kita).
  • 이제 MySQL 포트를 통한 연결에서는 QuickSight를 별도 설정 없이 지원할 수 있도록 prefer_column_name_to_alias = 1 설정이 자동으로 적용됩니다. 또한 mysql_map_string_to_text_in_show_columnsmysql_map_fixed_string_to_text_in_show_columns 설정도 이제 기본적으로 활성화되며, 이들 역시 MySQL 연결에만 영향을 줍니다. 이에 따라 더 많은 BI 도구와의 호환성이 향상됩니다. #60365 (Robert Schulze).
  • JavaScript 코드의 race condition을 수정해 차트가 서로 위에 중복으로 겹쳐 표시되던 문제를 해결했습니다. #60392 (Alexey Milovidov).

빌드/테스트/패키징 개선

  • 내부 검사와 함께 커버리지를 수집하는 빌드와 테스트를 추가했습니다. #56102의 후속 작업입니다. #58792 (Alexey Milovidov).
  • CMake 크로스 컴파일 toolchain 변수가 설정된 경우 corrosion-cmake의 Rust toolchain을 업데이트합니다. #59309 (Aris Tritas).
  • ASTLiterals에 퍼징을 일부 추가했습니다. #59383 (Raúl Marín).
  • ClickHouse 컨테이너가 시작될 때마다 initdb 스크립트를 실행하려면 환경 변수 CLICKHOUSE_ALWAYS_RUN_INITDB_SCRIPTS를 설정해야 합니다. #59808 (Alexander Nikolaev).
  • 일반적인 ClickHouse 구성 요소(예: server/client/…)를 비활성화하는 기능은 제거하고, 추가 라이브러리가 필요한 일부 항목(예: ODBC 또는 Keeper)은 유지합니다. #59857 (Azat Khuzhin).
  • 쿼리 퍼저가 쿼리 내부의 SETTINGS도 퍼징합니다. #60087 (Alexey Milovidov).
  • clang-19(master)로 ClickHouse를 빌드할 수 있도록 지원을 추가했습니다. #60448 (Alexey Milovidov).

버그 수정(공식 안정 릴리스에서 사용자에게 드러나는 오동작)

  • TTL WHERE에서 발생하던 “Non-ready set” 오류를 수정했습니다. #57430 (Nikolai Kochetov).
  • quantilesGK 함수의 버그를 수정했습니다 #58216 (李扬).
  • Decimal 인수에서 intDiv가 잘못 동작하던 문제를 수정했습니다 #59243 (Yarik Briukhovetskyi).
  • FixedString 입력에 대한 translate 수정 #59356 (Raúl Marín).
  • Keeper에서 다이제스트 계산을 수정 #59439 (Antonio Andelic).
  • 디버그 심볼이 없는 바이너리의 스택트레이스 문제 수정 #59444 (Azat Khuzhin).
  • 컬럼별 설정이 있는 경우 ASTAlterCommand::formatImpl 수정… #59445 (János Benjamin Antal).
  • 분석기에서 SELECT * FROM [...] ORDER BY ALL 문제 수정 #59462 (zhongyuankai).
  • 분산 쿼리 취소 중 발생할 수 있는 미처리 예외를 수정했습니다 #59487 (Azat Khuzhin).
  • 복합 타입에서 MAX가 permutation과 동일한 규칙을 사용하도록 했습니다 #59498 (Raúl Marín).
  • update_insert_deduplication_token_in_dependent_materialized_views를 전달할 때 발생하는 예외적인 경우를 수정했습니다 #59544 (Jordi Villar).
  • 빈 값에 대한 arrayElement / map의 잘못된 결과 수정 #59594 (Raúl Marín).
  • 빈 상태 병합 시 topK 크래시 수정 #59603 (Raúl Marín).
  • 상수 sharding key를 사용하는 분산 테이블 문제 수정 #59606 (Vitaly Baranov).
  • WingFuzz가 발견한 KQL 관련 문제를 수정했습니다 #59626 (Yong Wang).
  • AsynchronousBoundedReadBuffer의 “Read beyond last offset” 오류를 수정했습니다 #59630 (Vitaly Baranov).
  • RewriteSumFunctionWithSumAndCountVisitor에서 함수 별칭 유지 #59658 (Raúl Marín).
  • 초기 쿼리가 아닌 쿼리의 시작 시간 문제 수정 #59662 (Raúl Marín).
  • minmax 스키핑 인덱스 인수의 타입 검증 #59733 (Anton Popov).
  • FixedString 입력 처리 시 leftPad / rightPad 함수를 수정했습니다 #59739 (Raúl Marín).
  • countMatches 함수의 AST 퍼저 관련 문제 수정 #59752 (Robert Schulze).
  • RabbitMQ: ack도 nack도 되지 않은 메시지가 발생하는 문제 수정 #59775 (Kseniia Sumarokova).
  • StorageURL이 쿼리 실행의 일부를 단일 스레드에서 수행하던 문제를 수정했습니다 #59833 (Michael Kolupaev).
  • S3Queue: 초기화되지 않은 값 문제 수정 #59897 (Kseniia Sumarokova).
  • 괄호로 둘러싸인 파티션 표현식의 구문 분석 문제 수정 #59901 (János Benjamin Antal).
  • HTTP를 통해 JSONColumnsWithMetadata 포맷에서 발생하는 충돌 수정 #59925 (Kruglov Pavel).
  • 분석기에서 반환값이 달라지는 경우 sumcount로 재작성하지 않도록 수정했습니다 #59926 (Azat Khuzhin).
  • UniqExactSet 읽기 중 크래시 수정 #59928 (Maksim Kita).
  • ReplicatedMergeTree의 잘못된 metadata_version 문제 수정 #59946 (Maksim Kita).
  • StorageDistributed의 데이터 레이스 문제 수정 #59987 (Nikita Taranov).
  • Docker: 옵션이 비활성화되었을 때가 아니라 활성화되었을 때 init 스크립트를 실행하도록 변경 #59991 (jktng).
  • SQLite에 작은따옴표가 포함된 값을 INSERT할 때의 문제를 수정했습니다(작은따옴표를 백슬래시 대신 작은따옴표로 이스케이프하도록 변경) #60015 (Azat Khuzhin).
  • arrayFold의 논리적 오류 여러 건 수정 #60022 (Raúl Marín).
  • optimize&#95;uniq&#95;to&#95;count에서 컬럼 별칭이 제거되는 문제를 수정했습니다 #60026 (Raúl Marín).
  • 삭제 시 S3Queue 테이블에서 발생할 수 있는 예외를 수정 #60036 (Kseniia Sumarokova).
  • 단일 리터럴에 대한 NOT 포맷팅 수정 #60042 (Raúl Marín).
  • DDLLogEntry에서 하드코딩된 4096 대신 Context의 max_query_size를 사용하도록 변경 #60083 (Kruglov Pavel).
  • table이라는 이름의 테이블이 포함된 쿼리에서 일관되지 않던 서식을 수정했습니다. 구조가 선형적이지 않은 경우 UNION ALL, INTERSECT, EXCEPT가 포함된 쿌리의 잘못된 서식을 수정했습니다. 이로써 #52349가 해결되었습니다. SYSTEM ... DROP FILESYSTEM CACHE, SYSTEM ... REFRESH/START/STOP/CANCEL/TEST VIEW, SYSTEM ENABLE/DISABLE FAILPOINT를 포함한 SYSTEM 쿼리의 잘못된 서식을 수정했습니다. 매개변수화된 DDL 쿼리의 서식을 수정했습니다. DESCRIBE FILESYSTEM CACHE 쿼리의 서식을 수정했습니다. SET param_...(매개변수를 설정하는 쿼리)의 잘못된 서식을 수정했습니다. CREATE INDEX 쿼리의 잘못된 서식을 수정했습니다. CREATE USER 및 유사한 쿼리에서 일관되지 않던 서식을 수정했습니다. CREATE SETTINGS PROFILE의 일관되지 않은 서식을 수정했습니다. ALTER ... MODIFY REFRESH의 잘못된 서식을 수정했습니다. 프레임 오프셋이 표현식인 경우 윈도우 함수의 일관되지 않은 서식을 수정했습니다. 연산자를 구현하는 함수(예: plus) 뒤에 사용된 RESPECT NULLSIGNORE NULLS의 일관되지 않은 서식을 수정했습니다. SYSTEM SYNC REPLICA ... LIGHTWEIGHT FROM ...의 터무니없는 서식을 수정했습니다. GROUP BY GROUPING SETS ... WITH ROLLUP/CUBE/TOTALS가 포함된 잘못된 쿼리에서 일관되지 않던 서식을 수정했습니다. GRANT CURRENT GRANTS의 일관되지 않은 서식을 수정했습니다. CREATE TABLE (... COLLATE)의 일관되지 않은 서식을 수정했습니다. 추가로, 서브쿼리에서 EXPLAIN의 잘못된 서식도 수정했습니다(#60102). 람다 함수의 잘못된 서식을 수정했습니다(#60012). 앞으로는 이런 끔찍한 사례를 놓치지 않도록 검사를 추가했습니다. #60095 (Alexey Milovidov).
  • 서브쿼리에서 explain 포맷이 일관되지 않던 문제 수정 #60102 (Alexey Milovidov).
  • 널 허용 타입에서 발생하는 cosineDistance 충돌 수정 #60150 (Raúl Marín).
  • 문자열로 표현된 bool을 실제 bool로 CAST할 수 있도록 허용 #60160 (Robert Schulze).
  • system.s3queue_log 문제 수정 #60166 (Kseniia Sumarokova).
  • 널 허용 집계 함수 이름에서 발생하던 arrayReduce 문제를 수정했습니다 #60188 (Raúl Marín).
  • S3Queue의 민감한 정보가 숨겨지도록 했습니다 #60233 (Kseniia Sumarokova).
  • HTTP 예외 코드를 수정했습니다. #60252 (Austin Kothig).
  • S3Queue: 버그 수정(간헐적으로 실패하던 test_storage_s3_queue/test.py::test_shards_distributed도 함께 수정) #60282 (Kseniia Sumarokova).
  • IPv6 해시 함수에서 초기화되지 않은 값 사용 및 잘못된 결과 문제를 수정했습니다 #60359 (Kruglov Pavel).
  • null 인수가 있는 OptimizeDateOrDateTimeConverterWithPreimageVisitor 문제 수정 #60453 (Raúl Marín).
  • KQL 또는 PRQL 방언 클라이언트에서 전송한 분산 테이블 쿼리가 레플리카에서 실행되지 않던 경미한 버그를 수정했습니다. #59674. #60470 (Alexey Milovidov) #59674 (Austin Kothig).

ClickHouse 릴리스 24.1, 2024-01-30. 발표 자료, 동영상

하위 호환되지 않는 변경 사항

  • print_pretty_type_names 설정이 기본적으로 활성화됩니다. 이전 동작을 유지하려면 이 설정을 끄거나 SET compatibility = '23.12'를 설정하십시오. #57726 (Alexey Milovidov).
  • MergeTree 설정 clean_deleted_rows는 Deprecated 상태이며, 이제는 더 이상 아무 효과가 없습니다. OPTIMIZECLEANUP 키워드는 기본적으로 허용되지 않습니다(allow_experimental_replacing_merge_with_cleanup가 활성화된 경우는 예외). #58316 (Alexander Tokmakov).
  • reverseDNSQuery 함수는 더 이상 사용할 수 없습니다. 이 변경으로 #58368이 종료되었습니다. #58369 (Alexey Milovidov).
  • 설정 파일의 access control을 개선하기 위한 여러 변경 사항이 활성화되었습니다. 이러한 변경 사항은 동작에 영향을 미치므로 access_control_improvements 섹션의 config.xml을 확인하십시오. 확실하지 않다면 설정 파일의 값을 이전 버전과 동일하게 유지하십시오. #58584 (Alexey Milovidov).
  • NaN 값이 있을 때 sumMapFiltered의 동작이 개선되었습니다. 이제 NaN 값은 임의의 위치가 아니라 끝에 배치되며, 어떤 값과도 다른 값으로 간주됩니다. 또한 이제 -00과 같은 값으로 처리됩니다. 0 값은 버려지므로 -0 값도 버려집니다. #58959 (Raúl Marín).
  • visibleWidth 함수는 이제 문서에 설명된 대로 동작합니다. 이전 버전에서는 lengthUTF8 함수처럼 문자열 직렬화 후 코드 포인트 수만 단순히 계산했으며, 너비가 0인 문자와 결합 문자, 전각 문자, 탭, 삭제 문자는 고려하지 않았습니다. 이제 이에 맞게 동작이 변경되었습니다. 이전 동작을 유지하려면 function_visible_width_behavior0으로 설정하거나 compatibility23.12 이하로 설정하십시오. #59022 (Alexey Milovidov).
  • 다음 두 버그가 수정될 때까지 Kusto 방언은 비활성화됩니다: #59037#59036. #59305 (Alexey Milovidov). Kusto를 사용하려고 하면 예외가 발생합니다.
  • FINAL 수정자의 더 효율적인 구현에서는 이제 max_threads = 1인 경우에도 순서가 유지된다고 보장하지 않습니다. 이전 동작에 의존했다면 enable_vertical_final을 0으로 설정하거나 compatibility23.12로 설정하십시오.

새로운 기능

  • 다른 데이터 타입의 union을 나타내는 Variant 데이터 타입을 구현했습니다. 타입 Variant(T1, T2, ..., TN)은 이 타입의 각 행이 T1 또는 T2 또는 … 또는 TN 타입의 값을 가지거나, 어느 타입에도 속하지 않는 값(NULL 값)을 가질 수 있음을 의미합니다. Variant 타입은 설정 allow_experimental_variant_type을 통해 사용할 수 있습니다. 참고: #54864. #58047 (Kruglov Pavel).
  • 특정 설정(현재 min_compress_block_sizemax_compress_block_size)은 이제 컬럼 수준에서도 지정할 수 있으며, 이 경우 해당 테이블 수준 설정보다 우선합니다. 예시: CREATE TABLE tab (col String SETTINGS (min_compress_block_size = 81920, max_compress_block_size = 163840)) ENGINE = MergeTree ORDER BY tuple();. #55201 (Duc Canh Le).
  • quantileDD 집계 함수와 여기에 대응하는 quantilesDDmedianDD를 추가합니다. 이는 DDSketch https://www.vldb.org/pvldb/vol12/p2195-masson.pdf를 기반으로 합니다. ### 사용자 대상 변경 사항에 대한 문서 항목입니다. #56342 (Srikanth Chekuri).
  • 모든 유형의 메타데이터 타입에 대해 모든 유형의 객체 스토리지를 구성할 수 있도록 지원합니다. #58357 (Kseniia Sumarokova).
  • 비활성 레플리카를 기다리지 않아도 되도록 distributed_ddl_output_modenull_status_on_timeout_only_activethrow_only_active 모드가 추가되었습니다. #58350 (Alexander Tokmakov).
  • 부분 배열을 생성하는 함수 arrayShingles를 추가했습니다. 예를 들어 arrayShingles([1, 2, 3, 4, 5], 3)[[1,2,3],[2,3,4],[3,4,5]]를 반환합니다. #58396 (Zheng Miao).
  • IDNA 표준에 따라 국제화 도메인 이름을 ASCII 표현으로 변환하는 데 유용한 함수 punycodeEncode, punycodeDecode, idnaEncode, idnaDecode가 추가되었습니다. #58454 (Robert Schulze).
  • 문자열 유사도 함수 dramerauLevenshteinDistance, jaroSimilarity, jaroWinklerSimilarity가 추가되었습니다. #58531 (Robert Schulze).
  • 출력 압축 수준을 변경하는 두 가지 설정 output_format_compression_level과, 출력 압축 포맷이 zstd인 경우 압축 윈도우 크기를 명시적으로 설정하고 zstd 압축의 장거리 모드를 활성화하는 output_format_compression_zstd_window_log가 추가되었습니다. 이는 INTO OUTFILE과 테이블 함수 file, url, hdfs, s3, azureBlobStorage에 쓸 때 적용됩니다. #58539 (Duc Canh Le).
  • 출력이 터미널이 아닐 경우 Pretty 형식에서 ANSI 이스케이프 시퀀스를 자동으로 비활성화합니다. output_format_pretty_color 설정에 새 auto 모드를 추가합니다. #58614 (Shaun Struwig).
  • Sqids를 디코드하는 sqidDecode 함수를 추가했습니다. #58544 (Robert Schulze).
  • JSON 입력 형식에서 Bool 값을 String으로 읽는 기능이 추가되었습니다. 이 기능은 기본적으로 활성화된 input_format_json_read_bools_as_strings 설정을 통해 제공됩니다. #58561 (Kruglov Pavel).
  • 시계열을 계절성, 추세 및 잔차 성분으로 분해하는 함수 seriesDecomposeSTL이 추가되었습니다. #57078 (Bhavna Jindal).
  • MaterializedMySQL용 MySQL Binlog Client 도입: 여러 데이터베이스에 대해 하나의 binlog 연결을 사용합니다. #57323 (Val Doroshchuk).
  • Intel QuickAssist Technology (QAT)는 하드웨어 가속 압축 및 암호화를 제공합니다. ClickHouse에 zstd 압축에 QAT를 활용하는 새로운 압축 코덱 ZSTD_QAT가 추가되었습니다. 이 코덱은 Intel’s QATlibInte’s QAT ZSTD Plugin을 사용합니다. 현재는 압축만 하드웨어 가속할 수 있으며(QAT를 초기화하지 못하는 경우 소프트웨어 폴백이 수행됨), 압축 해제는 항상 소프트웨어로 처리됩니다. #57509 (jasperzhu).
  • s3 디스크용 객체 스토리지 키를 생성하는 새로운 방식을 구현했습니다. 이제 디스크 설명에서 key_template 옵션을 사용해 포맷을 re2 정규식 구문으로 정의할 수 있습니다. #57663 (Sema Checherinda).
  • 테이블 system.dropped_tables_parts에는 system.dropped_tables 테이블(삭제되었지만 아직 제거되지 않은 테이블)의 파트가 포함됩니다. #58038 (Yakov Olkhovskiy).
  • 테이블에 attached 상태인 materialized view의 수를 제한하는 max_materialized_views_size_for_table 설정을 추가했습니다. #58068 (zhongyuankai).
  • clickhouse-format 개선: VALUES를 사용하는 INSERT 쿼리를 지원하고, 주석도 지원합니다(출력하려면 --comments 사용). 또한 여러 줄로 포맷할 때 긴 쿼리만 대상으로 하도록 --max_line_length 옵션을 지원합니다. #58246 (vdimir).
  • clickhouse-local에서 system.parts를 포함한 모든 시스템 테이블(system tables)을 ATTACH할 수 있게 했습니다. 이로써 #58312가 해결됩니다. #58359 (Alexey Milovidov).
  • 함수 transform에서 Enum 데이터 타입 지원이 추가되었습니다. 이로써 #58241가 해결되었습니다. #58360 (Alexey Milovidov).
  • 테이블 system.database_engines가 추가되었습니다. #58390 (Bharat Nallan). 코드베이스에서 데이터베이스 엔진을 독립적으로 등록할 수 있게 되었습니다. #58365 (Bharat Nallan). Interpreters를 독립적으로 등록할 수 있게 되었습니다. #58443 (Bharat Nallan).
  • SYSTEM SYNC REPLICA LIGHTWEIGHT 쿼리에 FROM <Replicas> 수정자가 추가되었습니다. FROM 수정자를 사용하면 지정된 소스 레플리카에 대해서만 fetch 작업과 drop-range를 기다리며, ZooKeeper에 없거나 source_replica가 비어 있는 모든 레플리카도 대기 대상에 포함됩니다. #58393 (Jayme Bird).
  • 설정 update_insert_deduplication_token_in_dependent_materialized_views이 추가되었습니다. 이 설정을 사용하면 종속 구체화된 뷰(materialized view)에 삽입할 때 테이블 식별자로 삽입 중복 제거 토큰을 업데이트할 수 있습니다. #59165를 해결합니다. #59238 (Maksim Kita).
  • 비동기 메트릭을 갱신하는 SYSTEM RELOAD ASYNCHRONOUS METRICS 문을 추가했습니다. 주로 테스트 및 개발에 유용합니다. #53710 (Robert Schulze).

성능 개선

  • 병렬 레플리카를 위한 조정 로직이 더 나은 병렬성과 캐시 지역성을 위해 재작성되었습니다. 수백 개의 레플리카에서 선형적으로 확장되는 것으로 테스트되었습니다. 또한 순서대로 읽기를 지원하게 되었습니다. #57968 (Nikita Taranov).
  • HTTP 아웃고잉 버퍼링 기반을 네이티브 ClickHouse 버퍼로 대체합니다. 인터페이스별 바이트 수 집계 메트릭을 추가합니다. #56064 (Yakov Olkhovskiy).
  • 분산 쿼리에서는 uniqExact의 큰 집계 상태가 병렬로 머지됩니다. #59009 (Nikita Taranov).
  • MergeTree 테이블에서 읽은 후 메모리 사용량이 감소했습니다. #59290 (Anton Popov).
  • 수직 병합에서 메모리 사용량을 줄였습니다. #59340 (Anton Popov).
  • 더 많은 상황에서 Keeper 시작 시 과도한 메모리 사용을 방지합니다. #58455 (Antonio Andelic).
  • Keeper 개선: 저장된 노드에 대한 Keeper의 메모리 사용량을 감소시켰습니다. #59002 (Antonio Andelic).
  • 더 캐시 친화적인 FINAL 구현이 적용되었습니다. 동작 변경에 유의하십시오. 이전에는 단일 스트림(예: max_threads = 1)으로 읽는 FINAL 수정자가 포함된 쿼리는 ORDER BY 절을 명시적으로 지정하지 않아도 정렬된 결과를 반환했습니다. 이제 enable_vertical_final = true일 때는(기본값도 true입니다) 이러한 동작이 더 이상 보장되지 않습니다. #54366 (Duc Canh Le).
  • 예를 들어 S3에서 읽을 때 사용되는 ReadBufferFromIStream에서 불필요한 추가 복사를 생략합니다. #56961 (Nikita Taranov).
  • 입력이 Array(Map)/Array(Array(Num)/Array(Array(String))/Array(BigInt)/Array(Decimal)인 경우 배열 요소 함수를 최적화했습니다. 이전 구현은 필요 이상으로 많은 할당을 수행했습니다. 이번 최적화로 최대 약 6배까지 성능이 향상되었으며, 특히 입력 유형이 Array(Map)일 때 효과가 큽니다. #56403 (李扬).
  • compact 파트에서 둘 이상의 하위 컬럼을 읽을 때 컬럼을 한 번만 읽도록 개선했습니다. #57631 (Kruglov Pavel).
  • sum(column + constant) 함수의 AST를 재작성합니다. 이는 분석기용 최적화 패스로 제공됩니다 #57853 (Jiebin Sun).
  • 이제 함수 match를 평가할 때 스킵 인덱스 ngrambf_v1tokenbf_v1을 활용합니다. #57882 (凌涛).
  • 이제 함수 match를 평가할 때 역인덱스를 사용합니다. #58284 (凌涛).
  • MergeTree FINAL은 동일한 non-L0 파트 내의 행은 비교하지 않습니다. #58142 (Duc Canh Le).
  • iota 호출 속도 개선(배열을 연속된 숫자로 채우는 작업). #58271 (Raúl Marín).
  • 숫자가 아닌 타입의 MIN/MAX 성능 향상. #58334 (Raúl Marín).
  • BMI2/SSE 내장 함수를 활용해 필터 조합(예: 다단계 PREWHERE)을 최적화했습니다 #58800 (Zhiguo Zhou).
  • clickhouse-local에서 사용하는 스레드 수를 1개 줄였습니다. #58968 (Alexey Milovidov).
  • Nullable 타입에서 multiIf 함수 성능을 개선했습니다. #57745 (KevinyhZou).
  • 사용하지 않는 jemalloc 페이지를 정리하기 위한 SYSTEM JEMALLOC PURGE와, 프로파일러가 활성화된 경우 jemalloc 프로파일을 제어하기 위한 SYSTEM JEMALLOC [ ENABLE | DISABLE | FLUSH ] PROFILE를 추가했습니다. Keeper에도 jemalloc 관련 4LW 명령을 추가했습니다. jmst는 jemalloc 통계를 덤프하는 명령이며, jmfp, jmep, jmdp는 프로파일러가 활성화된 경우 jemalloc 프로파일을 제어하는 명령입니다. #58665 (Antonio Andelic).
  • S3 백업 시 메모리 사용량 감소. #58962 (Vitaly Baranov).

개선 사항

  • 모든 system table의 모든 컬럼에 주석(간단한 설명)을 추가했습니다. 여기에는 몇 가지 이유가 있습니다: - system table을 자주 사용하는데, 때로는 개발자가 특정 컬럼의 용도와 의미를 이해하기가 매우 어려울 수 있습니다. - system table은 자주 변경되며(새 컬럼을 추가하거나 기존 컬럼을 수정), 관련 문서는 항상 최신 상태를 따라가지 못합니다. 예를 들어 system.parts 문서 페이지를 살펴보십시오. 많은 컬럼이 누락되어 있습니다 - 궁극적으로는 ClickHouse에서 직접 문서를 생성하고자 합니다. #58356 (Nikita Mikhaylov).
  • PASTE JOIN에서 서브쿼리에 alias가 없는 쿼리도 허용합니다. #58654 (Yarik Briukhovetskyi).
  • macOS에서 MySQL/MariaDB 통합을 사용할 수 있도록 했습니다. 이 변경으로 #21191이 해결되었습니다. #46316 (Alexey Milovidov) (Robert Schulze).
  • 이제 max_rows_in_set_to_optimize_join는 기본적으로 비활성화됩니다. #56396 (vdimir).
  • ON CLUSTER DDL 쿼리와 Replicated 데이터베이스 엔진에서 호스트명 해석을 피할 수 있도록 하는 <host_name> 설정 매개변수를 추가했습니다. 이를 통해 클러스터 정의가 변경될 때 큐가 멈출 수 있는 가능성을 완화합니다. #57573를 해결합니다. #57603 (Nikolay Degterinsky).
  • 파일 시스템 캐시용 load_metadata_threads를 16으로 늘렸습니다. 서버 시작 속도가 더 빨라집니다. #57732 (Alexey Milovidov).
  • 머지/뮤테이션의 속도를 제한할 수 있는 기능이 추가되었습니다 (max_mutations_bandwidth_for_server/max_merges_bandwidth_for_server). #57877 (Azat Khuzhin).
  • 문서화되지 않은 불리언(boolean) 컬럼 is_hot_reloadable을 system 테이블(system table) system.server_settings에서 가능한 값이 No, Yes, IncreaseOnly, DecreaseOnly인 (Enum8) 컬럼 changeable_without_restart로 대체했습니다. 또한 이 컬럼도 문서화했습니다. #58029 (skyoct).
  • 클러스터 디스커버리에서 사용자 이름과 비밀번호 설정을 지원하고, #58063를 해결했습니다. #58123 (vdimir).
  • ALTER TABLE ... PART에서 쿼리 매개변수 지원이 추가되었습니다. #58297 (Azat Khuzhin).
  • Kafka 테이블용 컨슈머를 필요할 때 즉시 생성하되, 마지막 사용 이후 일정 기간(kafka_consumers_pool_ttl_ms) 동안 유지합니다. 이렇게 하면 system.kafka_consumers의 통계 관련 문제(Kafka 테이블을 읽는 쪽이 없으면 consume가 일어나지 않아 실시간 메모리 누수와 테이블 detach 지연으로 이어지는 문제)가 해결되며, 이 PR에서는 system.kafka_consumers 통계도 다시 기본적으로 활성화됩니다. #58310 (Azat Khuzhin).
  • sparkBarsparkbar의 별칭으로 추가했습니다. #58335 (凌涛).
  • GCS에 업로드한 후에는 ComposeObject 요청을 보내지 않도록 했습니다. #58343 (Azat Khuzhin).
  • 구성 XML에서 이름에 점(.)이 포함된 키를 올바르게 처리합니다. #58354 (Azat Khuzhin).
  • 함수 format이 상수 인수에 대해 상수를 반환하게 합니다. 이로써 #58355가 해결됩니다. #58358 (Alexey Milovidov).
  • max_execution_timemax_estimated_execution_time를 분리하기 위해 max_estimated_execution_time 설정을 추가했습니다. #58402 (Zhang Yifan).
  • 유효하지 않은 데이터베이스 엔진 이름을 사용하면 힌트가 제공됩니다. #58444 (Bharat Nallan).
  • Arrow 딕셔너리에서 인덱스 유형을 더욱 세밀하게 제어할 수 있도록 설정을 추가했습니다. Arrow 권장 사항에 따라 기본적으로 인덱스에 부호 있는 정수 유형을 사용합니다. #57401을 해결했습니다. #58519 (Kruglov Pavel).
  • 구현 #58575 docker image 실행 시 CLICKHOUSE_PASSWORD_FILE 환경 변수를 지원합니다. #58583 (Eyal Halpern Shalev).
  • 데이터를 읽기 위해 많은 스트림이 필요한 일부 쿼리를 실행할 때, 이전에는 "Paste JOIN requires sorted tables only" 오류가 발생했습니다. 이제는 이런 경우 스트림 수를 1로 조정합니다. #58608 (Yarik Briukhovetskyi).
  • INVALID_IDENTIFIER 오류 메시지 개선. #58703 (Yakov Olkhovskiy).
  • normalizeQuery에서 부호가 있는 숫자 리터럴을 더 잘 처리하도록 개선했습니다. #58710 (Salvatore Mesoraca).
  • MySQL의 Point 데이터 타입 지원. #58721 (Kseniia Sumarokova).
  • Float32 컬럼과 상수 문자열을 비교할 때 문자열을 Float64가 아니라 Float32로 읽습니다. #58724 (Raúl Marín).
  • S3 호환성을 개선하고 ECloud EOS 스토리지 지원을 추가했습니다. #58786 (xleoken).
  • KILL QUERY로 백업 / 복원을 취소할 수 있도록 했습니다. 이 PR에서는 실행 중인 백업과 복원이 system.processes에 표시되도록 했습니다. 또한 이제 서버 구성에 새로운 설정인 shutdown_wait_backups_and_restores(default=true)가 추가되었습니다. 이 설정은 서버 종료 시 실행 중인 모든 백업과 복원이 완료될 때까지 대기할지, 아니면 바로 취소할지를 결정합니다. #58804 (Vitaly Baranov).
  • Avro 포맷에서 ZSTD 코덱을 지원합니다. #58735를 해결했습니다. #58805 (flynn).
  • MySQL interface에서 net_write_timeoutnet_read_timeout 설정을 지원합니다. net_write_timeout은 ClickHouse 네이티브 send_timeout 설정으로 매핑되며, 마찬가지로 net_read_timeoutreceive_timeout으로 매핑됩니다. 전체 SQL statement가 모두 대문자인 경우에만 MySQL sql_select_limit 설정을 지정할 수 있던 문제를 수정했습니다. #58835 (Serge Klochkov).
  • 딕셔너리와 테이블을 같은 이름으로 생성할 때 발생하는 충돌에 대해 예외 메시지가 개선되었습니다. #58841 (Yarik Briukhovetskyi).
  • 사용자 지정(SQL에서 생성된) 디스크의 경우, 서버 구성에서 filesystem_caches_path(모든 파일 시스템 캐시에 대한 공통 디렉터리 경로 접두사) 또는 custom_cached_disks_base_directory(사용자 지정 디스크에서 생성된 파일 시스템 캐시에만 적용되는 공통 디렉터리 경로 접두사) 중 하나를 지정해야 합니다. 사용자 지정 디스크에서는 custom_cached_disks_base_directoryfilesystem_caches_path보다 우선하며, 전자가 없을 경우 후자가 사용됩니다. 파일 시스템 캐시 설정 path는 해당 디렉터리 내부에 있어야 하며, 그렇지 않으면 예외가 발생하여 디스크가 생성되지 않습니다. 이는 이전 버전에서 생성된 디스크에는 영향을 주지 않으며, 서버를 업그레이드한 경우에는 서버가 정상적으로 시작될 수 있도록 예외가 발생하지 않습니다. custom_cached_disks_base_directory는 기본 서버 구성에 /var/lib/clickhouse/caches/로 추가되었습니다. #57825를 닫습니다. #58869 (Kseniia Sumarokova).
  • MySQL 인터페이스에서 SHOW WARNINGS/SHOW COUNT(*) WARNINGS 쿼리와 호환되도록 개선되었지만, 반환되는 결과는 항상 빈 집합입니다. #58929 (Serge Klochkov).
  • 병렬 분산 INSERT SELECT 실행 시 사용할 수 없는 레플리카를 건너뜁니다. #58931 (Alexander Tokmakov).
  • json에서 구조화된 로그 포맷을 활성화하면 로그 수준을 텍스트 설명으로 표시합니다. #58936 (Tim Liou).
  • MySQL interface에서 데이터 타입 별칭(alias)을 통해 CAST(x AS SIGNED)CAST(x AS UNSIGNED) SQL 문을 지원합니다. 여기서 SIGNED는 Int64의 별칭이고 UNSIGNED는 UInt64의 별칭입니다. 이를 통해 Looker Studio와 같은 BI 도구와의 호환성이 향상됩니다. #58954 (Serge Klochkov).
  • Docker 컨테이너에서 작업 디렉터리를 데이터 경로로 변경합니다. #58975 (cangyin).
  • Azure Blob Storage용 설정 azure_max_unexpected_write_error_retries가 추가되었으며, azure 섹션의 config에서도 설정할 수 있습니다. #59001 (SmitaRKulkarni).
  • 손상된 데이터 레이크 테이블이 있어도 서버를 시작할 수 있도록 허용합니다. #58625를 해결합니다. #59080 (Kseniia Sumarokova).
  • Iceberg 테이블 엔진에서 스키마(schema) 변경을 무시하고, 테이블 생성 시 사용자가 지정한 스키마 또는 테이블 생성 시 메타데이터에서 파싱한 최신 스키마를 사용해 모든 데이터를 읽을 수 있도록 했습니다. 이는 기본적으로 비활성화되어 있는 iceberg_engine_ignore_schema_evolution 설정으로 제어됩니다. 이 설정을 활성화하면, 스키마가 변경된 경우 모든 데이터 파일을 동일한 스키마로 읽게 되므로 잘못된 결과가 나올 수 있다는 점에 유의하십시오. #59133 (Kruglov Pavel).
  • 적절한 TABLE_IS_READ_ONLY 오류를 반환하여 읽기 전용/단일 쓰기 스토리지에서 변경 가능한 작업(INSERT/ALTER/OPTIMIZE/…)을 금지합니다(잔여물 방지 목적). CREATE/ATTACH 시 단일 쓰기 디스크에 잔여물(format_version.txt)이 남지 않도록 합니다. ReplicatedMergeTree에서는 DROP을 무시합니다(MergeTree도 동일). s3_plain 순회 처리(MetadataStorageFromPlainObjectStorage::iterateDirectory)를 수정합니다. 읽기 전용은 web 디스크이고 단일 쓰기는 s3_plain이라는 점에 유의하십시오. #59170 (Azat Khuzhin).
  • 복잡한 ALTERmerge 작업이 결합될 때 논리 오류를 일으킬 수 있었던 실험적 _block_number 컬럼의 버그를 수정합니다. #56202를 해결합니다. #58601을 대체합니다. #59295 (alesapin).
  • 실행 UI는 JSON 내부에서 예외가 반환되면 이를 인식합니다. #52853에 대한 수정입니다. #59303 (Alexey Milovidov).
  • /binary HTTP 핸들러에서 쿼리 문자열로 사용자, 호스트, 선택적으로 비밀번호를 지정할 수 있습니다. #59311 (Alexey Milovidov).
  • 압축된 인메모리 테이블의 백업을 지원합니다. 이로써 #57893가 해결되었습니다. #59315 (Alexey Milovidov).
  • BACKUPRESTORE 쿼리에서 FORMAT 절을 지원합니다. #59338 (Vitaly Baranov).
  • 함수 concatWithSeparator가 이제 StringFixedString뿐 아니라 임의의 타입 인수도 지원합니다. 예를 들어 SELECT concatWithSeparator('.', 'number', 1)는 이제 number.1을 반환합니다. #59341 (Robert Schulze).

빌드/테스트/패키징 개선

  • ClickHouse 바이너리의 alias를 개선하고(이제 ch/clickhouse는 인수에 따라 clickhouse-local 또는 clickhouse를 가리킴) 새 alias에 대한 bash 자동 완성을 추가합니다. #58344 (Azat Khuzhin).
  • 모든 설정 변경 사항이 설정 변경 이력에 반영되는지 확인할 수 있도록 CI에 설정 변경 검사 기능을 추가합니다. #58555 (Kruglov Pavel).
  • stateful 테스트에서 S3에서 직접 ATTACH한 테이블을 사용합니다. #58791 (Alexey Milovidov).
  • 마지막 10만 줄 대신 전체 fuzzer.log를 아카이브로 저장합니다. tail -n 100000은 테이블 정의가 포함된 줄을 자주 잘라냅니다. 예시:. #58821 (Dmitry Novik).
  • Aarch64 macOS에서 Rust를 활성화합니다(skim을 사용한 클라이언트 퍼지 검색과 PRQL 언어가 추가되지만, darwin에서 ClickHouse를 호스팅하는 경우는 많지 않으므로 주로 클라이언트 퍼지 검색을 위한 변경이라고 볼 수 있습니다). #59272 (Azat Khuzhin).
  • x86_64와 ARM이 혼합된 클러스터에서 발생하는 집계 문제를 수정합니다 #59132 (Harry Lee).

버그 수정(공식 안정 릴리스에서 사용자에게 드러나는 오동작)

  • 중첩된 LowCardinality용 join 키 변환 추가 #51550 (vdimir).
  • flatten_nested=1일 때는 모든 Array(Tuple)가 아니라 실제 Nested 유형만 평탄화 #56132 (Kruglov Pavel).
  • 삽입 시 프로젝션과 aggregate_functions_null_for_empty 설정에서 발생하던 버그를 수정했습니다. #56944 (Amos Bird).
  • 오래된 프로필 UUID로 인해 발생할 수 있는 예외를 해결했습니다 #57263 (Vasily Nemkov).
  • StreamingFormatExecutor에서 읽기 buffer 작업 관련 문제 수정 #57438 (Kruglov Pavel).
  • 뷰로 푸시하는 동안 대상 테이블이 삭제된 MV는 무시하도록 수정 #57520 (Kruglov Pavel).
  • ALTER_METADATA와 MERGE_PARTS 사이에서 발생할 수 있는 경쟁 상태를 해소했습니다 #57755 (Azat Khuzhin).
  • ROLLUP이 포함된 GROUP BY의 표현식 순서 버그 수정 #57786 (Chen768959).
  • 사용 중단된 “zero-copy” 복제 기능 관련 수정: 손상된 분리된 파트가 있는 레플리카를 삭제한 후 blob이 손실되는 문제를 수정했습니다 #58333 (Alexander Tokmakov).
  • 사용자가 user_files_path에서 심볼릭 링크를 사용할 수 있도록 지원 #58447 (Duc Canh Le).
  • graphite 테이블에 agg 함수가 없을 때 발생하던 크래시를 수정했습니다 #58453 (Duc Canh Le).
  • materialized view에서 여러 차례 읽을 수 있도록 StorageKafka의 읽기를 지연 #58477 (János Benjamin Antal).
  • 비정상적으로 겹치는 파트 문제 수정 #58482 (Alexander Tokmakov).
  • LIMIT 절만 있는 쿼리에서는 MergeTreePrefetchedReadPool 비활성화 #58505 (Maksim Kita).
  • 복원 중 Ordinary 데이터베이스를 활성화합니다 #58520 (Jihyuk Bok).
  • Apache Hive에서 ORC/Parquet/…을 읽을 때의 스레드 풀 문제 수정 #58537 (sunny).
  • system.backup_logbase_backup_name 컬럼에서 자격 증명 숨기기 #58550 (Daniel Pozo Escalona).
  • 밀리초 및 마이크로초 값의 반올림을 위한 toStartOfInterval #58557 (Yarik Briukhovetskyi).
  • ConcurrentHashJoin에서 max_joined_block_rows를 비활성화 #58595 (vdimir).
  • 기존 분석기에서 널 허용을 사용하는 join 관련 문제 수정 #58596 (vdimir).
  • makeDateTime64: 상수가 아닌 fraction 인수를 허용 #58597 (Robert Schulze).
  • 인라인 프레임을 심볼화하는 과정에서 발생할 수 있는 NULL 역참조를 수정했습니다 #58607 (Azat Khuzhin).
  • 재생성된 사용자 또는 역할 전환 시에도 쿼리 캐시 엔트리의 격리가 더 잘 유지되도록 개선했습니다 #58611 (Robert Schulze).
  • 프로젝션 최적화 수행 시 파티션 키 분석이 잘못되는 문제 수정 #58638 (Amos Bird).
  • 쿼리 캐시: 사용자별 할당량 수정 #58731 (Robert Schulze).
  • 병렬 윈도우 함수의 스트림 파티셔닝을 수정했습니다 #58739 (Dmitry Novik).
  • addBatchLookupTable8에서 예외가 발생할 때 destroy가 두 번 호출되는 문제를 수정했습니다 #58745 (Raúl Marín).
  • 종료 중에는 Keeper에서 요청을 처리하지 않도록 변경 #58765 (Antonio Andelic).
  • SlabsPolygonIndex::find에서 널 포인터 역참조 문제를 수정했습니다 #58771 (Yarik Briukhovetskyi).
  • LowCardinality(Nullable) 컬럼용 JSONExtract 함수 수정 #58808 (vdimir).
  • CREATE 및 DROP으로 대량의 테이블을 생성하는 동안 메모리 사용량이 예기치 않게 누적되던 문제를 수정했습니다. #58831 (Maksim Kita).
  • mv에서 FileLog 스토리지 다중 읽기 #58877 (János Benjamin Antal).
  • S3 액세스 키 ID 제한. #58900 (MikhailBurdukov).
  • 제안 로딩 중 clickhouse-local에서 발생할 수 있는 비정상 종료를 수정 #58907 (Kruglov Pavel).
  • indexHint 사용 시 발생하던 충돌을 수정했습니다 #58911 (Dmitry Novik).
  • 서버 재시작 시 StorageURL에서 헤더가 유지되지 않는 문제를 수정했습니다 #58933 (Michael Kolupaev).
  • 분석기: 삽입 블록으로 스토리지를 대체하던 문제 수정 #58958 (Yakov Olkhovskiy).
  • ReadBufferFromZipArchive의 seek 수정 #58966 (Michael Kolupaev).
  • 실험적 역인덱스(프로덕션에서는 사용하지 마십시오)에 대한 수정: 이제 역인덱스에 DROP INDEX를 수행하면 영구 저장소에서 관련 파일이 모두 삭제됩니다 #59040 (mochi).
  • query_factories_info에서 발생하는 data race 문제 수정 #59049 (Kseniia Sumarokova).
  • “Too many redirects” 오류에 대한 재시도 비활성화 #59099 (skyoct).
  • 시작되지 않은 데이터베이스를 종료할 때 발생하는 교착 상태 수정 #59137 (Sergei Trifonov).
  • 수정: 분산 쿼리에서 LIMIT BY 및 LIMIT #59153 (Igor Nikonov).
  • 널 허용 시간대 사용 시 toString 충돌 수정 #59190 (Yarik Briukhovetskyi).
  • 잘못된 파일 경로로 인해 Iceberg 메타데이터 처리 중 발생하는 중단 문제 수정 #59275 (Kruglov Pavel).
  • Rust 대상 select에서 아키텍처 이름 수정 #59307 (p1rattttt).
  • IN 절의 서브쿼리를 사용해 system.tables를 쿼리할 때 발생하던 “not-ready set” 관련 논리 오류를 수정했습니다. #59351 (Nikolai Kochetov).
마지막 수정일 2026년 6월 10일