기존에 원치 않는 동작이 있던 기능에 대한 수정입니다. Kafka/RabbitMQ/FileLog에 대한 direct select는 기본적으로 허용되지 않습니다. stream_like_engine_allow_direct_select를 설정하면 활성화할 수 있습니다. attached 상태인 materialized view가 있는 경우에는 이 설정을 활성화해도 direct select가 허용되지 않습니다. Kafka와 RabbitMQ에서는 direct select가 허용되더라도 기본적으로 메시지를 커밋하지 않습니다. direct select에서 커밋을 활성화하려면 스토리지 수준 설정 kafka{rabbitmq}_commit_on_select=1(기본값 0)을 사용해야 합니다. #31053 (Kseniia Sumarokova).
설정 이름 변경입니다. TSV/CSV 입력 형식에 사용자 지정 NULL 표현 지원을 추가했습니다. TSV/CSV/JSONCompactStringsEachRow/JSONStringsEachRow 입력 형식에서 Nullable(String) 역직렬화 문제를 수정했습니다. 이에 따라 output_format_csv_null_representation 및 output_format_tsv_null_representation의 이름을 format_csv_null_representation 및 format_tsv_null_representation으로 변경했습니다. #30497 (Kruglov Pavel).
이미 사용되지 않는 코드의 추가 지원 중단입니다. 이는 20.6보다 오래된 ClickHouse 버전을 사용 중인 경우에만 해당합니다. 20.6부터 여러 리더를 지원하므로 ReplicatedMergeTree에서 "리더 선출" 메커니즘이 제거되었습니다. 이전 버전에서 업그레이드하는 중이며 구버전 레플리카 중 하나가 리더인 경우, 업그레이드 후 서버가 시작되지 않습니다. 새 버전이 시작될 수 있도록 구버전 레플리카를 중지하십시오. 이후에는 20.6보다 오래된 버전으로 다운그레이드할 수 없습니다. #32140 (tavplubix).
CONSTRAINT ... ASSUME ...가 추가되었습니다(INSERT 중에는 검사를 수행하지 않음). 최적화를 더 쉽게 할 수 있도록 쿼리를 CNF로 변환하는 기능이 추가되었습니다(https://github.com/ClickHouse/ClickHouse/issues/11749). 제약 조건을 활용한 간단한 쿼리 재작성 기능이 추가되었습니다(현재는 단순 매칭만 지원하며, 추후 <,=,>… 도 지원하도록 개선될 예정입니다). 가능한 경우 무거운 컬럼을 가벼운 컬럼으로 대체하는 기능이 추가되었습니다. #18787 (Nikita Vasilev).
TLDR: 텍스트 형식의 완전성과 일관성이 크게 개선되었습니다.TSV, TSVRaw, CSV, JSONCompactEachRow, JSONCompactStringsEachRow 포맷을 리팩터링하고 코드 중복을 제거했으며, -WithNames 및 -WithNamesAndTypes 접미사가 붙은 포맷을 위한 기본 인터페이스를 추가했습니다. CSVWithNamesAndTypes, TSVRawWithNames, TSVRawWithNamesAndTypes, JSONCompactEachRowWIthNames, JSONCompactStringsEachRowWIthNames, RowBinaryWithNames 포맷을 추가했습니다. TSVWithNamesAndTypes, TSVRaw(WithNames/WIthNamesAndTypes), CSVWithNamesAndTypes, JSONCompactEachRow(WithNames/WIthNamesAndTypes), JSONCompactStringsEachRow(WithNames/WIthNamesAndTypes) 포맷에서 병렬 파싱을 지원합니다. RowBinaryWithNamesAndTypes 포맷에 대해 컬럼 매핑과 타입 검사를 지원합니다. <format_name>WIthNamesAndTypes 포맷에 기록된 타입이 테이블 구조와 일치하는지 검사할지 지정하는 input_format_with_types_use_header 설정을 추가했습니다. input_format_csv_empty_as_default 설정을 추가하고, CSV 형식에서는 input_format_defaults_for_omitted_fields 대신 이 설정을 사용하도록 했습니다(csv_empty_as_default는 이 설정으로 제어하면 안 되기 때문입니다). input_format_defaults_for_omitted_fields 설정의 사용 방식도 수정했습니다(이전에는 csv_empty_as_default로만 사용되었지만, 생략된 필드의 기본 표현식 계산을 제어해야 합니다). TSVRaw 포맷의 널 허용(Nullable) 입력/출력을 수정하여, 이 포맷이 TSV 삽입과 완전히 호환되도록 했습니다. input_format_null_as_default가 활성화된 경우 LowCardinality(Nullable)에 NULL을 삽입할 때 발생하던 문제를 수정했습니다(이전에는 실제 NULL 대신 기본값이 삽입되었습니다). JSONStringsEachRow/JSONCompactStringsEachRow 포맷의 문자열 역직렬화를 수정했습니다(문자열이 첫 번째 '\n' 또는 '\t'까지만 파싱되었습니다). Template 입력 형식에서 Raw 이스케이프 규칙을 사용할 수 있도록 했습니다. JSONCompactEachRow(WithNames/WIthNamesAndTypes) 입력 형식에 진단 정보를 추가했습니다. min_chunk_bytes_for_parallel_parsing 설정이 단일 행의 바이트 수보다 작은 경우 -WithNames 포맷의 병렬 파싱에서 발생하던 버그를 수정했습니다. #30178 (Kruglov Pavel). CustomSeparated 입력/출력 형식에서 컬럼 이름과 타입을 출력하고 파싱할 수 있도록 했습니다. TSVWithNames/WithNamesAndTypes와 유사한 CustomSeparatedWithNames/WithNamesAndTypes 포맷을 추가했습니다. #31434 (Kruglov Pavel).
더 큰 윈도우에서 exponentialMovingAverage보다 더 효과적인 윈도우 함수 exponentialTimeDecayedSum, exponentialTimeDecayedMax, exponentialTimeDecayedCount, exponentialTimeDecayedAvg가 도입되었습니다. 또한 더 다양한 사용 사례를 지원하게 되었습니다. #29799 (Vladimir Chebotarev).
일반 메트릭/태그된 메트릭에 대해 GraphiteMergeTree 롤업 규칙을 분리할 수 있도록 했습니다(선택적 rule_type 필드). #25122 (Michail Safronov).
remote()에서 과도한 DESC TABLE 요청을 제거했습니다(remote('127.1', system.one)의 경우, 즉 문자열 대신 db.table 식별자를 사용할 때 과도한 DESC TABLE 요청이 있었습니다). #32019 (Azat Khuzhin).
설정 optimize_functions_to_subcolumns가 활성화된 경우 함수 tupleElement가 서브컬럼을 읽도록 최적화했습니다. #31261 (Anton Popov).
설정 optimize_functions_to_subcolumns가 활성화된 경우 함수 mapContains가 서브컬럼 key를 읽도록 최적화했습니다. #31218 (Anton Popov).
설정 merge_tree_min_rows_for_concurrent_read_for_remote_filesystem 및 merge_tree_min_bytes_for_concurrent_read_for_remote_filesystem를 추가했습니다. #30970 (Kseniia Sumarokova).
Template/CustomSeparated 포맷에서 따옴표 이스케이프 규칙이 적용된 알 수 없는 field의 스키핑이 개선되었습니다. 이전에는 따옴표로 묶인 문자열만 건너뛸 수 있었지만, 이제는 모든 유형의 값을 건너뛸 수 있습니다. #32204 (Kruglov Pavel).
이제 clickhouse-keeper에 중복된 ID 또는 엔드포인트가 포함되어 있으면 시작되지 않으며, 구성 변경도 적용되지 않습니다. #31339을 수정했습니다. #32121 (alesapin).
max_execution_time 검사를 개선했습니다. timeout 검사가 누락되어 쿼리가 지나치게 오래 실행될 수 있던 일부 경우를 수정했습니다. #31636 (Raúl Marín).
잘못된 비밀번호 hash 때문에 users.xml을 로드할 수 없을 때 표시되는 예외 메시지가 개선되었습니다. 이 변경으로 #24126이 해결되었습니다. #31557 (Vitaly Baranov).
config에 이러한 매크로가 정의되어 있지 않으면, ReplicatedMergeTree 인수에서 매크로를 확장할 때 Replicated 데이터베이스 인수의 세그먼트 및 레플리카 이름을 사용합니다. #31471을 닫습니다. #31488 (tavplubix).
min/max/count 프로젝션 분석이 개선되었습니다. 이제 allow_experimental_projection_optimization이 활성화되면 가상 min/max/count 프로젝션을 파티션 키 컬럼과 함께 사용할 수 있습니다. #31474 (Amos Bird).
더 이상 사용되지 않는 설정이 변경되면 system.warnings에 경고가 표시됩니다. #31252 (tavplubix).
MergeTree의 백그라운드 정리 작업에 대한 백오프가 개선되었습니다. merge_tree_clear_old_temporary_directories_interval_seconds 및 merge_tree_clear_old_parts_interval_seconds 설정이 사용자 설정에서 MergeTree 설정으로 옮겨졌습니다. #31180 (tavplubix).
이제 모든 레플리카는 profile events 카운터에 대한 증분 정보만 클라이언트에 전송합니다. #31155 (Dmitry Novik). 그 결과 clickhouse-client의 --hardware_utilization 옵션을 사용할 수 있게 되었습니다.
기본적으로 clickhouse-client에서 여러 줄 편집을 사용할 수 있도록 했습니다. 이는 #31121를 해결합니다. #31123 (Amos Bird).
ClickHouse 딕셔너리 소스 내부의 로컬 세션은 더 이상 세션 로그로 이벤트를 전송하지 않습니다. 이로써 종료 시 발생할 수 있는 교착 상태(tsan 알림)를 해결했습니다. 또한 이 PR에서는 간헐적으로 실패하던 test_dictionaries_dependency_xml/도 수정했습니다. #31013 (Vitaly Baranov).
MySQL 및 PostgreSQL처럼 clickhouse-client에 \l, \d, \c 명령을 추가했습니다. #30876 (Pavel Medvedev).
clickhouse-local 또는 clickhouse-client의 경우: --query 또는 --queries-file과 함께 --interactive 옵션이 지정되면, 먼저 비대화형 모드와 같이 이를 실행한 다음 대화형 모드를 시작합니다. #30851 (Kseniia Sumarokova).
ZooKeeper에서 znode를 제거하는 중 DROP이 실패할 때 발생할 수 있는 "The local set of parts of X doesn't look like the set of parts in ZooKeeper" 오류를 수정했습니다. #30826 (Azat Khuzhin).
Avro 포맷이 Kafka에서 작동합니다. output_format_avro_rows_in_file 설정이 추가되었습니다. #30351 (Ilya Golshtein).
clickhouse-keeper 내부 통신의 기본 포트를 44444에서 9234로 변경했습니다. #30879를 해결했습니다. #31799 (alesapin).
Decimal 인수를 지원하는 transform 함수를 구현했습니다. #31839 (李帅).
hdfs url 구조를 추가로 검사하도록 하여, 잘못된 hdfs url로 인해 debug 서버에서 발생하는 abort와 release 서버에서 발생하는 DB::Exception: std::out_of_range: basic_string 오류를 수정했습니다. #31042 (Kruglov Pavel).
hdfs 테이블 함수/엔진에서 발생할 수 있는 assert 문제를 수정하고 테스트를 추가했습니다. #31036 (Kruglov Pavel).
ClickHouse가 cgroup 제한이 있는 컨테이너에서 실행될 때 메모리 사용량이 잘못 추정되던 문제가 있었습니다. #31157 (Pavel Medvedev).
default 표현식의 데이터 타입이 컬럼의 데이터 타입과 일치하지 않을 때 ALTER ... MATERIALIZE COLUMN ... 쿼리를 수정했습니다. #32348 (Anton Popov).
Decimal 인수가 있는 집계 함수 avgWeighted에서 발생하던 SIGFPE 충돌을 수정했습니다. #32053를 해결합니다. #32303 (tavplubix).
Dictionary 테이블이 같은 이름의 XML-dictionary를 참조하는 경우 Cannot attach 1 tables due to cyclic dependencies 오류로 서버가 시작되지 않을 수 있던 문제가 수정되었습니다. #31315를 수정했습니다. #32288 (tavplubix).
Quoted 이스케이프 규칙에서 Nullable(Float)의 NaN을 역직렬화할 때 발생하던 파싱 오류를 수정했습니다. #32190 (Kruglov Pavel).
XML 딕셔너리: 테이블 CREATE 쿼리에서 사용되는 식별자는 새 버전으로 업그레이드하는 과정에서 default_database로 수식될 수 있습니다. #31963을 해결했습니다. #32187 (Maksim Kita).
일부 레플리카에서 설정 replicated_can_become_leader가 비활성화된 경우, 쿼럼(quorum)과 함께 삽입할 때 활성 레플리카 수가 잘못 계산될 수 있었습니다. 이 문제가 수정되었습니다. #32157 (tavplubix).
Dictionaries: 사용자 지정 데이터베이스 쿼리에서 {condition}이 작동하지 않던 문제를 수정했습니다. #32117 (Maksim Kita).
cast_keep_nullable를 사용해 Nullable에서의 CAST를 수정했습니다 (toUInt32OrDefault(toNullable(toUInt32(1)))와 같은 경우 이전에는 PARAMETER_OUT_OF_BOUND 오류가 발생했습니다). #32080 (Azat Khuzhin).
일부 드문 경우에 Join Storage의 CREATE TABLE 문제를 수정했습니다. #31680을 해결했습니다. #32066 (SuperDJY).
part를 분리하는 과정에서 발생하던 Directory ... already exists and is not empty 오류를 수정했습니다. #32063 (tavplubix).
MaterializedMySQL (실험적 기능): MySQL의 DECIMAL 데이터가 잘못 해석되던 문제를 수정했습니다. #31990 (Håvard Kvålen).
FileLog (실험적 기능) 엔진에서 테이블 생성이 실패했을 때 메타데이터 디렉터리가 불필요하게 생성되던 문제가 수정되었습니다. 수정 #31962. #31967 (flynn).
일부 GET_PART 항목은 파트가 모든 레플리카에서 손실되고 같은 파티션에 다른 파트가 없는 경우 복제 큐에서 멈춰 있을 수 있습니다. 이 문제는 파티션 키가 정수 타입의 컬럼 또는 Date[Time]만 포함하는 경우 수정되었습니다. #31485를 수정했습니다. #31887 (tavplubix).
KeeperTCPHandler를 생성할 때 구성 경로를 keeper_server.session_timeout_ms에서 keeper_server.coordination_settings.session_timeout_ms로 변경했습니다. operation_timeout도 마찬가지입니다. #31859 (JackyWoo).
널 허용 기본 키(primary key)를 사용할 때 발생하는 널 허용 유형(Nullable type)의 잘못된 CAST 문제를 수정했습니다. (널 허용 기본 키는 권장되지 않는 기능이므로 사용하지 마십시오). 이 변경으로 #31075가 수정됩니다. #31823 (Amos Bird).
쿼리 프로파일러 비활성화 문제 수정(query_profiler_real_time_period_ns>0/query_profiler_cpu_time_period_ns>0인 경우 쿼리 종료 후에도 쿼리 프로파일러가 계속 활성화된 상태로 남아 있을 수 있었습니다). #31740 (Azat Khuzhin).
동시에 실행된 ATTACH PARTITION 쿼리에서 드물게 발생하던 segfault를 수정했습니다. #31738 (tavplubix).
출력에서 데이터와 진행 상황이 포함된 줄이 함께 섞일 때 발생하던 JSONEachRowWithProgress 출력 형식의 경쟁 상태(race condition)를 수정했습니다. #31736 (Kruglov Pavel).
ON CLUSTER 쿼리 실행 시, 지정한 클러스터 이름이 Replicated 데이터베이스 이름과 같은 경우 발생하던 there are no such cluster here 오류를 수정했습니다. #31723 (tavplubix).
이는 실험적 clickhouse-keeper 지원을 이미 사용 중인 경우에만 해당합니다. 이제 ClickHouse Keeper 스냅샷은 기본적으로 ClickHouse의 사용자 지정 LZ4 블록 압축 대신 ZSTD 코덱으로 압축됩니다. 이 동작은 compress_snapshots_with_zstd_format coordination 설정으로 비활성화할 수 있습니다(모든 quorum 레플리카에서 동일해야 함). 하위 호환성 문제는 매우 드물며, 새 노드가 이전 노드로 스냅샷을 전송할 때만 발생할 수 있습니다(복구 시 발생). 이전 노드는 ZSTD 포맷의 스냅샷을 읽을 수 없습니다. #29417 (alesapin).
새로운 기능
새로운 비동기 INSERT 모드에서는 삽입된 데이터를 누적했다가 백그라운드에서 단일 배치로 저장할 수 있습니다. 클라이언트에서는 쿼리에 데이터가 인라인으로 포함된 INSERT 쿼리나 별도 버퍼의 데이터(예: HTTP protocol을 통한 INSERT 쿼리)에 대해 async_insert를 설정하여 이 기능을 활성화할 수 있습니다. wait_for_async_insert가 true이면(기본값) 클라이언트는 데이터가 테이블에 플러시될 때까지 대기합니다. 서버 측에서는 async_insert_threads, async_insert_max_data_size, async_insert_busy_timeout_ms 설정으로 이를 제어합니다. #18282를 구현했습니다. #27537 (Anton Popov). #20557 (Ivan). 성능 관련 참고: 비동기 삽입을 사용하면 초당 약 10,000개의 개별 INSERT 쿼리를 처리할 수 있으므로, 초당 수백만 행 수준의 성능을 달성하려면 여전히 배치 단위로 삽입하는 것이 좋습니다.
clickhouse-local에 대화형 모드를 추가했습니다. 이제 서버에 연결하지 않고도 clickhouse-local만 실행하면 명령줄용 ClickHouse 인터페이스를 사용할 수 있으며, 파일과 외부 데이터 소스의 데이터를 처리할 수 있습니다. 또한 clickhouse-client와 clickhouse-local의 코드를 통합했습니다. #7203를 해결했습니다. #25516를 해결했습니다. #22401를 해결했습니다. #26231 (Kseniia Sumarokova).
실행형(스크립트 작성 가능) 사용자 정의 함수 지원이 추가되었습니다. 이러한 UDF는 어떤 프로그래밍 언어로든 작성할 수 있습니다. #28803 (Maksim Kita).
외부 데이터 원본에 대해 사전 정의된 연결을 허용합니다. 이를 통해 외부 데이터 원본을 사용할 때 자격 증명이나 주소를 지정하지 않아도 되며, 대신 이름으로 참조할 수 있습니다. #28367을 해결합니다. #28577 (Kseniia Sumarokova).
system 데이터베이스의 해당 테이블에 대응하는 SCHEMATA, TABLES, VIEWS, COLUMNS 뷰를 포함한 INFORMATION_SCHEMA 데이터베이스를 추가했습니다. #9770를 해결합니다. #28691 (tavplubix).
다차원 코사인 거리 및 유클리드 거리 함수와 L1, L2, Lp, Linf 거리 및 노름을 지원합니다. 튜플의 스칼라 곱과 튜플에 대한 다양한 산술 연산자도 지원합니다. 이로써 #4509가 완전히 해결되었으며, 그 이상도 포함됩니다. #27933 (Alexey Boykov).
INTO OUTFILE 및 FROM INFILE에 압축 및 압축 해제 지원을 추가했습니다(자동 감지 또는 추가적인 선택적 매개변수 사용). #27135 (Filatenkov Artur).
HTTP OPTIONS 요청에 CORS(Cross Origin Resource Sharing) 지원을 추가했습니다. 이제 Grafana가 별도 임시방편 없이 서버리스 요청과 함께 작동합니다. #18693를 해결합니다. #29155 (Filatenkov Artur).
함수 tokens가 추가되었습니다. 이 함수는 영숫자가 아닌 ASCII 문자를 구분자로 사용해 문자열을 토큰으로 분할할 수 있습니다. #29981 (Maksim Kita). 텍스트에서 ngram을 추출하는 함수 ngrams가 추가되었습니다. #29699를 해결합니다. #29738 (Maksim Kita).
유니코드 정규화 함수 normalizeUTF8NFC, normalizeUTF8NFD, normalizeUTF8NFKC, normalizeUTF8NFKD를 추가했습니다. #28633 (darkkeks).
FileLog 테이블 엔진을 사용해 ClickHouse에서 애플리케이션 로그 파일을 스트리밍 방식으로 활용할 수 있습니다. 로컬 파일 시스템의 추가 전용 로그와 로테이션된 로그를 위한 엔진으로, Kafka 또는 RabbitMQ 엔진과 유사합니다. #6953을 해결했습니다. #25969 (flynn) (Kseniia Sumarokova).
함수 getOSKernelVersion이 추가되었습니다. 이 함수는 OS 커널 버전을 나타내는 문자열을 반환합니다. #29755 (Memo).
MD4 및 SHA384 함수가 추가되었습니다. MD4는 더 이상 권장되지 않는 오래된 해시 함수이며 보안상 안전하지 않습니다. 따라서 일부 레거시 시스템에서 이미 MD4를 사용 중이고 정확히 동일한 결과를 얻어야 하는 드문 경우에만 사용할 수 있습니다. #29602 (Nikita Tikhomirov).
hsts_max_age를 설정 파일에서 양수로 지정하면 ClickHouse HTTP 서버에서 HSTS를 활성화할 수 있습니다. #29516 (凌涛).
테이블 컬럼의 서브컬럼도 DESCRIBE 쿼리 결과에 포함할 수 있게 했습니다(describe_include_subcolumns 설정으로 활성화할 수 있습니다). #28905 (Anton Popov).
Executable, ExecutablePool에 send_chunk_header 옵션이 추가되었습니다. 이 옵션이 true이면 청크 전에 줄바꿈이 포함된 청크 행 수 rows_count가 클라이언트로 전송됩니다. #28833 (Maksim Kita).
tokenbf_v1 및 ngram은 키가 String 또는 FixedSring 타입인 맵을 지원합니다. 이는 맵 키 필터를 사용하는 쿼리에서 데이터 스키핑을 개선합니다. sql CREATE TABLE map_tokenbf ( row_id UInt32, map Map(String, String), INDEX map_tokenbf map TYPE ngrambf_v1(4,256,2,0) GRANULARITY 1 ) Engine=MergeTree() Order by id 위 테이블에서는 쿼리 select * from map_tokebf where map['K']='V' 실행 시 키 A를 포함하지 않는 그레뉼을 스킵합니다. 물론 스킵되는 행 수는 설정한 granularity 및 index_granularity에 따라 달라집니다. #28511 (凌涛).
FixedString 및 String 데이터 타입에 비트 시프트 연산이 추가되었습니다. 이로써 #27763가 해결되었습니다. #28325 (小路).
데이터베이스 엔진 MaterializedPostgreSQL에서 PostgreSQL 테이블을 복제에 동적으로 추가 및 삭제하는 기능을 지원합니다. 데이터베이스 설정에 대한 ALTER를 지원합니다. #27573을 해결했습니다. #28301 (Kseniia Sumarokova).
문자열 파싱에 실패할 경우 사용자가 기본값(NULL이 아님)을 지정할 수 있는 함수 toUUIDOrDefault, toUInt8/16/32/64/256OrDefault, toInt8/16/32/64/128/256OrDefault를 추가했습니다. #21330 (taiyang-li).
성능 개선
백그라운드 머지는 서로 선점할 수 있으며, 적절한 우선순위에 따라 스케줄됩니다. 이제 오래 실행되는 머지가 짧은 머지의 진행을 가로막지 않습니다. 이는 머지 실행을 더 효율적으로 스케줄링하고 제어하기 위해 필요합니다. 이를 통해 "Too many parts" 오류가 발생할 가능성이 줄어듭니다. #22381. #25165 (Nikita Mikhaylov). background pool의 스레드 수보다 많은 머지와 뮤테이션을 실행할 수 있는 기능이 추가되었습니다. 머지와 뮤테이션은 크기에 따라(작을수록 우선순위가 높음) 단계적으로 실행됩니다. 실행할 작업 수와 스레드 수의 비율은 설정 background_merges_mutations_concurrency_ratio로 제어되며, 기본값은 2입니다. #29140 (Nikita Mikhaylov).
원격 파일 시스템에 비동기 읽기를 사용할 수 있도록 했습니다. 원격 파일 시스템에서 읽는 동안 seek 횟수를 줄였습니다. 그 결과 성능이 크게 향상되었으며, 특정 조건에서는 실험적 web 및 s3 디스크가 EBS보다 더 빠르게 동작합니다. #29205 (Kseniia Sumarokova). 한편, web 디스크 유형(웹 서버에서 호스팅되는 정적 데이터셋)은 실험적 단계에서 벗어나 프로덕션 사용이 가능한 상태가 되었습니다.
clickhouse-client에서 INTO OUTFILE을 사용하는 쿼리는 여러 스레드를 사용합니다. INTO OUTFILE 사용 시 진행률 표시줄이 깜빡이던 문제를 수정했습니다. 이로써 #30873가 해결되었습니다. 이로써 #30872가 해결되었습니다. #30886 (alexey-milovidov).
일부 타입의 SELECT 쿼리에서 디스크로부터 읽는 중복된 압축 데이터의 양을 줄였습니다(MergeTree 엔진 계열에만 해당). #30111 (alesapin).
MergeTree 테이블 엔진 제품군에서 압축된 블록을 읽는 과정의 중복 seek 호출 일부를 제거했습니다. #29766 (alesapin).
기본 키(primary key) 순서에 따른 집계 성능을 개선했습니다(설정 optimize_aggregation_in_order가 활성화된 경우). #30266 (Anton Popov).
이제 ClickHouse는 외부 S3와 통신할 때 DNS 캐시를 사용합니다. #29999 (alesapin).
외부 데이터베이스(예: MySQL)에 IS NULL/IS NOT NULL 푸시다운 지원을 추가했습니다. #29463 (Azat Khuzhin). isNull/isNotNull을 IS NULL/IS NOT NULL로 변환하도록 개선했습니다(외부 DB, 예: MySQL). #29446 (Azat Khuzhin).
Decimal 컬럼의 필터링(WHERE 연산) 성능을 개선했습니다. #30431 (Jun Jin).
더 높은 성능의 popcnt/ctz 구현을 사용해 필터 연산의 분기 코드를 제거했습니다. #29881 (Jun Jin).
SSE/AVX2/AVX512 명령어를 사용해 all in one 함수의 filter 바이트마스크 생성기(WHERE 연산자에 사용)를 개선했습니다. 기본적으로 ClickHouse는 SSE만 사용하므로 커스텀 빌드에만 해당합니다. #30014 (jasperzhu). #30670 (jasperzhu).
SQL UDF가 여러 가지로 개선되었습니다. 이제 SQL 사용자 정의 함수를 조작하는 쿼리에서 ON CLUSTER 절을 지원합니다. 예시 CREATE FUNCTION test_function ON CLUSTER 'cluster' AS x -> x + 1;. #30666을 해결했습니다. #30734 (Maksim Kita). CREATE OR REPLACE, CREATE IF NOT EXISTS 구문을 지원합니다. #30454 (Maksim Kita). DROP IF EXISTS 지원이 추가되었습니다. 예시 DROP FUNCTION IF EXISTS test_function. #30437 (Maksim Kita). 람다를 지원합니다. 예시 CREATE FUNCTION lambda_function AS x -> arrayMap(element -> element * 2, x);. #30435 (Maksim Kita). clickhouse-local에서 SQL 사용자 정의 함수를 지원합니다. #30179 (Maksim Kita).
Date32를 Date, DateTime, DateTime64 및 String과 비교할 때의 문제를 수정했습니다. #30219 (liang.huang).
MergeTree 테이블에서 SAMPLE BY 표현식을 제거할 수 있도록 했습니다 (ALTER TABLE <table> REMOVE SAMPLE BY). #30180 (Anton Popov).
이제 Keeper는 (clickhouse-server의 일부로) 다른 노드에 연결할 수 있으면 비동기적으로 시작됩니다. #30170 (alesapin).
이제 clickhouse-client에서 네이티브 여러 줄 편집을 지원합니다. #30143 (Amos Bird).
polygon 딕셔너리(역방향 지오코딩): setting store_polygon_key_column = true인 경우 SELECT 쿼리 메서드를 사용해 딕셔너리 내용을 읽을 수 있도록 지원을 추가했습니다. #30090을 해결했습니다. #30142 (Maksim Kita).
머지 중 메모리 사용량을 프로파일링할 수 있도록 mutate/merge 작업 중 max_untracked_memory/memory_profiler_step/memory_profiler_sample_probability를 적용합니다. #29681 (Azat Khuzhin).
쿼리 난독화 도구: clickhouse-format --obfuscate가 이제 더 다양한 유형의 쿼리를 처리할 수 있습니다. #29672 (alexey-milovidov).
다음 문제를 해결했습니다: clickhouse-format --obfuscate가 내장 딕셔너리(함수 regionTo...)가 포함된 쿼리를 처리하지 못하던 문제입니다. #29667 (alexey-milovidov).
기본 listen_backlog 값을 늘렸습니다(최신 Linux 커널의 기본값에 맞추기 위해). #29643 (Azat Khuzhin).
server 설정 dictionaries_config, models_config, user_defined_executable_functions_config가 변경되면 Dictionaries, 모델, 사용자 정의 실행형 함수를 다시 로드합니다. #28142를 해결합니다. #29529 (Maksim Kita).
프로젝션 이름에 대한 불필요한 제한이 제거되었습니다. 이제 프로젝션 이름도 tmp_로 시작할 수 있습니다. #29520 (Amos Bird).
중첩된 서브쿼리가 포함된 뮤테이션에서 발생하던 There is no query or query context has expired 오류를 수정했습니다. 테이블이 복제된 상태이고 allow_nondeterministic_mutations 설정이 비활성화되어 있으면 뮤테이션에서 서브쿼리를 허용하지 않습니다. #29495 (tavplubix).
런타임 중에 max_concurrent_queries의 설정 변경 사항을 적용할 수 있습니다(재시작할 필요가 없습니다). #29414 (Raúl Marín).
인메모리 파트를 FREEZE할 수 있도록 지원을 추가했습니다(백업용). #29376 (Mo Xuan).
clickhouse-benchmark에 초기 query_id를 전달하도록 했습니다(이전에는 clickhouse-benchmark를 통해 원격 쿼리를 실행하면 세그먼트의 쿼리가 initial_query_id를 통해 초기 쿼리와 연결되지 않았습니다). #29364 (Azat Khuzhin).
스킵 인덱스 tokenbf_v1 및 ngrambf_v1에 String 또는 FixedString 타입의 키를 사용하는 Array 데이터 타입 지원이 추가되었습니다. #29280 (Maksim Kita). 스킵 인덱스 tokenbf_v1 및 ngrambf_v1에 String 또는 FixedString 타입의 키를 사용하는 Map 데이터 타입 지원이 추가되었습니다. 작성자 @lingtaolf. #29220 (Maksim Kita).
clickhouse-keeper: ZooKeeper 로그(스냅샷 제외)로 복원할 때 일부 데이터 손실을 일으킬 수 있는 clickhouse-keeper-converter의 버그를 수정했습니다. #29030 (小路). ZooKeeper 로그가 잘못 역직렬화될 수 있는 clickhouse-keeper-converter의 버그를 수정했습니다. #29071 (小路).
gRPC 호출을 처리하는 동안 쿼리 처리가 끝날 때 쿼리 ID와 세션 ID를 해제하던 문제를 수정했습니다. #29954 (Vitaly Baranov).
간헐적으로 실패하는 테스트를 해결하기 위해 AccessControlManager 종료 로직을 수정했습니다. #29951 (Vitaly Baranov).
HDFS에서 읽는 과정에서 발생하던 assertion 실패를 수정했습니다. 디버그 환경의 테스트에서 실행할 수 있도록 libhdfs3 라이브러리를 업데이트했습니다. #29251을 해결했습니다. #27814을 해결했습니다. #29276 (Kseniia Sumarokova).
ClickHouse를 Musl로 정적 빌드할 수 있습니다. 이 기능은 Experimental로 추가되었으며, odbc-bridge, library-bridge, CatBoost 통합, 일부 라이브러리의 빌드는 지원하지 않습니다. #30248 (alexey-milovidov).
PowerPC(powerpc64le)용 크로스 빌드를 추가했습니다. 이로써 #9589가 해결됩니다. AArch64 및 PowerPC에서 MySQL과 상호 운용할 수 있도록 지원을 활성화했습니다. 이로써 #26301이 해결됩니다. #30010 (alexey-milovidov).
크로스 컴파일 툴체인에는 필요한 파일만 남기고, 이를 서브모듈로 포함했습니다(이전에는 tarball로 다운로드했습니다). #29974 (alexey-milovidov).
ClickHouse의 select statement parser에 구조 인식 퍼징 기법을 구현했습니다. #30012 (Paul).
템플릿 코드의 컴파일 속도를 높이기 위해 clang에서 Experimental constexpr 표현식 평가기를 활성화했습니다. #29668 (myrrc).
새 심볼을 사용하지 않고도 더 최신 버전의 glibc로 컴파일할 수 있는 기능을 추가했습니다. #29594 (Azat Khuzhin).
clang 최적화 옵션으로 Debug 빌드 바이너리 크기를 줄였습니다. #28736 (flynn).
이제 CI용 모든 이미지는 별도의 dockerhub 저장소에 배치됩니다. #28656 (alesapin).
positionCaseInsensitiveUTF8 및 countSubstringsCaseInsensitiveUTF8와 같은 UTF-8 string에서 대소문자를 구분하지 않고 검색하는 함수는 매우 드물게 실제로는 일치하지 않는 substring을 찾는 경우가 있었는데, 이 문제가 수정되었습니다. #30663 (tavplubix).
ReplicatedMergeTree에서 ZooKeeper 경로로부터 보조 ZooKeeper 이름을 추출할 때의 모호성을 해결했습니다. 이전에는 ZooKeeper 경로에 콜론이 포함되어 있으면 Unknown auxiliary ZooKeeper name 오류로 인해 서버가 시작되지 않을 수 있었습니다. #29052를 수정했습니다. 또한 이전에는 슬래시로 시작하지 않는 ZooKeeper 경로를 지정할 수 있었지만, 이제 이는 Deprecated 상태이며 이러한 경로로는 새 테이블을 생성할 수 없습니다. 또한 보조 ZooKeeper 이름에는 슬래시와 콜론을 사용할 수 없습니다. #30822 (tavplubix).
어떤 이유로든 localBackup이 실패한 경우 임시 디렉터리를 정리합니다. #30797 (ianton-ru).
비복제 MergeTree에서 REPLACE/MOVE PARTITION과 백그라운드 머지 사이의 레이스 컨디션을 수정했습니다. 이 문제로 인해 이동되거나 대체된 데이터의 일부가 파티션에 남을 수 있었습니다. #29327을 수정했습니다. #30717 (tavplubix).
max_read_buffer_size = 0인 MergeTree에서 읽을 때 발생하던 문제를 수정했습니다(사용자가 스스로 발등을 찍으려는 경우) (예외 Can't adjust last granule, LOGICAL_ERROR, 또는 데이터 손실까지 초래할 수 있습니다). #30192 (Azat Khuzhin).
min_bytes_to_use_direct_io 사용 시 발생하던 pread_fake_async/pread_threadpool 문제를 수정했습니다. #30191 (Azat Khuzhin).
INSERT SELECT가 널 허용 컬럼을 기준으로 MATERIALIZED 컬럼을 잘못 채우던 문제를 수정했습니다. #30189 (Azat Khuzhin).
함수 initializeAggregation에서 널 허용 인수를 지원하도록 했습니다. #30177 (Anton Popov).
GLOBAL IN 및 WITH TOTALS를 사용하는 쿼리에서 Port is already connected 오류를 수정했습니다. 21.9 및 21.10에만 해당합니다. #30086 (Nikolai Kochetov).
MOVE PARTITION과 MergeTree의 머지/뮤테이션 간 경쟁 상태를 수정했습니다. #30074 (Azat Khuzhin).
삭제한 Memory 데이터베이스가 서버 재시작 후 다시 나타나는 문제가 수정되었습니다(#29795). 또한 Ordinary 데이터베이스를 삭제할 때 Directory not empty 오류가 발생하는 경우의 우회책으로 force_remove_data_recursively_on_drop 설정이 추가되었습니다(클라우드 환경에서는 남아 있는 데이터를 수동으로 제거할 수 없기 때문입니다). #30054 (tavplubix).
MaterializedMySQL: MySQL과의 연결이 끊겼을 때 트랜잭션의 일부만 처리되던 문제를 수정했습니다. #29837 (Håvard Kvålen).
커널의 버그로 추정되는 원인으로 인해 극히 드물게 발생할 수 있는 Timeout exceeded: elapsed 18446744073.709553 seconds 오류를 방지합니다. #29154를 수정했습니다. #29811 (tavplubix).
ATTACH TABLE ... FROM 'path' 쿼리에서 경로로 사용할 문자열 리터럴 대신 문자열이 아닌 리터럴을 사용할 때 발생하는 잘못된 형변환을 수정했습니다. 이 문제로 인해 초기화되지 않은 메모리를 읽을 수 있습니다. #29790 (alexey-milovidov).
GROUP BY 수행 중 LowCardinality에 대한 동시 접근 문제를 수정했습니다(Buffer 테이블과 함께 사용하면 문제가 생길 수 있습니다). #29782 (Azat Khuzhin).
세그먼트에 <= 21.3 및 >= 21.4 버전이 혼재되어 있고, GROUP BY 키가 모두 고정 크기인 여러 컬럼으로 이루어져 있으며, 2단계 집계가 활성화된 경우(group_by_two_level_threshold 및 group_by_two_level_threshold_bytes 참조) 분산 쿼리에서 발생하던 잘못된 GROUP BY(결과에 동일한 키를 가진 여러 행이 나타나는 문제)를 수정했습니다. #29580을 수정합니다. #29735 (Nikolai Kochetov).
DEFAULT 표현식에서 x.y.z...와 같은 잘못된 테이블 식별자를 사용할 때 ALTER MODIFY 쿼리에서 드물게 발생하던 segfault를 수정했습니다. #29184를 해결했습니다. #29573 (alesapin).
GROUP BY WITH TOTALS HAVING에서 nullptr 역참조 문제를 수정했습니다(HAVING의 컬럼이 선택되지 않은 경우). #29553 (Azat Khuzhin).
Join 테이블 엔진의 테이블에서 읽기와 쓰기를 동시에 수행할 때 발생하는 교착 상태를 방지합니다. #29544 (Raúl Marín).
pathStartsWith 검사에서 std::mismatch 사용과 관련된 문제를 수정했습니다. 이는 The behavior is undefined if the second range is shorter than the first range. 때문입니다. #29531 (Kseniia Sumarokova).
ODBC bridge에 오류 Invalid cursor state에 대한 재시도 기능을 추가했습니다. 이 오류는 재시도 가능한 오류입니다. #29473를 해결합니다. #29518 (Kseniia Sumarokova).
Lazy 데이터베이스를 로드할 때 테이블 이름이 잘못 파싱되던 문제를 수정했습니다. #29456 문제를 해결합니다. #29476 (tavplubix).
새 레플리카를 추가하는 동안 복제된 데이터베이스에서 DDL 쿼리가 멈춰 있는 문제를 수정했습니다. #29328 (Kevin Michel).
연결 타임아웃(send_timeout/receive_timeout) 문제를 수정했습니다. #29282 (Azat Khuzhin).
테이블 컬럼 중 하나에 대소문자를 구분하지 않는 함수를 사용하는 기본 표현식이 있을 때, ReplicatedMergeTree의 새 레플리카를 생성하거나 기존 레플리카를 다시 만드는 과정에서 발생할 수 있는 Table columns structure in ZooKeeper is different from local table structure 예외를 수정했습니다. #29266 (Anton Popov).
Database doesn't exist error (UNKNOWN_DATABASE)를 Attempt to read after eof (ATTEMPT_TO_READ_AFTER_EOF) 대신 일반적인 오류로 클라이언트에(TCP를 통해) 전송합니다. #29229 (Azat Khuzhin).
Avro 입력 형식에서 LowCardinality(Nullable) 타입의 컬럼에 삽입할 때 발생하던 segfault를 수정했습니다. #29132 (Kruglov Pavel).
서버 간 시크릿을 사용하는 경우 이전 자격 증명이 재사용되지 않도록 했습니다(이전에는 해당 cluster에 서버 간 시크릿이 구성된 분산 테이블로 Buffer/Kafka를 통해 INSERT하기 전에 해당 connection에 대해 이전에 설정된 사용자가 재사용될 수 있었습니다). #29060 (Azat Khuzhin).
딕셔너리와 조인할 때 any_join_distinct_right_table_keys를 처리하고 #29007을 해결합니다. #29014 (Vladimir C).
alias 컬럼으로 join할 때 발생하던 "Not found column … in block" 오류를 수정하고 #26980을 해결했습니다. #29008 (Vladimir C).
모든 레플리카를 강제 재부팅한 후 ReplicatedMergeTree 레플리카 간 데이터가 서로 불일치할 수 있는 매우 드문 경우를 수정했습니다. 오류는 Part ... intersects (previous|next) part ...와 같이 표시됩니다. #28817 (alesapin).
connection 사용 가능 여부를 더 잘 확인하고, 만일에 대비해 RabbitMQ 종료 시 발생하는 예외도 포착하도록 개선했습니다. #28797 (Kseniia Sumarokova).
ReplicatedMergeTreeQueue의 경미한 경쟁 상태를 수정했습니다. 사용자에게는 보이지 않지만, 미묘한 버그로 이어질 수 있습니다. #28734 (alesapin).
예외 발생 시 부분적으로 생성된 집계 프로젝션이 있는 SELECT에서 발생할 수 있는 충돌을 수정했습니다. #28700 (Amos Bird).
전달된 매개변수가 잘못되었을 때 분산 테이블 생성 중 발생하던 코어 덤프 문제를 수정했습니다. #28686 (Zhiyong Wang).
system.processes 테이블에 Settings.Names 및 Settings.Values 별칭을 추가했습니다. #28685 (Vitaly).
S2 Geometry 라이브러리 지원: s2RectAdd 및 s2RectContains 함수에 필요한 인수 개수를 바로잡았습니다. #28663 (Bharat Nallan).
Nullable 또는 LowCardinality 기본 키를 사용할 때 잘못된 상수 타입 변환이 발생하는 문제를 수정했습니다. #28636 (Amos Bird).
이제 다음 MergeTree 테이블 수준 설정인 replicated_max_parallel_sends, replicated_max_parallel_sends_for_table, replicated_max_parallel_fetches, replicated_max_parallel_fetches_for_table은 더 이상 아무런 역할을 하지 않습니다. 이 설정들은 애초에 제대로 동작하지 않았으며, max_replicated_fetches_network_bandwidth, max_replicated_sends_network_bandwidth, background_fetches_pool_size로 대체되었습니다. #28404 (alesapin).
새로운 기능
람다 표현식으로 사용자 정의 함수(UDF)를 생성하는 기능이 추가되었습니다. 구문은 CREATE FUNCTION {function_name} as ({parameters}) -> {function core}입니다. 예시: CREATE FUNCTION plus_one as (a) -> a + 1. 작성자: @Realist007. #27796 (Maksim Kita) #23978 (Realist007).
Executable 스토리지 엔진과 executable 테이블 함수가 추가되었습니다. 이를 통해 외부 스크립트를 사용해 데이터를 스트리밍 방식으로 처리할 수 있습니다. #28102 (Maksim Kita) (ruct).
ExecutablePool 스토리지 엔진이 추가되었습니다. Executable과 비슷하지만 장시간 실행되는 프로세스 풀을 사용합니다. #28518 (Maksim Kita).
정적 파일 형태로 웹 서버에 읽기 전용 테이블을 저장할 수 있는 web 디스크 유형입니다. #23982를 참조하십시오. #25251 (Kseniia Sumarokova). 이 기능은 주로 공유 스토리지 작업 테스트를 쉽게 하고 데이터셋을 손쉽게 가져오기 위해 필요합니다. 21.11 릴리스 전에는 사용을 권장하지 않습니다.
새로운 명령 BACKUP 및 RESTORE가 추가되었습니다. #21945 (Vitaly Baranov). 이 기능은 아직 개발 중이며 현재 버전에서 사용하도록 설계되지 않았습니다.
minmax 인덱스를 위한 가상 프로젝션을 생성합니다. 이제 allow_experimental_projection_optimization이 활성화되면, 가능한 경우 쿼리가 데이터를 읽는 대신 minmax 인덱스를 사용합니다. #26286 (Amos Bird).
sequenceMatch 및 sequenceCount에 두 가지 검사를 도입해, 시퀀스 패턴의 결정적 부분 일부가 이벤트 목록에 없을 때 조기에 종료할 수 있도록 했습니다. 이 변경으로 이전에는 연산 한도에 도달해 실패하던 많은 쿼리를 처리할 수 있게 되었고, 전반적으로 파이프라인 속도도 향상되었습니다. #27729 (Jakub Kuklis).
이항 함수, 특히 0이 아닌 상수에 대한 나눗셈의 항상 단조(monotonic) 정보를 활용해 프라이머리 키 분석을 강화했습니다. #28302 (Amos Bird).
비밀번호를 재설정하는 방법에 대한 대화형 문서를 clickhouse-client에 추가했습니다. 사용자가 ClickHouse를 설치하고 비밀번호를 설정한 직후 바로 잊어버리는 경우에 유용합니다. #27750를 참조하십시오. #27903 (alexey-milovidov).
수직 병합 시 미리 정의된 "rows_sources" 대신 실제 tmp 파일을 사용합니다. 이렇게 하면 tmp 디스크에 불필요한 디렉터리가 생성되는 일을 방지할 수 있습니다. #28299 (Amos Bird).
clickhouse-server.service에서 export env LIBHDFS3_CONF를 사용하는 대신 서버 구성에 libhdfs3_conf를 추가했습니다. 이는 HDFS와의 상호작용을 구성하기 위한 것입니다. #28268 (Zhichang Yu).
예기치 않은 예외(Part %name% doesn't exist)를 유발할 수 있는 Temporary 상태 파트의 제거 문제를 수정했습니다. #23661을 수정합니다. #28221#28221) (Azat Khuzhin).
zookeeper_log.address를 수정하고(이 PR의 첫 번째 패치 전에는 주소가 항상 ::로 표시되었습니다), 이 컬럼에 대한 getpeername(2) 호출 횟수도 줄였습니다(zookeeper_log에 엔트리가 추가될 때마다 getpeername()이 호출되므로, 이를 방지하기 위해 이 주소를 zookeeper 클라이언트에 캐시합니다). #28212 (Azat Khuzhin).
연산자 []의 인덱스와 Map 타입 키 간의 암시적 변환을 지원합니다(예: 서로 다른 Int 타입, String, FixedString). #28096 (Anton Popov).
빈 집합(empty set)에서 상수 키로 그룹화할 때의 동작을 제어하는 설정 empty_result_for_aggregation_by_constant_keys_on_empty_set을 추가했습니다. 이는 #6842의 기존 동작을 복원하기 위한 것입니다. #27932 (Amos Bird).
replication_wait_for_inactive_replica_timeout 설정이 추가되었습니다. 이 설정으로 비활성 레플리카가 ALTER/OPTIMZE/TRUNCATE 쿼리를 실행할 때까지 대기할 시간을 지정할 수 있습니다(기본값은 120초). replication_alter_partitions_sync가 2이고 일부 레플리카가 replication_wait_for_inactive_replica_timeout초를 넘도록 활성 상태가 아니면 UNFINISHED 예외가 발생합니다. #27931 (tavplubix).
APPLY 컬럼 변환기에서 2개 이상의 인수를 받는 함수를 적용할 수 있도록 람다 인수를 지원합니다. 이는 #27877를 위한 변경입니다. #27901 (Amos Bird).
MaterializedMySQL의 내부 DDL에 대한 DROP TABLE에서 발생하는 UUID 중복 문제를 수정했습니다. MaterializedMySQL은 실험적 기능입니다. #28533 (Azat Khuzhin).
Nested 컬럼과, 이름에 점이 있고 Nested와 동일한 접두사를 갖는 스칼라 컬럼이 함께 있는 테이블에서 select할 때 발생하던 There is no subcolumn 오류를 수정했습니다(예: n.id UInt32, n.arr1 Array(UInt64), n.arr2 Array(UInt64)). #28531 (Anton Popov).
ReplicatedVersionedCollapsingMergeTree의 ALTER 후 Existing table metadata in ZooKeeper differs in sorting key expression. 오류가 발생할 수 있던 버그를 수정했습니다. #28515를 해결했습니다. #28528 (alesapin).
분산 DDL 큐를 백그라운드에서 처리할 때 발생할 수 있던 ZooKeeper watch 누수 가능성(경미한 문제)을 수정했습니다. #26036을 해결합니다. #28446 (tavplubix).
새로운 clickhouse-keeper 도구에 여러 수정 사항이 적용되었습니다. 클라이언트가 요청-응답보다 먼저 watch 응답을 받을 수 있는 드문 경우에 발생하던 clickhouse-keeper 버그를 수정했습니다. #28197 (alesapin). 하위 항목에 대한 set 요청으로 목록 watch(getChildren)가 트리거될 때 발생하던 clickhouse-keeper의 잘못된 동작을 수정했습니다. #28190 (alesapin). clickhouse-keeper 설정 변경으로 인해 로그가 유실되고 서버가 멈출 수 있던 드문 경우를 수정했습니다. #28360 (alesapin). rotate_logs_interval이 감소할 때 로그가 무한히 생성될 수 있는 clickhouse-keeper 버그를 수정했습니다. #28152 (alesapin).
빌드/테스트/패키징 개선
Stress Test에서 Thread Fuzzer를 활성화했습니다. Thread Fuzzer는 thread 스케줄링의 더 다양한 순서를 테스트해 더 많은 잠재적 문제를 발견할 수 있게 해주는 ClickHouse 기능입니다. 이 변경으로 #9813이 해결되었습니다. 이 변경으로 #9814가 해결되었습니다. 이 변경으로 #9515가 해결되었습니다. 이 변경으로 #9516가 해결되었습니다. #27538 (alexey-milovidov).
테스트 환경용 새 로그 레벨 test를 추가했습니다. 기본 trace보다도 더 자세한 정보를 출력합니다. #28559 (alesapin).
ubuntu apt 리포지토리를 일시적으로 ru.archive.ubuntu.com 미러로 전환했습니다. 기본 리포지토리인 archive.ubuntu.com이 CI 환경에서 응답하지 않기 때문입니다. #28016 (Ilya Yatsishin).
ClickHouse 릴리스 v21.9, 2021-09-09
하위 호환되지 않는 변경 사항
Decimal 타입의 텍스트 표현에서 후행 0을 출력하지 않습니다. 예시: scale이 6인 decimal은 1.230000 대신 1.23으로 출력됩니다. 이 변경으로 #15794가 해결됩니다. 애플리케이션이 어떤 방식으로든 후행 0에 의존하고 있었다면 약간의 비호환성이 발생할 수 있습니다. 출력 형식의 serialization은 output_format_decimal_trailing_zeros 설정으로 제어할 수 있습니다. toString 구현과 String으로 캐스팅하는 동작은 조건 없이 변경됩니다. #27680 (alexey-milovidov).
상태가 다른 매개변수를 사용하는 집계 함수로 생성된 경우, 해당 집계 함수 상태에 -Merge combinator가 적용된 매개변수형 집계 함수를 적용할 수 없도록 변경했습니다. 예를 들어 fooState(42)(x)의 상태는 fooMerge(s) 또는 fooMerge(123)(s)로 finalize할 수 없으며, fooMerge(42)(s)처럼 매개변수를 명시적으로 지정해야 하고 그 값도 같아야 합니다. 이는 finalize에만 매개변수를 사용하는 quantile, sequence* 등의 일부 특수 집계 함수에는 영향을 주지 않습니다. #26847 (tavplubix).
clickhouse-local에서는 포트가 있는 로컬 주소를 항상 원격 주소로 처리합니다. #26736 (Raúl Marín).
일부 복잡한 쿼리에서 컬럼 alias가 표현식 이름과 동일할 경우 잘못된 cast가 발생할 수 있던 문제를 수정했습니다. 이 변경으로 #25447가 해결됩니다. 또한 #26914도 해결됩니다. 이 수정은 하위 호환되지 않을 수 있습니다. 이름이 같은 서로 다른 표현식이 있으면 예외가 발생합니다. enable_optimize_predicate_expression이 설정된 일부 드문 경우에는 문제가 될 수 있습니다. #26639 (alexey-milovidov).
이제 스칼라 subquery는 해당 타입이 널 허용일 수 있으면 항상 널 허용 결과를 반환합니다. 빈 subquery의 결과는 Null이어야 하므로 이 변경이 필요합니다. 이전에는 호환되지 않는 타입에 대한 오류가 발생할 수 있었습니다(타입 추론은 스칼라 subquery를 실행하지 않으므로 널 비허용 타입을 사용할 수 있었습니다). 빈 결과를 반환하는 스칼라 subquery 중 널 허용로 변환할 수 없는 것(Array 또는 Tuple 등)은 이제 오류를 발생시킵니다. #25411을 수정합니다. #26423 (Nikolai Kochetov).
here document용 구문을 도입했습니다. 예시 SELECT $doc$ VALUE $doc$. #26671 (Maksim Kita). 이 변경은 쿼리에 $를 포함한 식별자가 있는 경우 하위 호환되지 않습니다 #28768.
이제 인덱스가 isNull 및 isNotNull을 포함한 널 허용 타입을 처리할 수 있습니다. #12433 및 #12455 (Amos Bird), 그리고 #27250 (Azat Khuzhin). 하지만 이 변경에는 디스크 저장 포맷 변경이 수반되므로, 새 서버는 이전 데이터를 읽을 수 있어도 이전 서버는 새 데이터를 읽을 수 없습니다. 또한 MINMAX data skipping indices가 있는 경우 새 인덱스는 .idx2 확장자를 사용하고 이전에는 .idx를 사용했기 때문에 Data after mutation/merge is not byte-identical 오류가 발생할 수 있습니다. 따라서 이 경우 기존의 모든 레플리카 업데이트를 미루지 않아야 합니다. 그렇지 않으면 이전 레플리카(<21.9)가 21.9+의 새 레플리카에서 데이터를 다운로드할 때 다운로드한 part에 인덱스를 적용할 수 없습니다.
새 기능
함수의 단락 평가 구현으로 #12587가 해결되었습니다. 함수의 단락 평가를 구성하기 위한 설정 short_circuit_function_evaluation이 추가되었습니다. #23367 (Kruglov Pavel).
클라이언트가 서버에 연결되면 서버에 이미 수집된 모든 경고에 대한 정보를 받습니다. (--no-warnings 옵션을 사용하면 이 기능을 비활성화할 수 있습니다.) 서버 구성에 관한 경고를 수집하기 위해 system.warnings 테이블을 추가했습니다. #26246 (Filatenkov Artur). #26282 (Filatenkov Artur).
bitmapSubsetOffsetLimit(bitmap, offset, cardinality_limit) 함수를 추가했습니다. 이 함수는 비트맵의 부분집합을 생성하고, offset만큼 건너뛴 뒤 결과를 cardinality_limit개로 제한합니다. #27234 (DHBin).
EXPLAIN 쿼리에 이제 EXPLAIN ESTIMATE ... 모드가 추가되어 MergeTree 테이블에서 읽는 행 수, 마크, 파트 정보를 표시합니다. #23941를 해결합니다. #26131 (fastio).
system.zookeeper_log 테이블이 추가되었습니다. ZooKeeper 클라이언트의 모든 작업이 이 테이블에 기록됩니다. #25449을 구현합니다. #26129 (tavplubix).
HDFS 스토리지의 ReplicatedMergeTree를 위한 zero-copy 복제. #25918 (Zhichang Yu).
Arrow, ORC, Parquet 입력 형식에서 Nested 타입을 struct의 배열로 삽입할 수 있습니다. #25902 (Kruglov Pavel).
새 데이터 유형 Date32를 추가했습니다(Int32로 데이터 저장). DateTime64와 동일한 날짜 범위를 지원하며, Parquet의 date32를 ClickHouse Date32로 로드할 수 있습니다. 또한 toDate와 유사한 새 함수 toDate32를 추가했습니다. #25774 (LiuNeng).
동일한 파일에 대한 동시 읽기에서 파일 디스크립터를 공유합니다. Linux에서는 눈에 띄는 성능 차이가 없습니다. 하지만 일반적인 서버에서는 열린 파일 수가 크게(10~100배) 줄어들어 운영이 더 수월해집니다. #26214를 참조하십시오. #26768 (alexey-milovidov).
많은 수의 컬럼이 있는 테이블에서 읽기가 필요한 짧은 쿼리의 지연 시간을 개선했습니다. #26371 (Anton Popov).
File 테이블의 file descriptor가 일반 파일이면 이를 여러 번 읽을 수 있도록 허용했습니다. 이에 따라 stdin이 clickhouse-local --query "SELECT * FROM table UNION ALL SELECT * FROM table" ... < file와 같은 일반 파일인 경우, clickhouse-local에서 stdin을 여러 번 읽을 수 있습니다(여러 SELECT 쿼리 또는 서브쿼리를 사용하는 경우). 이로써 #11124가 해결되었습니다. (alexey-milovidov)와 공동 작성했습니다. #25960 (BoloniniD).
중복된 인덱스 분석을 제거하고, 프로젝션 분석 중 유효하지 않은 limit 검사가 수행될 수 있는 문제를 방지했습니다. #27742 (Amos Bird).
내부 사용을 위한 _CAST 함수를 추가했습니다. 이 함수는 유형의 널 허용 여부를 보존하지 않지만, 일반 CAST는 cast_keep_nullable 설정에 따라 이를 보존합니다. #12636을 해결합니다. #27382 (Kseniia Sumarokova).
system.query_log에 추가로 포맷된 쿼리를 기록하는 설정 log_formatted_queries를 추가했습니다. normalizeQuery 및 normalizeQueryKeepNames 같은 함수는 더 나은 성능을 위해 쿼리를 parse하거나 포맷하지 않으므로, 정규화된 쿼리 분석에 유용합니다. #27380 (Amos Bird).
hyperscan 관련 함수(예: multiMatchAny)에서 지나치게 큰 정규식이 사용되지 않도록 max_hyperscan_regexp_length 및 max_hyperscan_regexp_total_length 두 설정을 추가했습니다. #27378 (Amos Bird).
이제 함수는 세그먼트 수준 상수로 사용할 수 있습니다. 즉, 일부 분산 테이블의 Context에서 실행되면 일반 컬럼을 생성하고, 그렇지 않으면 상수 값을 생성합니다. 대표적인 함수는 다음과 같습니다: hostName(), tcpPort(), version(), buildId(), uptime(), 등입니다. #27020 (Amos Bird).
extractAllGroupsHorizontal 개선 - 선택적 세 번째 인수를 통해 행별 일치 항목 수의 상한을 설정할 수 있습니다. #26961 (Vasily Nemkov).
RocksDB 통계를 system.rocksdb 테이블을 통해 노출합니다. ClickHouse 설정에서 rocksdb 옵션(rocksdb... 키)을 읽어옵니다. 참고: ClickHouse는 RocksDB에 의존하지 않으며, 이는 추가로 제공되는 통합 스토리지 엔진 중 하나일 뿐입니다. #26821 (Azat Khuzhin).
내부 RocksDB 로그의 상세 수준을 낮췄습니다. 참고: ClickHouse는 RocksDB에 의존하지 않으며, RocksDB는 추가 통합 스토리지 엔진 중 하나일 뿐입니다. 이로써 #26252가 해결되었습니다. #26789 (alexey-milovidov).
clickhouse-benchmark에 라운드 로빈 지원을 추가했습니다(통계 보고서를 제외하면 일반적인 다중 호스트/포트 실행과 차이가 없습니다). #26607 (Azat Khuzhin).
실행형 딕셔너리(executable, executable_pool)를 clickhouse-local을 사용한 DDL 쿼리로 생성할 수 있게 되었습니다. #22355를 해결했습니다. #26510 (Maksim Kita).
mysql 및 postgresql 호환성 프로토콜 핸들러의 클라이언트 쿼리 유형을 설정했습니다. #26498 (anneji-dev).
distributed_push_down_limit=1일 때 SELECT * FROM dist ORDER BY key LIMIT 10 같은 쿼리에서 세그먼트에 LIMIT를 적용합니다. SELECT DISTINCT shading_key FROM dist ORDER BY key 같은 쿼리에서는 Distinct/LIMIT BY 단계를 실행하지 않습니다. 이제 distributed_push_down_limit가 optimize_distributed_group_by_sharding_key 최적화에도 적용됩니다. #26466 (Azat Khuzhin).
대규모 클러스터에서 테일 레이턴시를 완화할 수 있도록 use_hedged_requests 설정을 활성화했습니다. #26380 (alexey-milovidov).
사용자 허용 호스트 목록에 존재하지 않는 호스트가 포함된 경우의 동작을 개선했습니다. #26368 (ianton-ru).
CREATE TABLE을 통해 Distributed 디렉터리 모니터 설정을 지정할 수 있는 기능이 추가되었습니다(즉, CREATE TABLE dist (key Int) Engine=Distributed(cluster, db, table) SETTINGS monitor_batch_inserts=1 및 이와 유사한 구문). #26336 (Azat Khuzhin).
서로 다른 클러스터 간에 세그먼트 연결을 재사용할 수 있도록 했습니다. 또한 cluster 테이블 함수를 사용할 때 새 연결을 생성하지 않도록 합니다. #26318 (Amos Bird).
기본값이 설정된 매개변수로 오래된 임시 디렉터리를 정리하는 실행 주기를 제어할 수 있습니다. #26212. #26313 (fastio).
함수 range가 생성하는 데이터 양의 안전 임계값을 조정할 수 있도록 설정 function_range_max_elements_in_block을 추가했습니다. 이로써 #26303이 해결되었습니다. #26305 (alexey-milovidov).
샘플링 시점이 아니라 테이블 생성 시점에 hash function을 검사하도록 했습니다. 잘못된 샘플링 컬럼으로 테이블을 생성했더라도 샘플링을 전혀 사용하지 않았다면, 예외 없이 server를 시작할 수 있도록 이 설정을 비활성화하는 MergeTree 설정을 추가했습니다. #26256 (zhaoyu).
지정된 String 컬럼이 기본 bytes 대신 string으로 Avro에 저장되도록 output_format_avro_string_column_pattern 설정을 추가했습니다. #22414을 구현합니다. #26245 (Ilya Golshtein).
clickhouse-local의 --progress 옵션에서 잘못된 출력이 발생하는 문제를 수정했습니다. 진행 표시줄은 100%에 도달하면 clickhouse-client와 동일하게 지워집니다. #17484를 해결했습니다. #26128 (Kseniia Sumarokova).
merge_selecting_sleep_ms 설정을 추가했습니다. #26120 (lthaooo).
한 블록 선행 읽기와 함께 사용하는 복잡한 Linux AIO를 제거하고, 이를 O_DIRECT를 사용하는 단순한 동기식 IO로 대체했습니다. 이전 버전에서는 max_threads가 1보다 크면 min_bytes_to_use_direct_io 설정이 올바르게 동작하지 않을 수 있습니다. direct IO를 사용한 읽기(쿼리에서는 기본적으로 비활성화되어 있고 대규모 머지에서는 기본적으로 활성화됨)는 효율이 다소 떨어지는 방식으로 동작합니다. 이 변경으로 #25997이 해결되었습니다. #26003 (alexey-milovidov).
REPLACE TABLE 쿼리 시 Distributed 테이블을 플러시합니다. #24566 해결 - 새 테이블에 대한 삽입이 실패하면 [CREATE OR] REPLACE TABLE ... AS SELECT 쿼리에서 테이블을 대체하거나 생성하지 않도록 했습니다. #23175 해결. #25895 (tavplubix).
쿼리에 의해 실행된 (구체화된 뷰 또는 라이브 뷰) 이름을 담는 views 컬럼을 system.query_log에 추가합니다. 또한 쿼리 실행 중 각 뷰에 대한 정보를 담는 새 로그 테이블(system.query_views_log)을 추가합니다. 뷰 실행 방식도 변경됩니다. 뷰 실행 중 예외가 발생하면, 이미 시작된 뷰는 완료될 때까지 계속 실행됩니다. 이는 이전에는 parallel_view_processing=true일 때만 적용되던 동작이었지만, 이제는 항상 동일하게 동작합니다. - 이제 종속 뷰가 읽기 진행 상황을 Context에 보고합니다. #25714 (Raúl Marín).
분산 쿼리 실행이 끝난 후 연결 드레이닝을 비동기적으로 수행합니다. 백그라운드에서 연결을 회수하는 worker 수를 지정하는 새로운 서버 설정 max_threads_for_connection_collector가 추가되었습니다. 풀이 가득 차면 연결 드레이닝은 동기적으로 수행되지만, 이전과는 조금 다릅니다. 클라이언트에 EOS를 보낸 뒤 드레이닝이 수행되며, 쿼리는 충분한 데이터를 받는 즉시 성공으로 처리되고, 예외는 클라이언트에 반환되지 않고 로그에 기록됩니다. 설정 drain_timeout도 추가되었습니다(기본값은 3초). 연결 드레이닝은 타임아웃이 발생하면 연결을 끊습니다. #25674 (Amos Bird).
구성에서 여러 include를 지원합니다. 여러 소스의 users 구성과 remote servers 구성을 include할 수 있습니다. <include /> 요소에 from_zk, from_env 또는 incl 속성을 지정하면 해당 치환값으로 대체됩니다. #24404 (nvartolomei).
insert_distributed_one_random_shard = 1에서 분산 테이블에 여러 block을 삽입할 때의 문제를 수정했습니다. 이는 사소한 기능입니다. 개선 사항으로 분류했습니다. #23140 (Amos Bird).
Map 유형에서 LowCardinality 및 FixedString 키/값을 지원합니다. #21543 (hexiaoting).
arrayHas와 같은 함수를 DateTime 및 DateTime64처럼 서로 다른 비숫자 타입의 LowCardinality(Nullable(...)) 배열에 적용할 때 발생하던 잘못된 타입 캐스팅 문제를 수정했습니다. 이전 버전에서는 잘못된 캐스팅이 발생했습니다. 새 버전에서는 예외가 발생합니다. 이로써 #26330이 해결되었습니다. #27682 (alexey-milovidov).
PREWHERE에서 LowCardinality를 사용하는 일부 쿼리에서 발생하던 Expected ColumnLowCardinality, gotUInt8 또는 Bad cast from type DB::ColumnVector<char8_t> to DB::ColumnLowCardinality와 같은 오류를 수정했습니다. 더 중요한 점으로, 오류 메시지에 공백이 누락되던 문제도 수정했습니다. #23515를 수정했습니다. #27298 (Nikolai Kochetov).
LIMIT BY 및 LIMIT OFFSET와 함께 사용할 때 distributed_push_down_limit = 1 또는 optimize_distributed_group_by_sharding_key = 1 조합에서 발생하는 distributed_group_by_no_merge = 2 관련 문제를 수정했습니다. #27249 (Azat Khuzhin). 이는 사실상 아무도 사용하지 않는 드문 설정 조합입니다.
비복제 MergeTree에서 잘못된 파티션 때문에 멈춰 있던 mutation 문제를 수정했습니다. #27248 (Azat Khuzhin).
모호한 경우, 람다 함수에서는 다른 별칭이나 식별자보다 해당 인수를 우선합니다. #27235 (Raúl Marín).
일부 combinator를 적용할 때 집계 함수 매개변수가 손실되어 Conversion from AggregateFunction(topKArray, Array(String)) to AggregateFunction(topKArray(10), Array(String)) is not supported와 같은 예외가 발생할 수 있었습니다. 이 문제가 수정되었습니다. #26196, #26433을 수정합니다. #26814 (tavplubix).
system.part_log의 REMOVE_PART에 event_time_microseconds 값을 추가했습니다. 이전 버전에서는 이 값이 설정되지 않았습니다. #26720 (Azat Khuzhin).
데이터와 메타데이터 간 불일치를 방지하기 위해 ReplicatedMergeTree 테이블 종료 시 데이터를 삭제하지 않도록 했습니다. #26716 (nvartolomei).
여러 컬럼을 처리할 때 optimize_distributed_group_by_sharding_key를 수정했습니다(optimize_skip_unused_shards=1/allow_nondeterministic_optimize_skip_unused_shards=1이 설정되어 있고 세그먼트 분할 키 표현식에 여러 컬럼이 포함된 경우 잘못된 결과가 발생함). #26353 (Azat Khuzhin).
드물게 발생하던, 손실된 레플리카 복구 과정에서 레플리카 간 데이터가 불일치할 수 있는 버그를 수정했습니다. #26321 (tavplubix).
내부 버퍼 끝에 이스케이프 시퀀스가 있는 경우 zstd 압축 해제를 수정했습니다(zstd 프레이밍 포맷으로 import/export할 때이며, 테이블 데이터와는 무관함). #26013을 해결합니다. #26314 (Kseniia Sumarokova).
Enum에 0값이 정의되어 있지 않은 경우에도 널 허용 Enum의 toString에서 예외를 발생시키지 않도록 수정, #25806 해결. #26123 (Vladimir C).
쿼리 실행 중 예외가 발생했을 때 ClickHouse가 전송하는 MySQL 프로토콜 패킷의 잘못된 sequence_id를 수정했습니다. 이 문제로 인해 MySQL 클라이언트가 ClickHouse 서버와의 연결(connection)을 재설정할 수 있었습니다. #21184를 수정했습니다. #26051 (tavplubix).
cutToFirstSignificantSubdomainCustom()/cutToFirstSignificantSubdomainCustomWithWWW()/firstSignificantSubdomainCustom()가 상수에 대해 잘못된 타입을 반환해 optimize_skip_unused_shards가 작동하지 않던 문제를 수정했습니다:. #26041 (Azat Khuzhin).
prewhere와 함께 일반 projection을 사용할 때 발생할 수 있는 헤더 불일치 문제를 수정했습니다. 이로써 #26020 문제가 해결됩니다. #26038 (Amos Bird).
remote()에서 함수 없이 컬럼의 sharding_key를 사용할 때 발생하던 문제를 수정했습니다 (이전에는 select * from remote('127.1', system.one, dummy)가 Unknown column: dummy, there are only columns . 오류를 발생시켰습니다). #25824 (Azat Khuzhin).
MaterializeMySQL에서 SELECT할 때 발생하던 Not found column ... 및 Missing column ... 오류를 수정했습니다. #23708, #24830, #25794를 해결합니다. #25822 (tavplubix).
non-UInt64 타입에 대해 optimize_skip_unused_shards_rewrite_in을 수정했습니다(이전에는 결국 잘못된 세그먼트를 선택하거나 Cannot infer type of an empty tuple 또는 Function tuple requires at least one argument 오류가 발생할 수 있었습니다). #25798 (Azat Khuzhin).
빌드/테스트/패키징 개선
이제 stateful 테스트와 stateless 테스트를 무작위 시간대에서 실행합니다. #12439를 수정했습니다. 이제 Protobuf 형식에서 String을 DateTime으로 읽고 DateTime을 String으로 쓸 때 시간대를 반영합니다. 이제 Arrow 및 Parquet 포맷에서 UInt16을 DateTime으로 읽으면 이를 Date로 처리한 뒤 DateTime의 시간대를 반영해 DateTime으로 변환합니다. 이는 Arrow와 Parquet에서 Date가 UInt16으로 직렬화되기 때문입니다. 이제 GraphiteMergeTree는 시간 반올림에 시간대를 반영합니다. #5098를 수정했습니다. 작성자: @alexey-milovidov. #15408 (alesapin).
새 버전에서는 시스템 로그 테이블(system.query_log, system.query_thread_log, system.processes, system.opentelemetry_span_log)에 Map 데이터 타입을 사용합니다. 이 테이블들은 새 데이터 타입으로 자동 생성됩니다. 기존 쿼리와의 호환성을 위해 가상 컬럼이 생성됩니다. #18698을 해결했습니다. #23934, #25773 (hexiaoting, sundy-li, Maksim Kita). 버전 21.8에서 이전 버전으로 다운그레이드하려면 로그가 있는 system 테이블을 수동으로 정리해야 합니다. /var/lib/clickhouse/data/system/*_log를 확인하십시오.
CPU 사용량, 디스크 사용량, 메모리 사용량, IO, 네트워크, 파일, 로드 평균, CPU 주파수, 열 센서, EDAC 카운터, 시스템 uptime에 관한 공통 시스템 메트릭을 system.asynchronous_metrics 및 system.asynchronous_metric_log에서 수집하며, 스케줄링 지터와 메트릭 수집에 소요된 시간에 대한 메트릭도 추가했습니다. 이는 ClickHouse에서 atop과 비슷하게 동작하며, 추가 도구를 설치하지 않아도 모니터링 데이터에 접근할 수 있게 해줍니다. #9430을 해결했습니다. #24416 (alexey-milovidov, Yegor Levankov).
MaterializedPostgreSQL 테이블 엔진과 데이터베이스 엔진을 추가했습니다. 이 데이터베이스 엔진을 사용하면 전체 데이터베이스 또는 데이터베이스 테이블의 일부만 레플리케이션할 수 있습니다. #20470 (Kseniia Sumarokova).
새로운 함수 leftPad(), rightPad(), leftPadUTF8(), rightPadUTF8()를 추가했습니다. #26075 (Vitaly Baranov).
인덱스 목록 맨 앞에 인덱스를 추가할 수 있도록 ADD INDEX 명령에 FIRST 키워드를 추가했습니다. #25904 (xjewer).
기존 data skipping indices에 대한 정보를 담은 system.data_skipping_indices 테이블을 도입했습니다. #7659를 해결했습니다. #25693 (Dmitry Novik).
시스템 로그 테이블(system.query_log, system.query_thread_log, system.processes, system.opentelemetry_span_log)에 Map 데이터 타입을 사용합니다. 이들 테이블은 새 데이터 타입으로 자동 생성됩니다. 기존 쿼리와의 호환성을 위해 가상 컬럼이 생성됩니다. #18698을 해결했습니다. #23934, #25773 (hexiaoting, sundy-li, Maksim Kita).
속성이 하나뿐인 복합 키를 사용하는 딕셔너리에서 dictGet, dictHas 함수에 대해 키 표현식을 tuple로 감싸지 않아도 되도록 허용했습니다. #26130 (Maksim Kita).
AggregateFunction 상태에서 bin/hex 함수를 구현했습니다. #26094 (zhaoyu).
empty 및 notEmpty 함수에서 UUID 유형의 인수를 지원합니다. UUID가 모두 0인 경우 비어 있는 것으로 간주됩니다(nil UUID). #3446을 해결합니다. #25974 (zhaoyu).
aggregate_functions_null_for_empty와 함께 quantiles* 함수가 작동할 수 있도록 허용합니다. #25892를 해결합니다. #25919 (alexey-milovidov).
매개변수화된 집계 함수의 매개변수로 리터럴뿐만 아니라 임의의 상수 표현식(예: 1 + 2)도 사용할 수 있습니다. 또한 매개변수화된 쿼리(예: {param:UInt8})의 쿼리 매개변수를 매개변수화된 집계 함수 내에서도 사용할 수 있습니다. #11607을 해결합니다. #25910 (alexey-milovidov).
구성에서 여러 include를 지원합니다. 여러 소스의 사용자 구성과 원격 서버 구성을 포함할 수 있습니다. from_zk, from_env 또는 incl 속성이 있는 <include /> 요소를 추가하면 해당 대체 값으로 치환됩니다. #24404 (nvartolomei).
여러 컬럼을 사용하는 경우의 optimize_distributed_group_by_sharding_key를 수정했습니다(optimize_skip_unused_shards=1/allow_nondeterministic_optimize_skip_unused_shards=1 사용 시 세그먼트 분할 키 표현식에 여러 컬럼이 포함되어 있으면 잘못된 결과가 발생함). #26353 (Azat Khuzhin).
CAST에서 Date를 DateTime(또는 DateTime64)으로 변환할 때 DateTime 타입의 시간대를 사용하지 않았습니다. 이로 인해 Date와 DateTime 간 비교에도 영향이 있을 수 있습니다. Date와 DateTime의 공통 타입을 추론할 때도 해당 시간대를 사용하지 않았습니다. 이 문제는 if 함수와 배열 생성 결과에 영향을 주었습니다. #24128을 해결합니다. #24129 (Maksim Kita).
레플리카 간 불일치를 초래할 수 있는 유실된 레플리카 복구 과정의 드문 버그를 수정했습니다. #26321 (tavplubix).
ZooKeeper client의 abort로 인해 드물게 발생하던 server 충돌을 수정했습니다. #25813을 해결합니다. #26079 (alesapin).
일부 경우 right subquery join에서 스레드 수를 잘못 추정하던 문제를 수정했습니다. #24075를 해결했습니다. #26052 (Vladimir C).
쿼리 실행 중 예외 발생 시 ClickHouse가 전송하는 MySQL 프로토콜 패킷의 잘못된 sequence_id를 수정했습니다. 이 문제로 인해 MySQL 클라이언트가 ClickHouse 서버와의 연결을 재설정할 수 있었습니다. #21184를 수정했습니다. #26051 (tavplubix).
PREWHERE와 함께 일반 projection을 사용할 때 발생할 수 있는 헤더 불일치 문제를 수정했습니다. #26020. #26038 (Amos Bird).
remote()에서 함수 없이 지정된 컬럼의 sharding_key를 수정했습니다(이전에는 select * from remote('127.1', system.one, dummy)로 인해 Unknown column: dummy, there are only columns . 오류가 발생했습니다). #25824 (Azat Khuzhin).
MaterializeMySQL에서 조회할 때 발생하던 Not found column ... 및 Missing column ... 오류를 수정했습니다. #23708, #24830, #25794를 해결합니다. #25822 (tavplubix).
optimize_skip_unused_shards_rewrite_in을 UInt64가 아닌 타입에서 수정했습니다(그렇지 않으면 잘못된 세그먼트를 선택하거나 Cannot infer type of an empty tuple 또는 Function tuple requires at least one argument 오류가 발생할 수 있습니다). #25798 (Azat Khuzhin).
ReplicatedMergeTree 테이블에서 드물게 발생하는 DROP PART 쿼리 버그를 수정했습니다. 이 버그로 인해 Unexpected merged part intersecting drop range 오류 메시지가 발생할 수 있습니다. #25783 (alesapin).
GROUP BY 표현식이 있는 TTL에서 파트 내 첫 실행 후 TTL이 더 이상 실행되지 않는 버그를 수정했습니다. #25743 (alesapin).
clickhouse-server Docker 엔트리포인트에서 chown cmd 확인 로직을 업데이트했습니다. 이 변경으로 Kubernetes에서 발생하는 'cluster pod restart failed (or timeout)' 오류를 해결합니다. #26545 (Ky Li).
ClickHouse 릴리스 v21.7, 2021-07-09
하위 호환되지 않는 변경 사항
명시적으로 정의된 큰 Set이 있는 쿼리의 성능을 개선했습니다. 호환성 설정 legacy_column_name_of_tuple_literal를 추가했습니다. 21.7 미만 버전에서 그 이상의 버전으로 클러스터를 롤링 업데이트하는 동안에는 이 값을 true로 설정하는 것이 좋습니다. 그렇지 않으면 업데이트 중 IN 절에 명시적으로 정의된 Set이 있는 분산 쿼리가 실패할 수 있습니다. #25371 (Anton Popov).
clickhouse-keeper(ZooKeeper의 실험적 대안)의 최대 버퍼 크기에 대해 이전/이후 버전과 호환되지 않는 변경이 있습니다. 나중에 하는 것보다 지금(프로덕션 적용 전) 하는 편이 더 낫습니다. #25421 (alesapin).
모든 IN/JOIN을 기본적으로 GLOBAL IN/JOIN으로 설정하는 새 불리언 설정 prefer_global_in_and_join을 추가했습니다. #23434 (Amos Bird).
Join 테이블 엔진에서 ALTER DELETE 쿼리를 지원합니다. #23260 (foolchi).
집계 함수 quantileBFloat16과 이에 대응하는 quantilesBFloat16 및 medianBFloat16을 추가했습니다. 이는 상대 오차가 0.390625%를 넘지 않는 매우 단순하고 빠른 분위수 추정기입니다. 이로써 #16641이 해결되었습니다. #23204 (Ivan Novitskiy).
flow analysis에 유용한 함수 sequenceNextNode()를 구현했습니다. #19766 (achimbab).
이제 clickhouse-keeper(실험적인 ZooKeeper 대안)에서 ZooKeeper와 유사한 digest ACL을 지원합니다. #24448 (alesapin).
성능 개선
읽는 데이터 양을 줄이기 위해 일부 함수를 서브컬럼을 읽는 방식으로 변환하는 최적화가 추가되었습니다. 예를 들어, 구문 col IS NULL은 서브컬럼 col.null을 읽는 것으로 변환됩니다. 이 최적화는 optimize_functions_to_subcolumns 설정으로 활성화할 수 있으며, 현재는 기본적으로 비활성화되어 있습니다. #24406 (Anton Popov).
더 많은 컬럼을 가능한 별칭 표현식으로 재작성하도록 개선했습니다. 이를 통해 프로젝션과 같은 더 나은 최적화가 가능해질 수 있습니다. #24405 (Amos Bird).
bloom_filter 유형의 인덱스는 상수 배열이 포함된 hasAny 함수 표현식에 사용할 수 있습니다. 이 변경으로 다음 이슈가 해결됩니다: #24291. #24900 (Vasily Nemkov).
RabbitMQ 큐가 비어 있을 때 읽기 시도를 다시 예약하도록 지수 백오프를 추가했습니다. (ClickHouse는 RabbitMQ에서 데이터를 가져오는 기능을 지원합니다.) 다음 이슈를 해결합니다: #24340. #24415 (Kseniia Sumarokova).
개선
복제에 사용할 네트워크 대역폭을 제한할 수 있도록 했습니다. 두 개의 Replicated*MergeTree 설정인 max_replicated_fetches_network_bandwidth 및 max_replicated_sends_network_bandwidth를 추가하여 테이블의 복제 fetch/send 최대 속도를 제한할 수 있습니다. default 사용자 profile에 서버 전역 설정 두 개(max_replicated_fetches_network_bandwidth_for_server 및 max_replicated_sends_network_bandwidth_for_server)도 추가하여 모든 테이블의 복제 최대 속도를 제한할 수 있습니다. 이 설정은 완벽하게 정확히 적용되지는 않습니다. 기본적으로 비활성화되어 있습니다. #1821을 수정합니다. #24573 (alesapin).
ODBC 및 Library 브리지에 리소스 제약 및 격리를 적용했습니다. 브리지 프로세스에는 별도의 clickhouse-bridge 그룹과 사용자를 사용합니다. 브리지가 OOM killer에 의해 가장 먼저 종료되도록 oom_score_adj를 설정합니다. 최대 RSS를 1 GiB로 설정합니다. #23861을 해결합니다. #25280 (Kseniia Sumarokova).
주 clickhouse 바이너리에 독립 실행형 clickhouse-keeper 심볼릭 링크를 추가했습니다. 이제 주 ClickHouse 서버 없이도 조정 기능을 실행할 수 있습니다. #24059 (alesapin).
VIEW에 대한 쿼리에는 전역 설정을 사용합니다. VIEW에 대한 쿼리가 로컬 설정을 사용할 때, CREATE VIEW와 SELECT의 설정이 서로 다르면 오류가 발생하던 동작을 수정했습니다. 이제 VIEW는 이러한 변경된 설정을 사용하지 않지만, CREATE VIEW 쿼리의 SETTINGS 섹션에서 추가 설정을 계속 전달할 수 있습니다. #20551을 종료했습니다. #24095 (Vladimir).
분산 테이블 개선. internal_replication=true일 때 dirname에서 레플리카를 제거했습니다(cluster가 설정된 Distributed에 레플리카 수와 관계없이 INSERT할 수 있으며, 이전에는 15개의 레플리카까지만 지원되었고 그보다 많으면 async blocks용 디렉터리를 생성하는 동안 ENAMETOOLONG으로 실패했습니다). #25513 (Azat Khuzhin).
LowCardinality에 Interval 유형 지원이 추가되었습니다. 이는 일부 표현식의 중간 값에 필요합니다. #21730을 해결합니다. #25410 (Vladimir).
sequenceMatch 및 sequenceCount 함수의 시간 조건에 == 연산자가 추가되었습니다. 예: sequenceMatch('(?1)(?t==1)(?2)')(time, data = 1, data = 2). #25299 (Christophe Kalenzaga).
IDN 호스트(예: example.рф)에서 topLevelDomain이 빈 문자열을 반환하던 문제를 수정했습니다. #25103 (Azat Khuzhin).
런타임에 Linux 커널 버전을 감지합니다(중첩 epoll이 제대로 작동하려면 async_socket_for_remote/use_hedged_requests에 이 기능이 필요하며, 그렇지 않으면 원격 쿼리가 멈출 수 있습니다). #25067 (Azat Khuzhin).
분산 쿼리에서 optimize_skip_unused_shards=1일 때 (세그먼트 분할 키) IN (단일 요소 튜플)과 같은 조건으로 세그먼트를 건너뛸 수 있게 했습니다. (여러 요소로 이루어진 튜플은 이미 지원되었습니다. 단일 요소 튜플은 리터럴로 파싱되기 때문에 동작하지 않았습니다.) #24930 (Amos Bird).
IPv6 주소 해석 문제를 수정했습니다(즉, select * from remote('[::1]', system.one)가 수정됨). #24319 (Azat Khuzhin).
여러 줄 모드에서 서브쿼리가 있는 FROM 절의 후행 공백을 수정하고, 쿼리 출력도 사람이 읽기 더 쉬운 형태로 약간 변경했습니다. #24151 (Azat Khuzhin).
분산 테이블이 개선되었습니다. 실패 시(예: 메모리 제한, 손상) 분산 Batch를 분할할 수 있는 기능이 distributed_directory_monitor_split_batch_on_failure에 추가되었습니다(기본값은 OFF). #23864 (Azat Khuzhin).
stdin으로 데이터를 전달할 때 clickhouse-local의 File 테이블 엔진과 clickhouse-client의 INSERT 쿼리에서 진행 상황을 표시합니다. #18209을 해결했습니다. #23656 (Kseniia Sumarokova).
clickhouse-copier의 버그를 수정하고 개선했습니다. 서로 다른(하지만 호환 가능한 스키마를 가진) 테이블도 복사할 수 있도록 했습니다. #9159를 해결했습니다. ReplacingMergeTree를 복사하는 테스트를 추가했습니다. #22711을 해결했습니다. 컬럼의 TTL 및 데이터 스키핑 인덱스를 지원합니다. 내부 분산 테이블을 생성하기 위해 이 정보는 단순히 제거되며(기반 테이블에는 TTL과 스킵 인덱스가 유지됨), #19384를 해결했습니다. MATERIALIZED 및 ALIAS 컬럼도 복사할 수 있도록 했습니다. 일부 경우에는 이것이 유용할 수 있습니다(예: 해당 컬럼이 PRIMARY KEY에 포함된 경우). 이제 작업 구성에서 allow_to_copy_alias_and_materialized_columns 속성을 true로 설정하면 이를 허용할 수 있습니다. #9177를 해결했습니다. [#11007] (https://github.com/ClickHouse/ClickHouse/issues/11007)을 해결했습니다. #9514를 해결했습니다. 보조 테이블을 이동하기 전에 원본 테이블의 파티션을 삭제할 수 있도록 작업 구성에 allow_to_drop_target_partitions 속성을 추가했습니다. #20957를 해결했습니다. OPTIMIZE DEDUPLICATE 쿼리를 제거했습니다. 이는 ALTER TABLE MOVE PARTITION이 여러 번 재시도되었고, 일반 MergeTree 테이블에는 중복 제거 기능이 없기 때문에 필요했던 우회 방법이었습니다. #17966를 해결했습니다. 진행 상황을 task_path + /status 경로의 ZooKeeper 노드에 JSON 포맷으로 기록합니다. #20955를 해결했습니다. 인수 없는 ReplicatedTables를 지원합니다. #24834 .#23518 (Nikita Mikhaylov).
메모리가 매우 부족한 서버에서 재시작하지 않으면 머지를 수행할 수 없게 되는 매우 드문 버그를 수정했습니다. #24603도 수정되었을 가능성이 있습니다. #24872 (alesapin).
alter move/replace partition를 동시에 수행할 때 복제 큐에서 발생하는 매우 드문 오류 Tagging already tagged part를 수정했습니다. #22142도 해결될 가능성이 있습니다. #24961 (alesapin).
다른 집계 함수의 집계 함수 상태를 집계할 때 집계 함수 상태를 계산하는 과정에서 발생할 수 있는 잠재적인 충돌 문제를 수정했습니다(실제 사용 사례는 아닙니다). #24523를 참조하십시오. #25015 (alexey-milovidov).
쿼리 SYSTEM RESTART REPLICA 또는 SYSTEM SYNC REPLICA가 완료되지 않던 문제를 수정했습니다. 이 문제는 RAM이 극히 적은 서버에서 발견되었습니다. #24457 (Nikita Mikhaylov).
clickhouse-server 내부에서 ZooKeeper 클라이언트가 응답하지 않게 될 수 있는 버그를 수정했습니다. #24721 (alesapin).
ZooKeeper 연결이 끊겼다가 복구된 후 레플리카가 복제되면, 해당 복제 큐에 outdated 항목이 포함될 수 있었습니다. 복제 큐에 서로 겹치는 virtual parts가 포함되어 있을 때 발생하던 assertion 실패를 수정했습니다. 일부 데이터 파트가 손실된 경우 드물게 발생할 수 있습니다. 프로세스를 종료하는 대신 로그에 오류를 출력합니다. #24777 (tavplubix).
쿼리 계획의 표현식 푸시다운 최적화에서 누락된 WHERE 조건을 수정했습니다(query_plan_filter_push_down = 1이 기본값이 되도록 설정). #25368 문제를 수정했습니다. #25370 (Nikolai Kochetov).
TTL이 적용된 머지 후 서로 겹치는 파트가 생길 수 있는 버그를 수정했습니다: Part all_40_40_0 is covered by all_40_40_1 but should be merged into all_40_41_1. This shouldn't happen often.. #25549 (alesapin).
ZooKeeper 연결이 끊어지면 ReplicatedMergeTree 테이블이 재연결을 시도하기 전에 백그라운드 작업이 끝날 때까지 대기할 수 있었습니다. 이 문제는 수정되었으며, 이제 백그라운드 작업은 강제로 중지됩니다. #25306 (tavplubix).
배열이 기본 키(primary key)에 사용될 때 ARRAY JOIN이 포함된 쿼리에서 발생하는 Key expression contains comparison between inconvertible types 오류를 수정했습니다. #8247을 해결합니다. #25546 (Anton Popov).
예외 메시지 "min/maxMap에서 Array/Tuple을 합산할 수 없음"이 발생하는 논리 오류를 수정했습니다. #25298 (Kruglov Pavel).
IN에 LowCardinality 인수를 사용한 쿼리에서 발생하던 오류 Bad cast from type DB::ColumnLowCardinality to DB::ColumnVector<char8_t>를 수정했습니다(이 버그는 21.6에서 나타났습니다). #25187을 해결했습니다. #25290 (Nikolai Kochetov).
널을 허용하지 않는 컬럼에서 joinGetOrNull의 잘못된 동작을 수정했습니다. 이 수정으로 #24261 문제가 해결되었습니다. #25288 (Amos Bird).
큰 정수에서 발생하던 잘못된 동작과 UBSan 경고를 수정했습니다. 이전 버전에서는 CAST(1e19 AS UInt128)가 0을 반환했습니다. #25279 (alexey-milovidov).
DiskS3에서 파일을 읽을 때 발생할 수 있는 'Cannot read from istream at offset 0' 오류를 수정했습니다(S3 가상 파일 시스템은 현재 개발 중인 실험적 기능이므로 프로덕션에서는 사용하지 않아야 합니다). #24885 (Pavel Kovalenko).
분산 materialized view를 조인할 때 "Missing columns" 예외가 발생하던 문제를 수정했습니다. #24870 (Azat Khuzhin).
Buffer 테이블의 총 바이트 수 계산을 수정했습니다. 현재 ClickHouse 버전에서는 버퍼 플러시 중 total_writes.bytes 카운터가 과도하게 감소합니다. 이로 인해 카운터 오버플로우가 발생하며, 플러시 후 얼마 지나지 않아 totalBytes가 약 17.44 EB의 값을 반환합니다. #24450 (DimasKovas).
사용자 authentication이 LDAP로 관리되는 경우, LDAP 그룹이 존재하지 않는 로컬 역할에 매핑될 때 LDAP 역할 (re)mapping 중 발생할 수 있는 잠재적 교착 상태를 수정했습니다. #24431 (Denis Glazachev).
"multipart/form-data" 메시지에서는 boundary 앞의 CRLF를 해당 boundary의 일부로 간주합니다. #23905를 수정했습니다. #24399 (Ivan).
intersect 가짜 파트가 있는 파티션 삭제 문제를 수정했습니다. 드물게 현재 block 번호보다 mutation 버전이 더 큰 파트가 있을 수 있습니다. #24321 (Amos Bird).
Ordinary 데이터베이스에서 Atomic 데이터베이스로 materialized view를 이동할 때 발생하던 버그를 수정했습니다(RENAME TABLE 쿼리). 이제 내부 테이블도 materialized view와 함께 새 데이터베이스로 이동합니다. #23926를 수정했습니다. #24309 (tavplubix).
Kafka 테이블(table)에 대한 수정입니다. 이전에 동일한 consumer의 할당이 비어 있었던 경우, Engine = Kafka에서 failover 동작 시 소비를 시작하지 못하던 버그를 수정했습니다. #21118을 해결했습니다. #21267 (filimonov).
빌드/테스트/패키징 개선
CI에 darwin-aarch64 (Mac M1 / Apple Silicon) 빌드를 추가했습니다 #25560 (Ivan). 또한 문서와 웹사이트에도 링크를 추가했습니다 (alexey-milovidov).
실행 파일에 바이너리 리소스를 크로스 플랫폼 방식으로 임베딩하는 기능을 추가했습니다. Illumos에서도 동작합니다. #25146 (bnaecker).
퍼징을 개선하기 위해 스트레스 테스트에 JOIN 관련 옵션을 추가했습니다. #25200 (Vladimir).
이제 Ubuntu 20.04를 사용해 통합 테스트를 실행하며, 통합 테스트 실행에 사용되는 docker-compose 버전도 1.28.2로 업데이트되었습니다. 이제 환경 변수가 docker-compose에도 적용됩니다. 병렬로 실행할 수 있도록 test_dictionaries_all_layouts_separate_sources를 재작업했습니다. #20393 (Ilya Yatsishin).
uniqState / uniqHLL12State / uniqCombinedState / uniqCombined64State는 UUID 유형에서 호환되지 않는 상태를 생성합니다. #33607.
업그레이드 참고 사항
zstd 압축 라이브러리가 v1.5.0으로 업데이트되었습니다. 복제 중 "checksum does not match" 메시지가 표시될 수 있습니다. 이 메시지는 압축 알고리즘 업데이트로 인해 예상되는 것이므로 무시해도 됩니다. 이 메시지는 정보 제공용이며, 바람직하지 않은 동작을 의미하지는 않습니다.
compile_expressions 설정이 기본적으로 활성화됩니다. 다양한 시나리오에서 충분히 테스트되었지만, 서버에서 바람직하지 않은 동작이 발견되면 이 설정을 꺼 보십시오.
UUID 유형의 값은 정수와 비교할 수 없습니다. 예를 들어 uuid != 0 대신 uuid != '00000000-0000-0000-0000-000000000000'를 입력하십시오.
큰 정수를 프로덕션 환경에서 안정적으로 사용할 수 있도록 개선했습니다. UInt128 데이터 타입 지원을 추가했습니다. Decimal256 데이터 타입의 알려진 문제를 수정했습니다. 딕셔너리에서 큰 정수를 지원합니다. 큰 정수에 대해 gcd/lcm 함수를 지원합니다. 배열 검색 및 조건 함수에서 큰 정수를 지원합니다. LowCardinality(UUID)를 지원합니다. generateRandom 테이블 함수와 clickhouse-obfuscator에서 큰 정수를 지원합니다. 스칼라 서브쿼리에서 UUID를 반환할 때 발생하던 오류를 수정했습니다. 이 변경으로 #7834 문제가 해결됩니다. 이 변경으로 #23936 문제가 해결됩니다. 이 변경으로 #4176 문제가 해결됩니다. 이 변경으로 #24018 문제가 해결됩니다. 하위 호환되지 않는 변경 사항: UUID 타입의 값은 정수와 비교할 수 없습니다. 예를 들어 uuid != 0이라고 작성하는 대신 uuid != '00000000-0000-0000-0000-000000000000'로 작성하십시오. #23631 (alexey-milovidov).
Arrow, Parquet, ORC 포맷에서 데이터 삽입 및 조회 시 Array 데이터 타입을 지원합니다. #21770 (taylor12805).
clickhouse-local에서 DDL 쿼리를 사용한 딕셔너리 생성을 지원합니다. #22354를 해결했습니다. DETACH DICTIONARY PERMANENTLY를 지원합니다. Atomic 데이터베이스 엔진에서 EXCHANGE DICTIONARIES를 지원합니다. RENAME DICTIONARY를 사용해 데이터베이스 간 딕셔너리 이동을 지원합니다. #23436 (Maksim Kita).
배열을 매개변수로 받아 배열의 모든 요소를 곱한 값을 반환하는 함수 arrayProduct를 추가했습니다. #21613을 해결합니다. #23782 (Maksim Kita).
system.stack_trace에 thread_name 컬럼을 추가했습니다. 이 변경으로 #23256가 해결되었습니다. #24124 (abel-cheng).
insert_null_as_default = 1이면 INSERT ... SELECT 및 INSERT ... SELECT ... UNION ALL ... 쿼리에서 NULL 대신 기본값을 삽입합니다. #22832를 해결합니다. #23524 (Kseniia Sumarokova).
--progress 옵션을 사용해 clickhouse-local에서 진행 상황을 표시할 수 있도록 지원을 추가했습니다. #23196 (Egor Savin).
http 딕셔너리 소스에서 HTTP 압축(Content-Encoding HTTP header로 결정됨) 지원이 추가되었습니다. 이 변경으로 #8912가 수정되었습니다. #23946 (FArthur-cmd).
SYSTEM QUERY RELOAD MODEL, SYSTEM QUERY RELOAD MODELS를 추가했습니다. #18722를 해결했습니다. #23182 (Maksim Kita).
EXPLAIN PLAN 쿼리에 json 설정(불리언, 기본값은 0)을 추가했습니다. 이 설정을 활성화하면 쿼리 출력이 단일 JSON 행으로 반환됩니다. 불필요한 이스케이프를 피하려면 TSVRaw 포맷을 사용하는 것이 좋습니다. #23082 (Nikolai Kochetov).
EXPLAIN PIPELINE 쿼리에 indexes 설정(bool, 기본값은 비활성화)을 추가했습니다. 활성화하면 적용된 각 인덱스에 대해 사용된 인덱스와 필터링된 파트 수 및 그래뉼 수를 표시합니다. MergeTree* 테이블에서 지원됩니다. #22352 (Nikolai Kochetov).
LDAP: Active Directory 그룹을 ClickHouse 역할에 매핑할 때 사용할 수 있도록 user DN 감지 기능을 구현했습니다. #22228 (Denis Glazachev).
타임스탬프를 저장해 머지 중에도 순서를 유지하면서 연속된 행 사이의 차이를 합산하는 새로운 집계 함수 deltaSumTimestamp가 추가되었습니다. #21888 (Russ Frank).
compile_expressions 설정이 기본적으로 활성화됩니다. 이 설정이 활성화되면 단순한 함수와 연산자의 조합이 런타임에 LLVM을 사용해 네이티브 코드로 컴파일됩니다. #8482 (Maksim Kita, alexey-milovidov). 참고: 문제가 발생하면 이 옵션을 비활성화하십시오.
re2 라이브러리를 업데이트했습니다. 정규식 매칭 성능이 개선되었습니다. 또한 이 PR에는 gcc-11 호환성이 추가되었습니다. #24196 (Raúl Marín).
ORC 입력 형식은 전체 테이블을 한 번에 메모리로 읽는 대신 stripe 단위로 읽도록 개선되었습니다. 파일 크기가 매우 클 때 메모리 사용량이 커지는 문제를 줄입니다. #23102 (Chao Ma).
하나의 쿼리에서 집계 함수 sum, count, avg를 단일 집계 함수로 결합합니다. 이 최적화는 optimize_fuse_sum_count_avg 설정으로 제어됩니다. 이는 새로운 집계 함수 sumCount로 구현됩니다. 이 함수는 sum과 count라는 두 필드를 가진 Tuple을 반환합니다. #21337 (hexiaoting).
zstd를 v1.5.0으로 업데이트했습니다. Compression 성능이 한 자릿수 퍼센트 수준으로 향상되었습니다. #24135 (Raúl Marín). 참고: 복제 과정에서 "checksum does not match" 메시지가 표시될 수 있습니다. 이는 압축 알고리즘 업데이트로 인해 예상되는 메시지이므로 무시해도 됩니다.
Buffer 테이블의 성능이 개선되었습니다. Buffer 엔진에서 total_bytes/total_rows에 대해서는 잠금을 획득하지 않습니다. #24066 (Azat Khuzhin).
hashed/sparse_hashed Dictionaries에 대한 사전 할당 지원이 다시 추가되었습니다. #23979 (Azat Khuzhin).
async_socket_for_remote가 기본적으로 활성화됩니다(팬아웃이 큰 분산 테이블을 쿼리할 때 thread 수 감소). #23683 (Nikolai Kochetov).
개선
MergeTree 테이블 계열에 _partition_value 가상 컬럼을 추가했습니다. 이 컬럼은 결정론적인 방식으로 파티션을 프루닝하는 데 사용할 수 있습니다. 뮤테이션을 위한 파티션 매처를 구현하는 데 필요합니다. #23673 (Amos Bird).
명시적으로 지정하지 않은 경우 DateTime 연산에서는 기본 시간대를 유지합니다. 예를 들어, 시간대가 없는 DateTime 타입 값에 1초를 더해도 시간대가 없는 DateTime으로 유지됩니다. 이전 버전에서는 반환 데이터 타입에 기본 시간대 값이 명시적으로 포함되어 DateTime('something')이 되었습니다. 이 변경으로 #4854가 해결되었습니다. #23392 (alexey-milovidov).
MySQL 스토리지에서 데이터베이스 이름 대신 빈 문자열을 지정할 수 있도록 했습니다. 쿼리에는 기본 데이터베이스가 사용됩니다. 이전 버전에서는 SELECT 쿌리에서만 동작했으며, INSERT를 지원하지 않는 문제에 대한 지원도 추가되었습니다. 이로써 #19281이 해결되었습니다. 이는 Sphinx 또는 기타 MySQL 호환 외부 데이터베이스와 함께 작업할 때 유용할 수 있습니다. #23319 (alexey-milovidov).
quantile(s)TDigest를 수정했습니다. tdunning/t-digest 3.2+에 따라 singleton centroid에 대한 특별 처리를 추가했습니다. 또한 이전 버전 알고리즘 구현에서 centroid가 과도하게 압축되는 버그도 수정했습니다. #23314 (Vladimir Chebotarev).
스토리지가 종료될 때까지 딕셔너리를 유지합니다(이렇게 하면 Buffer 엔진의 최종 플러시 중 서버 종료 시 발생할 수 있는 external dictionary 'DICT' not found 오류를 방지할 수 있습니다). #24068 (Azat Khuzhin).
기반 테이블이 이미 분리되어 블록이 버려지고(로그에 Destination table default.a_data_01870 doesn't exist. Block of data is discarded 오류가 기록됨) 있는 상황을 방지하기 위해, 테이블(하나의 데이터베이스 내)을 종료하기 전에 Buffer 테이블을 플러시합니다. #24067 (Azat Khuzhin).
이제 prefer_column_name_to_alias = 1은 group by, having, order by에서도 컬럼 이름을 우선적으로 사용합니다. 이로써 #23882가 수정되었습니다. #24022 (Amos Bird).
DateTime64에 대한 ORDER BY WITH FILL 지원이 추가되었습니다. #24016 (kevin wan).
ReplacingMergeTree에서 DateTime64를 버전 컬럼으로 사용할 수 있도록 지원합니다. #23992 (kevin wan).
테이블 설정 rabbitmq_queue_settings_list를 통해 특정 큐 설정을 추가할 수 있도록 했습니다. (#23737 및 #23918 해결). 사용자가 RabbitMQ 설정 전체를 제어할 수 있도록 했습니다. 즉, 테이블 설정 rabbitmq_queue_consume이 1로 설정되면 RabbitMQ 테이블 엔진은 지정된 큐에만 연결하며, exchange, 큐, bindings 선언과 같은 RabbitMQ consumer 측 설정은 수행하지 않습니다. (#21757 해결). RabbitMQ 테이블이 삭제될 때 적절히 정리되도록 개선했습니다. 테이블이 선언한 큐와, 테이블이 생성한 경우 해당 큐에 바인딩된 모든 exchange를 삭제합니다. #23887 (Kseniia Sumarokova).
system.distribution_queue에 broken_data_files/broken_data_compressed_bytes를 추가했습니다. 손상된 것으로 표시된 분산 테이블의 비동기 삽입 파일 수를 나타내는 메트릭(BrokenDistributedFilesToInsert)을 추가했습니다. #23885 (Azat Khuzhin).
system.tables에 대한 쿼리는 이제 더 이상 ZooKeeper로 가지 않습니다. #23793 (Fuwang Hu).
새로운 SYSTEM RESTART DISK SQL 명령으로 런타임 중 S3 디스크 설정을 변경할 수 있게 되었습니다. #23429 (Pavel Kovalenko).
사용자가 실수로 max_distributed_connections 값을 0으로 설정해 잘못된 구성을 적용하면, Distributed 테이블에 대한 모든 쿼리에서 "logical error"가 포함된 메시지와 함께 예외가 발생합니다. 하지만 이는 실제로 논리 오류가 아니라 예상된 동작이므로, 예외 메시지가 다소 부정확했습니다. 또한 이로 인해 논리 오류가 절대 발생하지 않아야 한다고 검사하는 CI 환경의 체크도 실행되었습니다. 앞으로는 max_distributed_connections가 0으로 잘못 설정된 경우 이를 가능한 최소값인 1로 처리합니다. #23348 (Azat Khuzhin).
MySQL 테이블 엔진, 딕셔너리 소스, 그리고 MaterializeMySQL의 소규모 데이터 가져오기 작업을 위해 설정 external_storage_max_read_rows 및 external_storage_max_read_rows를 추가했습니다. #22697 (TCeason).
MaterializeMySQL(실험적 기능): 이전에는 SQL 비호환성 때문에 MySQL 5.7.9를 지원하지 않았습니다. 이제 MySQL 매개변수 검증은 MaterializeMySQL에서 처리합니다. #23413 (TCeason).
파티션 키와 기본 키에 사용할 때는 이전 modulo 함수 버전을 사용합니다. #23508을 해결했습니다. #24157 (Kseniia Sumarokova). 이전 릴리스에서 이전 버전과의 호환성을 깨뜨리는 원인이었습니다.
쿼리 SYSTEM RESTART REPLICA 또는 SYSTEM SYNC REPLICA가 무한히 처리되던 문제를 수정했습니다. 이 문제는 RAM이 극히 적은 서버에서 발견되었습니다. #24457 (Nikita Mikhaylov).
toWeek 함수의 잘못된 단조성을 수정했습니다. 이로써 #24422가 해결됩니다. 이 버그는 #5212에서 도입되었으며, 이후 더 정교해진 파티션 가지치기 기능으로 인해 드러났습니다. #24446 (Amos Bird).
intersect fake parts가 있는 경우 파티션 삭제 문제를 수정했습니다. 드물게 현재 블록 번호보다 큰 mutation 버전을 가진 파트가 있을 수 있습니다. #24321 (Amos Bird).
materialized view를 Ordinary 데이터베이스에서 Atomic 데이터베이스로 이동할 때 발생하던 버그를 수정했습니다(RENAME TABLE 쿼리). 이제 내부 테이블도 materialized view와 함께 새 데이터베이스로 이동합니다. #23926을 수정했습니다. #24309 (tavplubix).
일부 ALTER PARTITION 쿼리로 인해 복제 큐에서 Part A intersects previous part B 및 Unexpected merged part C intersecting drop range D 오류가 발생할 수 있었습니다. 이 문제가 수정되었습니다. #23296를 해결했습니다. #23997 (tavplubix).
external GROUP BY와 오버플로우 행에서 발생하던 SIGSEGV를 수정했습니다(즉, SELECT FROM GROUP BY WITH TOTALS SETTINGS max_bytes_before_external_group_by>0, max_rows_to_group_by>0, group_by_overflow_mode='any', totals_mode='before_having'와 같은 쿼리). #23962 (Azat Khuzhin).
소스에 중복이 있는 CACHE 딕셔너리의 키 메트릭 집계를 수정했습니다(DictCacheKeysRequestedMiss 오버플로우로 이어짐). #23929 (Azat Khuzhin).
GROUP BY와 함께 일반 함수로 감싼 집계 함수를 사용할 때 distributed_group_by_no_merge = 2가 올바르게 동작하도록 수정했습니다(#23546에서 문제가 발생했음). distributed_group_by_no_merge = 2를 윈도우 함수와 함께 사용하려고 하면 예외를 발생시키도록 했습니다. 윈도우 함수가 포함된 쿼리에서는 optimize_distributed_group_by_sharding_key를 비활성화했습니다. #23906 (Azat Khuzhin).
s3 테이블 함수 수정: HTTP 오류를 더 잘 처리하도록 개선했습니다. 이전에는 HTTP 오류의 응답 본문이 무시되었습니다. #23844 (Vladimir Chebotarev).
s3 테이블 함수 수정: URI 처리를 개선했습니다. + 기호가 포함된 URL에서 발생하던 비호환성 문제를 수정했으며, 이러한 키를 가진 데이터는 이전에는 읽을 수 없었습니다. #23822 (Vladimir Chebotarev).
GLOBAL IN/JOIN 및 use_hedged_requests를 사용하는 쿼리에서 Can't initialize pipeline with empty pipe 오류를 수정했습니다. #23431을 해결합니다. #23805 (Nikolai Kochetov).
materialized view에서 참조되는 경우 CLEAR COLUMN이 작동하지 않는 문제를 수정했습니다. #23764를 해결했습니다. #23781 (flynn).
정수를 부동소수점 데이터 타입으로 정확하게 표현할 수 없을 때의 정수와 부동소수점 수 비교 방식이 변경되었습니다. 새 버전에서는 반올림 오차가 발생하므로 비교 결과가 false가 됩니다. 예시: 9223372036854775808.0 != 9223372036854775808. 이는 9223372036854775808이라는 값을 부동소수점 수로 정확하게 표현할 수 없기 때문입니다(그리고 9223372036854775808.0은 9223372036854776000.0으로 반올림됩니다). 그러나 이전 버전에서는 이 비교 결과가 두 수가 같다고 나왔습니다. 부동소수점 수 9223372036854776000.0을 다시 UInt64로 변환하면 9223372036854775808이 되기 때문입니다. 참고로 Python 프로그래밍 언어도 이 수들을 같다고 취급합니다. 하지만 이 동작은 CPU 모델에 따라 달랐습니다(일부 범위 밖 숫자에서는 AMD64와 AArch64에서 결과가 달랐음). 따라서 비교를 더 정확하게 개선했습니다. 이제 정수와 부동소수점 수는 정수가 부동소수점 타입으로 정확하게 표현될 수 있는 경우에만 같다고 취급됩니다. #22595 (alexey-milovidov).
단일 Tuple 인수에 대한 argMin 및 argMax 지원이 제거되었습니다. 해당 코드는 메모리 안전성이 없었습니다. 이 기능은 실수로 추가된 것이며 사용자에게 혼란을 줄 수 있습니다. 이 함수들은 나중에 다른 이름으로 다시 도입될 수 있습니다. 이 변경은 #22384를 수정하고 #17359를 되돌립니다. #23393 (alexey-milovidov).
새로운 기능
함수 dictGetChildren(dictionary, key), dictGetDescendants(dictionary, key, level)가 추가되었습니다. dictGetChildren 함수는 모든 자식의 인덱스를 배열로 반환합니다. 이는 dictGetHierarchy의 역변환입니다. dictGetDescendants 함수는 dictGetChildren를 재귀적으로 level번 적용한 것과 같이 모든 하위 항목을 반환합니다. level 값이 0이면 무한대로 간주됩니다. 또한 dictGetHierarchy, dictIsIn 함수의 성능이 개선되었습니다. #14656을 해결했습니다. #22096 (Maksim Kita).
함수 dictGetOrNull이 추가되었습니다. 이 함수는 dictGet처럼 동작하지만, 딕셔너리에서 키를 찾지 못한 경우 Null을 반환합니다. #22375를 해결했습니다. #22413 (Maksim Kita).
테이블 함수 s3Cluster가 추가되었습니다. 이를 통해 지정된 cluster의 각 노드에서 s3의 파일을 병렬로 처리할 수 있습니다. #22012 (Nikita Mikhaylov).
MySQL/PostgreSQL 테이블 엔진 / 테이블 함수에서 레플리카와 세그먼트 지원이 추가되었습니다. SELECT * FROM mysql('host{1,2}-{1|2}', ...)와 같이 작성할 수 있습니다. #20969를 해결했습니다. #22217 (Kseniia Sumarokova).
ALTER TABLE ... FETCH PART ... 쿼리가 추가되었습니다. 이는 FETCH PARTITION과 유사하지만, 하나의 파트만 가져옵니다. #22706 (turbo jason).
Distributed 테이블에 대한 재귀 쿼리의 깊이를 제한하는 설정 max_distributed_depth가 추가되었습니다. #20229를 해결했습니다. #21942 (flynn).
로컬 파일이 아닌 소스(예: URL)에서 ArrowStream 입력 형식을 읽을 때의 성능을 개선했습니다. #22673 (nvartolomei).
네이티브 프로토콜로 localhost와 통신할 때(clickhouse-client 사용 시 또는 분산 쿼리의 서버 간 통신 시) 기본적으로 Compression을 비활성화했습니다. 이에 따라 일부 가져오기/내보내기 작업의 성능이 향상될 수 있습니다. 이 변경으로 #22234가 해결되었습니다. #22237 (alexey-milovidov).
분산 쿼리의 IN 절 오른쪽 부분에서 해당 세그먼트에 속하지 않는 값을 제외하도록 했습니다(optimize_skip_unused_shards_rewrite_in 기준, 기본적으로 활성화되지만 여전히 optimize_skip_unused_shards가 필요함). #21511 (Azat Khuzhin).
File 계열 테이블 엔진과 Parquet, Arrow, ORC 같은 컬럼 지향 포맷에서 일부 컬럼만 읽을 때의 성능을 개선했습니다. 이 변경으로 #issue:20129가 해결되었습니다. #21302 (keenwolf).
버전 21.1 이전처럼 더 많은 조건을 PREWHERE로 이동할 수 있도록 했습니다(내부 휴리스틱 조정). 이동되는 조건 수가 충분하지 않으면 성능이 저하될 수 있습니다. #23397 (Anton Popov).
ODBC 연결 성능을 개선하고 백로그에 남아 있던 모든 문제를 수정했습니다. Poco::ODBC 대신 nanodbc 라이브러리를 사용합니다. 이 변경으로 #9678이 해결되었습니다. ODBC 테이블 엔진에 DateTime64 및 Decimal* 지원을 추가했습니다. 이 변경으로 #21961이 해결되었습니다. 키릴 문자 텍스트가 잘리는 문제를 수정했습니다. 이 변경으로 #16246이 해결되었습니다. ODBC bridge용 연결 풀을 추가했습니다. #21972 (Kseniia Sumarokova).
기본값으로 async_socket_for_remote를 활성화했습니다(분산 쿼리에 사용하는 OS 스레드 수를 줄임). #23683 (Nikolai Kochetov).
quantile(s)TDigest를 수정했습니다. tdunning/t-digest 3.2+에 따라 싱글턴 centroid에 대한 특별 처리를 추가했습니다. 또한 이전 버전 알고리즘 구현에서 centroid가 과도하게 압축되던 버그도 수정했습니다. #23314 (Vladimir Chebotarev).
배열 요소의 타입이 서로 다른 일반적인 경우에도 arrayHasAny, arrayHasAll, has, indexOf, countEqual 함수가 동작하도록 구현했습니다. 이전 버전에서는 arrayHasAny, arrayHasAll 함수는 false를 반환했고 has, indexOf, countEqual은 예외를 발생시켰습니다. 또한 has 및 유사한 함수에서 Decimal 및 큰 정수 타입을 지원하도록 추가했습니다. 이로써 #20272가 해결되었습니다. #23044 (alexey-milovidov).
함수 extractAllGroupsHorizontal의 결과에서 최대 일치 개수의 한도를 높였습니다. #23036 (Vasily Nemkov).
SSL을 사용해 clickhouse-keeper(ZooKeeper를 바로 대체할 수 있는 Experimental drop-in replacement)를 실행할 수 있는 기능이 추가되었습니다. 클라이언트와 keeper-server 간의 보안 통신에는 keeper_server.tcp_port_secure 설정을 사용할 수 있습니다. 노드 간 내부 보안 통신을 활성화하려면 keeper_server.raft_configuration.secure를 사용할 수 있습니다. #22992 (alesapin).
자기 자신을 참조하는 ClickHouse 소스로 딕셔너리를 구성할 수 있어 무한 루프가 발생하던 문제를 수정했습니다. #14314를 종료합니다. #22479 (Maksim Kita).
버그 수정
헤지드 요청과 관련된 여러 수정이 적용되었습니다. use_hedged_requests 설정이 활성화된 상태에서 GLOBAL IN/JOIN이 포함된 쿼리에서 발생하던 Can't initialize pipeline with empty pipe 오류를 수정했습니다. #23431을 해결합니다. #23805 (Nikolai Kochetov). 충돌을 유발하던 헤지드 연결의 race condition을 수정했습니다. 이 변경으로 #22161이 해결됩니다. #22443 (Kruglov Pavel). 원격 쿼리에서 unknown packet을 수신했을 때(async_socket_for_remote 활성화 시) 발생할 수 있는 충돌을 수정했습니다. #21167을 해결합니다. #23309 (Nikolai Kochetov).
input_format_with_names_use_header 설정을 비활성화했을 때 CSVWithNames 포맷에서 모든 입력이 버려지던 문제를 수정했습니다. 이 변경으로 #22406이 해결되었습니다. #23202 (Nikita Mikhaylov).
컬럼 자체가 ReplacingMergeTree의 매개변수로 사용되는 경우, 해당 컬럼의 기본값을 수정할 때 발생하던 크래시를 수정했습니다. #23483 (hexiaoting).
ReplacingMergeTree의 수직 병합에서 발생하던 특이한 사례를 수정했습니다. 드물게 Incomplete granules are not allowed while blocks are granules size와 같은 예외로 인해 병합이 실패할 수 있었습니다. #23459 (Anton Popov).
빈 배열 리터럴에서 1보다 큰 차원의 배열로 CAST할 수 없던 버그를 수정했습니다. 예: CAST([] AS Array(Array(String))). #14476를 해결합니다. #23456 (Maksim Kita).
deltaSum 집계 함수에서 카운터를 재설정한 후 잘못된 결과가 발생하던 버그를 수정했습니다. #23437 (Russ Frank).
멀티디스크 구성에서 ReplicatedMergeTree 테이블 생성에 실패했을 때 발생하던 Cannot unlink file 오류를 수정했습니다. 이로써 #21755가 해결되었습니다. #23433 (tavplubix).
오래된 블록을 백그라운드에서 정리하는 과정에서 매우 드물게 발생하던 경쟁 상태를 수정했습니다. 이 문제로 인해 블록이 중복 제거 윈도우의 끝에 너무 가까우면 중복 제거되지 않을 수 있었습니다. #23301 (tavplubix).
ReplicatedMergeTree 테이블을 생성하거나 제거하는 과정 사이에서 발생하는 매우 드문 (distributed) race condition를 수정했습니다. 이 문제로 인해 복제된 테이블(Replicated Table)을 생성하려고 할 때 node doesn't exist와 같은 예외가 발생할 수 있었습니다. 이 수정은 #21419를 해결합니다. #23294 (tavplubix).
프라이머리 키(primary key)가 첫 번째 속성이 아닐 경우 DDL 생성 시 단순 키 딕셔너리에서 발생하던 문제를 수정했습니다. #23236을 수정합니다. #23262 (Maksim Kita).
Map 데이터 타입(실험적 기능): 분산 쿼리에서 함수 map이 잘못 포맷되던 문제를 수정했습니다. #22588 (foolchi).
TSV 포맷 끝에 개행이 없는 빈 문자열을 역직렬화할 때 발생하던 문제를 수정했습니다. 이로써 #20244가 해결되었습니다. 버전을 업데이트하지 않고 적용할 수 있는 우회 방법으로 input_format_null_as_default를 0으로 설정할 수 있습니다. 이전 버전에서는 이 값이 0이었습니다. #22527 (alexey-milovidov).
optimize_aggregation_in_order가 활성화되어 있고 테이블에 파트가 많은 경우 데이터가 충분히 집계되지 않던 버그를 수정했습니다. optimize_aggregation_in_order가 활성화된 상태에서 집계 성능도 약간 개선했습니다. #21889 (Anton Popov).
테이블 함수 view가 컬럼으로 사용되는지 확인합니다. 이는 #20350을 보완합니다. #21465 (Amos Bird).
Merge 엔진을 사용하는 테이블에서 JOIN 및 집계가 포함된 쿼리의 "알 수 없는 컬럼" 오류를 수정했습니다. #18368 및 #22226를 해결했습니다. #21370 (Vladimir).
pushdown 최적화에서 발생한 이름 충돌 문제를 수정했습니다. 이로 인해 FULL JOIN 이후 WHERE 필터링이 잘못 적용되던 문제가 있었습니다. #20497를 해결했습니다. #20622 (Vladimir).
중복 제거로 인해 quorum_parallel=1을 사용한 quorum 삽입이 실제로는 "quorum"으로 동작하지 않는 매우 드문 버그를 수정했습니다. #18215 (filimonov - 보고, alesapin - 수정).
toStartOfIntervalFunction은 이제 시간 인터벌을 자정 기준으로 정렬합니다(이전 버전에서는 unix epoch 시작 시점 기준으로 정렬되었습니다). 예를 들어 toStartOfInterval(x, INTERVAL 11 HOUR)는 하루를 3개의 인터벌로 나눕니다: 00:00:00..10:59:59, 11:00:00..21:59:59, 22:00:00..23:59:59. 이 동작은 실제 사용 요구에 더 적합합니다. 이 변경으로 #9510이 해결되었습니다. #22060 (alexey-milovidov).
graphite 롤업 구성에서 Age와 Precision은 retention이 증가함에 따라 함께 증가해야 합니다. 이제 이를 검사하며, 잘못된 구성인 경우 예외가 발생합니다. #21496 (Mikhail f. Shiryaev).
사용자 지정 최상위 도메인 목록에 포함된 3단계 이상 도메인에 대해 cutToFirstSignificantSubdomainCustom()/firstSignificantSubdomainCustom()가 잘못된 결과를 반환하던 문제를 수정했습니다. 이러한 사용자 지정 최상위 도메인과 일치하는 입력 도메인에서는 3단계 도메인이 첫 번째 유의미한 도메인으로 간주되고 있었습니다. 이제 이 문제가 수정되었습니다. 다만 이 함수가 예를 들어 세그먼트 분할 키에서 사용되는 경우, 이 변경으로 인해 호환되지 않는 동작이 발생할 수 있습니다. #21946 (Azat Khuzhin).
system.dictionaries 테이블의 keys 컬럼이 key.names 및 key.types 컬럼으로 대체되었습니다. system.dictionaries 테이블의 key.names, key.types, attribute.names, attribute.types 컬럼은 딕셔너리가 로드되지 않아도 사용할 수 있습니다. #21884 (Maksim Kita).
이제 ALTER TABLE ATTACH PART[ITION] 명령을 처리하는 레플리카는 다른 레플리카에서 데이터를 가져오기 전에 자신의 detached/ 폴더를 먼저 검색합니다. 구현 세부 사항으로, 복제 로그에 새로운 ATTACH_PART 명령이 도입되었습니다. 파트는 체크섬을 기준으로 검색하고 비교합니다. #18978 (Mike Kot). 참고:
cluster 업그레이드 중에는 ATTACH PART[ITION] 쿼리가 작동하지 않을 수 있습니다.
새 버전에서 ALTER ... ATTACH 쿼리를 실행한 후에는 이전 ClickHouse 버전으로 롤백할 수 없습니다. 이전 server가 복제 로그의 ATTACH_PART 항목을 처리하지 못하기 때문입니다.
이 버전에서는 비어 있는 <remote_url_allow_hosts></remote_url_allow_hosts>가 모든 원격 호스트 접근을 차단하지만, 이전 버전에서는 아무 동작도 하지 않았습니다. 기존 동작을 유지하려면 설정 파일에 비어 있는 remote_url_allow_hosts 요소가 있다면 이를 제거하십시오. #20058 (Vladimir Chebotarev).
새로운 기능
DateTime64의 범위를 확장해 1925년부터 2283년까지의 날짜를 지원합니다. 제로 날짜(1970-01-01) 전후의 DateTime 지원도 개선했습니다. #9404 (alexey-milovidov, Vasily Nemkov). 다만 모든 시간 및 날짜 함수가 확장된 날짜 범위에서 동작하는 것은 아닙니다.
사전 구성된 사용자와 HTTP 요청에 대한 Kerberos 인증(GSS-SPNEGO) 지원이 추가되었습니다. #14995 (Denis Glazachev).
별칭 대신 원래 컬럼 이름을 사용하기 위한 prefer_column_name_to_alias 설정을 추가했습니다. 이는 일반적인 데이터베이스의 별칭 규칙과의 호환성을 높이기 위해 필요합니다. #9715 및 #9887에 해당합니다. #22044 (Amos Bird).
함수 dictGetChildren(dictionary, key), dictGetDescendants(dictionary, key, level)가 추가되었습니다. 함수 dictGetChildren은 모든 자식 항목을 인덱스의 배열로 반환합니다. 이 함수는 dictGetHierarchy의 역변환입니다. 함수 dictGetDescendants는 dictGetChildren을 level번 재귀적으로 적용한 것과 같이 모든 하위 항목을 반환합니다. level 값이 0이면 무한대로 간주됩니다. #14656을 해결합니다. #22096 (Maksim Kita).
DateTime 또는 DateTime64 데이터 타입의 시간대 이름을 반환하는 timezoneOf 함수를 추가했습니다. 이 변경은 #9959를 해결하지는 않습니다. 함수 이름의 불일치를 수정하여 timezone 및 timeZone, toTimezone 및 toTimeZone, timezoneOf 및 timeZoneOf 별칭을 추가했습니다. #22001 (alexey-milovidov).
CREATE/ALTER USER 명령에 새로운 선택적 절 GRANTEES가 추가되었습니다. 이 절은 이 사용자가 grant option과 함께 필요한 모든 접근 권한도 부여받은 경우, 이 사용자로부터 권한을 부여받을 수 있는 사용자 또는 역할을 지정합니다. 기본값은 GRANTEES ANY이며, 이는 grant option이 있는 사용자가 누구에게나 권한을 부여할 수 있음을 의미합니다. 구문: CREATE USER ... GRANTEES {user | role | ANY | NONE} [,...] [EXCEPT {user | role} [,...]]. #21641 (Vitaly Baranov).
system.clusters에 새 컬럼 slowdowns_count를 추가했습니다. hedged requests를 사용할 때 이 레플리카의 응답이 느려 다른 레플리카로 전환한 횟수를 보여줍니다. 또한 system.clusters에서 errors_count의 실제 값도 표시합니다. #21480 (Kruglov Pavel).
MergeTree* 엔진에 _partition_id 가상 컬럼을 추가했습니다. _partition_id를 사용해 파티션 프루닝이 가능해졌습니다. 파티션 ID 문자열을 계산하는 partitionID() 함수를 추가했습니다. #21401 (Amos Bird).
주어진 CIDR 네트워크 프리픽스에 IPv4 또는 IPv6 주소가 속하는지 확인하는 isIPAddressInRange 함수를 추가했습니다. #21329 (PHO).
새로운 SQL 명령 ALTER TABLE 'table_name' UNFREEZE [PARTITION 'part_expr'] WITH NAME 'backup_name'이 추가되었습니다. 이 명령은 모든 디스크에서 '동결된' 파티션을 올바르게 삭제하는 데 필요합니다. #21142 (Pavel Kovalenko).
부동소수점 타입에 대해 RANGE OFFSET 프레임(윈도우 함수)을 지원합니다. lag/lead와 유사하지만 윈도우 프레임을 따르는 lagInFrame/leadInFrame 윈도우 함수를 구현했습니다. 프레임이 between unbounded preceding and unbounded following인 경우에는 두 함수가 동일합니다. 이로써 #5485가 해결되었습니다. #21895 (Alexander Kuzmenkov).
S3 storage 기반 ReplicatedMergeTree의 zero-copy 복제를 지원합니다. #16240 (ianton-ru).
기존 S3 디스크를 백업 및 복원 기능을 지원하는 스키마로 마이그레이션할 수 있는 기능이 추가되었습니다. #22070 (Pavel Kovalenko).
64 MiB 이상의 파일 범위에 대해 mmap IO 읽기를 활성화합니다(설정 min_bytes_to_use_mmap_io). 이에 따라 성능이 어느 정도 향상될 수 있습니다. #22326 (alexey-milovidov).
min_bytes_to_use_mmap_io 설정으로 읽는 파일에 cache를 추가합니다. 이 설정값이 작을 때 빈번한 mmap/munmap 호출과 그에 따른 페이지 폴트를 줄여 성능이 크게(2배 이상) 향상됩니다. mmap IO는 운영 환경에서 신뢰성이 떨어질 수 있는 큰 단점도 있습니다(예: 디스크 결함 시 hang 또는 SIGBUS 발생, 제어하기 더 어려운 메모리 사용량). 그럼에도 벤치마크에서는 유용합니다. #22206 (alexey-milovidov).
코덱 NONE을 사용할 때 불필요한 데이터 복사를 피합니다. 코덱 NONE은 대체로 거의 쓸모가 없으며, Compression(LZ4가 기본값)을 항상 사용하는 것을 권장합니다. 일반적인 인식과 달리 압축을 비활성화해도 성능이 향상되지 않을 수 있으며, 오히려 반대 효과가 날 수도 있습니다. NONE 코덱은 일부 경우에 유용합니다. - 데이터가 압축되지 않는 경우 - 합성 벤치마크의 경우 #22145 (alexey-milovidov).
max_rows_to_group_by가 작고 group_by_overflow_mode='any'인 경우 GROUP BY를 더 빠르게 수행합니다. #21856 (Nikolai Kochetov).
SELECT ... FINAL ... WHERE 형태의 쿼리 성능을 최적화합니다. 이제 FINAL이 포함된 쿼리에서는 sorting key에 포함된 컬럼을 PREWHERE로 이동할 수 있습니다. #21830 (foolchi).
새로운 MergeTree 설정 min_bytes_to_rebalance_partition_over_jbod를 도입하여 JBOD 볼륨의 서로 다른 디스크에 새 파트를 균형 있게 할당할 수 있도록 했습니다. #16481 (Amos Bird).
system.query_log의 해당 쿼리에 대해 query_kind 컬럼에 Grant, Revoke, System 값을 추가했습니다. #21102 (Vasily Nemkov).
복제에 사용되는 HTTP 연결에 대한 시간 제한을 다른 HTTP 시간 제한과 별도로 설정할 수 있도록 했습니다. #20088 (nvartolomei).
server가 블록을 쓰는 도중 예외가 발생할 경우, client에 더 나은 예외 메시지가 표시되도록 개선했습니다. 이전 버전에서는 client가 Data compressed with different methods와 같이 오해를 불러일으킬 수 있는 메시지를 받을 수 있었습니다. #22427 (alexey-milovidov).
part fetch 실패 후 발생할 수 있던 Directory tmp_fetch_XXX already exists 오류를 수정했습니다. 이미 존재하는 경우 임시 fetch 디렉터리를 삭제하도록 했습니다. #14197을 해결했습니다. #22411 (nvartolomei).
UInt256 인수를 사용하는 range 함수의 MSan 리포트를 수정했습니다(큰 정수 지원은 실험적 기능입니다). 이로써 #22157가 해결되었습니다. #22387 (alexey-milovidov).
system.processes 테이블에 current_database 컬럼을 추가했습니다. 이 컬럼에는 해당 쿼리의 현재 데이터베이스가 저장됩니다. #22365 (Alexander Kuzmenkov).
clickhouse-client에 대소문자를 구분하지 않는 이력 검색/이동과 하위 단어 단위 이동 기능을 추가했습니다. #22105 (Amos Bird).
예를 들어 (NULL, NULL)처럼 NULL로만 이루어진 튜플이 IN 연산자의 왼쪽에 있고, SELECT (NULL, NULL) IN ((0, 0), (3, 1))처럼 오른쪽에 NULL이 아닌 값으로 이루어진 튜플이 있는 경우, 호환되지 않는 타입이라는 예외를 발생시키는 대신 0을 반환합니다. 이 표현식은 SELECT (NULL, NULL) = (8, 0) OR (NULL, NULL) = (3, 2) OR (NULL, NULL) = (0, 0) OR (NULL, NULL) = (3, 1)과 같은 구문이 최적화되는 과정에서 나타날 수도 있습니다. 이 변경으로 #22017이 해결되었습니다. #22063 (alexey-milovidov).
CONNECTION_ID() 및 VERSION() 함수에 대소문자를 구분하지 않고 사용할 수 있는 별칭이 추가되었습니다. 이 변경으로 #22028 문제가 수정되었습니다. #22042 (Eugene Klimov).
각 이벤트가 한 번만 계산되도록 windowFunnel 함수에 strict_increase 옵션을 추가했습니다(#21835 해결). #22025 (Vladimir).
MergeTree 테이블의 파티션 키에 Date 또는 DateTime 컬럼은 없고 DateTime64 컬럼이 정확히 하나만 포함된 경우, 해당 값을 system.parts 및 system.parts_columns 테이블의 min_time 및 max_time 컬럼에 표시합니다. system.parts_columns 테이블에 min_time 및 max_time 컬럼을 추가했습니다(system.parts 테이블과의 불일치가 있었습니다). 이로써 #18244가 해결되었습니다. #22011 (alexey-milovidov).
clickhouse-copier에서 보조 테이블에서 대상으로 파티션을 이동할 때 replication_alter_partitions_sync=1 설정을 지원합니다. 기본 타임아웃 값을 줄였습니다. #21911을 수정했습니다. #21912 (turbo jason).
시스템 테이블에서 EmbeddedRocksDB 테이블의 데이터 디렉터리 경로를 표시합니다. #21903 (tavplubix).
프로파일 이벤트 HedgedRequestsChangeReplica를 추가하고, 데이터 읽기 timeout 단위를 초에서 ms로 변경했습니다. #21886 (Kruglov Pavel).
DiskS3 (개발 중인 실험적 기능). 대상 디렉터리가 비어 있지 않고 캐시 디스크를 사용하는 경우 디렉터리를 이동할 수 없던 버그를 수정했습니다. #21837 (Pavel Kovalenko).
분산 DDL 쿼리에서 쿼리 및 세션 설정이 전파되도록 했습니다. 이를 활성화하려면 distributed_ddl_entry_format_version을 2로 설정하십시오. distributed_ddl_output_mode 설정이 추가되었습니다. 지원되는 모드: none, throw(기본값), null_status_on_timeout, never_throw입니다. Replicated 데이터베이스 엔진에 여러 수정 및 개선 사항이 적용되었습니다. #21535 (tavplubix).
PODArray가 요소 크기를 16의 약수나 배수가 아닌 값으로 인스턴스화된 경우, 버퍼 오버플로우가 발생할 수 있었습니다. 현재 릴리스에는 이러한 버그가 없습니다. #21533 (alexey-milovidov).
드물게 CollapsingMergeTree의 머지 과정에서 index_granularity + 1개의 행을 포함하는 그래뉼이 생성될 수 있습니다. 이로 인해 #18928에서 추가된 내부 검사(21.2 및 21.3에 영향)가 Incomplete granules are not allowed while blocks are granules size 오류와 함께 실패할 수 있습니다. 이 오류로 인해 파트가 머지되지 못했습니다. #21976 (Nikolai Kochetov).
ALTER MODIFY COLUMN 쿼리에서 Decimal 컬럼의 크기(32비트 또는 64비트)가 바뀌지 않으면 컬럼 유형이 변경되지 않는 ReplicatedMerge 테이블 엔진 버그를 수정했습니다. #21728 (alesapin).
ReplicatedMergeTree에서 OPTIMIZE와 DROP이 동시에 실행될 때 발생할 수 있는 무한 대기 문제를 수정했습니다. #21716 (Azat Khuzhin).
상수 정수 인수에 대해 Map 유형의 arrayElement 함수 문제를 수정했습니다. #21699 (Anton Popov).
access_to_key_from_attributes 사용 시 ip_trie에 존재하지 않는 속성 때문에 발생하던 SIGSEGV를 수정했습니다. #21692 (Azat Khuzhin).
서버는 이제 DDLWorker 및 Dictionaries 초기화가 완료된 후에만 연결을 수락합니다. #21676 (Azat Khuzhin).
Join 유형의 테이블 키에 대한 형 변환을 추가했습니다(이전에는 SIGSEGV를 유발했습니다). #21646 (Azat Khuzhin).
async_socket_for_remote=1 사용 시 분산 요청 취소 문제가 수정되었습니다(예: limit이 포함된 여러 세그먼트에 대한 단순 select, 즉 select * from remote('127.{2,3}', system.numbers) limit 100). #21643 (Azat Khuzhin).
PowerPC 빌드를 위한 여러 사전 작업: ppc64le에서 번들 openldap을 활성화했습니다. #22487 (Kfir Itzhak). ppc64le에서 Clang으로 컴파일할 수 있도록 했습니다. #22476 (Kfir Itzhak). ppc64le에서 boost 컴파일 문제를 수정했습니다. #22474 (Kfir Itzhak). ppc64le에서 내부 CMake 변수 CMAKE_ASM_COMPILE_OBJECT가 설정되지 않아 발생하던 CMake 오류를 수정했습니다. #22469 (Kfir Itzhak). Fedora/RHEL/CentOS에서 ppc64le의 libclang_rt.builtins를 찾지 못하던 문제를 수정했습니다. #22458 (Kfir Itzhak). ppc64le에서 jemalloc으로 빌드할 수 있도록 했습니다. #22447 (Kfir Itzhak). ppc64le에서 ClickHouse 설정 임베딩과 cctz 시간대 임베딩 문제를 수정했습니다. #22445 (Kfir Itzhak). ppc64le에서의 컴파일 문제를 수정하고, 올바른 instruction pointer register를 사용하도록 했습니다. #22430 (Kfir Itzhak).
cmake 스크립트의 검색 대상에 llvm-12 바이너리 이름을 추가했습니다. clang 경고를 억제하기 위해 암시적 상수 변환을 적용했습니다. CMake 3.19로 빌드할 수 있도록 서브모듈을 업데이트했습니다. readpassphrase 라이브러리의 매크로 확장에서 재귀를 억제했습니다. clang에서 더 이상 권장되지 않는 -fuse-ld를 --ld-path로 변경했습니다. #21597 (Ilya Yatsishin).
Docker Hub에서 매우 엄격한 요청 횟수 제한을 적용했기 때문에, Yandex dockerhub-proxy를 사용하도록 docker/test/testflows/runner/dockerd-entrypoint.sh를 업데이트했습니다 #21551 (vzakaznikov).
zookeeper-dump-tree에 ctime 옵션이 추가되었습니다. 이 옵션을 사용하면 노드 생성 시각을 덤프할 수 있습니다. #21842 (Ilya).
ClickHouse 릴리스 21.3 (LTS)
ClickHouse 릴리스 v21.3, 2021-03-12
하위 호환되지 않는 변경 사항
이제 기존 구문으로 table TTL이 포함된 MergeTree 테이블을 생성할 수 없습니다. 해당 TTL이 무시되기 때문입니다. 기존 테이블은 계속 ATTACH할 수 있습니다. #20282 (alesapin).
이제 대소문자를 구분하지 않는 모든 함수 이름은 정규 표기로 다시 작성됩니다. 이는 프로젝션 쿼리 라우팅(예정된 기능)에 필요합니다. #20174 (Amos Bird).
표현식이 함수이고 ORDER BY 키와 동일한 경우의 TTL 생성 문제를 수정했습니다. 이제 GROUP BY가 있는 TTL에서는 프라이머리 키 컬럼에 사용자 지정 집계를 설정할 수 있습니다. 하위 호환되지 않음: 이제 GROUP BY에 포함되지 않고 명시적으로 설정되지 않은 프라이머리 키 컬럼에는 TTL이 만료될 때 max 대신 any 함수가 적용됩니다. 또한 WHERE 또는 GROUP BY와 함께 TTL을 사용하면 롤링 업데이트 중 머지 시 예외가 발생할 수 있습니다. #15450 (Anton Popov).
새로운 기능
파일 엔진 설정 engine_file_empty_if_not_exists 및 engine_file_truncate_on_insert를 추가했습니다. #20620 (M0r64n).
S3 클라이언트에 Server Side Encryption Customer Keys(x-amz-server-side-encryption-customer-(key/md5) header) 지원을 추가했습니다. 자세한 내용은 링크를 참조하십시오. 이 변경으로 #19428이 해결됩니다. #19748 (Vladimir Chebotarev).
실행형 딕셔너리 소스에 implicit_key 옵션을 추가했습니다. 이 옵션을 사용하면 레코드가 입력 키와 동일한 순서로 들어올 때 각 레코드마다 키를 출력하지 않아도 됩니다. #14527을 구현합니다. #19677 (Maksim Kita).
QUOTA 유형 query_selects 및 query_inserts를 추가했습니다. #19603 (JackyWoo).
이제 MergeTree* 엔진을 사용하는 테이블에는 쿼리 동시성 제어를 위한 새 테이블 수준 설정 2개가 있습니다. max_concurrent_queries 설정은 이 테이블과 관련된 동시 실행 쿼리 수를 제한합니다. min_marks_to_honor_max_concurrent_queries 설정은 쿼리가 최소 이 수만큼의 마크를 읽는 경우에만 앞선 설정을 적용하도록 지정합니다. #19544 (Amos Bird).
user_files 디렉터리의 파일을 String으로 읽는 file 함수를 추가했습니다. 이는 file 테이블 함수와는 다릅니다. 이 변경은 #issue:18851을 구현합니다. #19204 (keenwolf).
실험적 기능
실험적인 Replicated 데이터베이스 엔진을 추가했습니다. 이 엔진은 여러 호스트 간에 DDL 쿼리를 복제합니다. #16193 (tavplubix).
allow_experimental_window_functions = 1로 활성화되는 윈도우 함수 지원을 실험적으로 도입했습니다. 이는 alpha 수준의 초기 구현으로, 프로덕션 환경에는 적합하지 않으며 이후 릴리스에서 하위 호환되지 않는 방식으로 변경될 예정입니다. 지원되는 기능 목록은 문서를 참조하십시오. #20337 (Alexander Kuzmenkov).
원격 쿼리를 위한 헤지드 요청입니다. use_hedged_requests를 활성화하면(기본값은 비활성화) 쿼리를 위해 서로 다른 레플리카에 대해 여러 연결을 설정할 수 있습니다. 기존 레플리카 연결이 hedged_connection_timeout 내에 수립되지 않았거나 receive_data_timeout 내에 데이터를 받지 못한 경우 새 연결이 활성화됩니다. 쿼리는 비어 있지 않은 첫 번째 progress 패킷(또는 allow_changing_replica_until_first_data_packet가 설정된 경우 데이터 패킷)을 보내는 연결을 사용하며, 다른 연결은 취소됩니다. max_parallel_replicas > 1인 쿼리도 지원됩니다. #19291 (Kruglov Pavel). 이를 통해 매우 큰 클러스터에서 테일 레이턴시를 크게 줄일 수 있습니다.
파이프라인을 단순화하고, 그에 따라 파이프라인 스케줄링에서의 잠금 경합을 줄여 극단적인 경우(Memory 테이블의 읽기 속도가 초당 50 GB 수준에 이르는 경우) Memory 테이블의 읽기 성능을 향상했습니다. #20468 (alexey-milovidov).
들어오고 나가는 데이터의 복사 횟수를 줄이기 위해 HTTP server를 부분적으로 다시 구현했습니다. 이로써 HTTP를 통해 긴 레코드를 삽입할 때 성능이 최대 1.5배 향상됩니다. #19516 (Ivan).
Memory 테이블에 compress 설정이 추가되었습니다. 이 설정을 활성화하면 테이블이 사용하는 RAM이 줄어듭니다. 일부 머신과 데이터셋에서는 SELECT 시 더 빠르게 동작할 수도 있지만, 항상 그런 것은 아닙니다. 이 변경으로 #20093가 해결되었습니다. 참고: Memory 테이블이 MergeTree보다 더 느리게 동작할 수 있는 이유는 (1) 압축 부재 (2) 블록의 고정된 크기 (3) 인덱스와 prewhere 부재 때문입니다… #20168 (alexey-milovidov).
INSERT SELECT로 Memory 테이블에 삽입할 때 블록을 과도하게 합치지 않도록 했습니다. 이전 버전에서는 INSERT SELECT 이후 Memory 테이블에 비효율적인 데이터 표현이 만들어졌습니다. 이로써 #13052를 해결합니다. #20169 (alexey-milovidov).
테이블 함수에서 압축 방식을 대소문자 구분 없이 사용할 수 있도록 했습니다. 또한 대문자로 검사되던 LZMA 압축 방식도 수정했습니다. #21416 (Vladimir Chebotarev).
삽입 중 비활성 파트가 너무 많으면 삽입을 지연하거나 오류를 발생시키는 두 가지 설정을 추가했습니다. 이는 서버가 파트를 충분히 빠르게 정리하지 못할 때 유용합니다. #20178 (Amos Bird).
mysql 클라이언트와의 호환성을 개선했습니다. 1. mysql jdbc 2. mycli. #21367 (Amos Bird).
materialized view에서 참조 중인 컬럼은 삭제할 수 없도록 했습니다. Closes #21164. #21303 (flynn).
이제 MySQL 딕셔너리 소스는 SSL/TLS 연결에서 가끔 발생하는 예기치 않은 연결 실패(Lost connection to MySQL server during query)가 발생하면 재시도합니다. #21237 (Alexander Kazakov).
사용성 개선: DateTime64 파싱이 더 일관되게 이루어지도록 개선했습니다. 소수 초 해상도의 Unix timestamp가 1111111111.222 대신 1111111111222와 같이 스케일된 정수로 지정된 경우를 인식합니다. 이로써 #13194가 해결됩니다. #21053 (alexey-milovidov).
distributed_group_by_no_merge 사용 시 initiator에서는 정렬된 블록만 머지하도록 변경했습니다. #20882 (Azat Khuzhin).
mysql source의 구성을 로드할 때 ClickHouse는 이제 동일한 우선순위를 가진 레플리카 목록을 무작위로 섞어, mysql endpoint를 선택하는 라운드 로빈 로직이 올바르게 동작하도록 합니다. 이로써 #20629가 해결되었습니다. #20632 (Alexander Kazakov).
함수 'reinterpretAs(x, Type)'가 'reinterpret(x, Type)'로 이름이 변경되었습니다. #20611 (Maksim Kita).
배열과 튜플이 결합된 데이터 타입의 직렬화를 개선했습니다. enum 데이터 타입을 protobuf enum 타입에 매칭하는 방식을 개선했습니다. Map 데이터 타입의 직렬화를 수정했습니다. 이제 생략된 값에는 기본값이 설정됩니다. #20506 (Vitaly Baranov).
분산 DDL 작업 실행과 DDL 큐 정리 사이의 경쟁 상태를 수정했습니다. 이제 활성 상태의 worker가 있으면 DDL 작업을 ZooKeeper에서 제거할 수 없습니다. #20016을 해결했습니다. #20448 (tavplubix).
alpine 이미지에서 FQDN 및 기타 DNS 관련 함수가 올바르게 동작하도록 개선했습니다. #20336 (filimonov).
이제 시작 시 CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT를 지정해 access_management 설정을 구성할 수 있습니다. 기본값은 비활성화(0)이며, 이는 이전과 동일한 값입니다. #20139 (Marquitos).
toDateTime64(toDate()/toDateTime())의 DateTime64 관련 수정 - DateTime 동작에 맞게 DateTime64 클램핑을 구현했습니다. #20131 (Azat Khuzhin).
Quota 개선사항: 이제 quota 계산 시 SHOW TABLES는 2개의 쿼리가 아니라 1개의 쿼리로 간주됩니다. 이제 SYSTEM 쿼리도 quota를 소모합니다. quota 사용량 계산에서 인터벌 끝값 계산을 수정했습니다. #20106 (Vitaly Baranov).
system.zookeeper 테이블에서 path IN (set) 표현식을 지원합니다. #20105 (小路).
system.tables에서 MaterializeMySQL 테이블의 상세 정보를 모두 표시합니다. #20051 (Stig Bakken).
잘못 사용한 경우에만 발생할 수 있었던 실행형 딕셔너리의 데이터 레이스를 수정했습니다(예: 스크립트가 입력을 무시하고 데이터를 반환하는 경우). #20045 (alexey-milovidov).
이제 MySQL 레플리카의 config 섹션에서 "opt_reconnect" 매개변수로 MYSQL_OPT_RECONNECT 옵션 값을 제어할 수 있습니다. #19998 (Alexander Kazakov).
사용자가 JSONExtract 함수를 호출할 때 요청한 유형이 Float32이면, 결과 유형으로의 부정확한 변환을 허용합니다. 예를 들어 JSON의 숫자 0.1은 배정밀도(double precision)이므로 Float32로는 정확히 표현할 수 없지만, 사용자는 여전히 그 값을 얻고자 합니다. 이전 버전에서는 변환이 부정확함을 나타내기 위해 널 허용이 아닌 유형에는 0을, 널 허용 유형에는 NULL을 반환했습니다. 이 로직은 100% 정확했지만 사용자에게는 예상 밖이었고 혼란을 일으켜 질문으로 이어졌습니다. 이 변경으로 #13962가 해결됩니다. #19960 (alexey-milovidov).
분산 테이블에 INSERT할 때 블록 구조가 일치하지 않으면 이를 변환하는 기능을 추가했습니다. #19947 (Azat Khuzhin).
system.distributed_ddl_queue 테이블이 개선되었습니다. 재시작 후 MaxDDLEntryID를 마지막 값으로 초기화합니다. 이 PR 이전에는 새 DDLTask가 처리되기 전까지 MaxDDLEntryID가 0으로 유지되었습니다. #19924 (Amos Bird).
비동기 전송의 대기 중 바이트 수를 기준으로 Distributed 엔진에 대한 INSERT 속도를 제한하는 기능이 추가되었습니다(Distributed 엔진에 bytes_to_delay_insert/max_delay_to_insert 및 bytes_to_throw_insert 설정이 추가됨). #19673 (Azat Khuzhin).
치명적 오류 발생 시 스택 트레이스에 인라인 프레임을 출력합니다. #19317 (Ivan).
버그 수정
ZooKeeper에 대한 불필요한 재연결과 단일 ClickHouse 서버에서 두 개의 세션이 동시에 활성화될 수 있는 문제를 수정했습니다. 두 문제 모두 #14678에서 도입되었습니다. #21264 (alesapin).
Values 포맷에서 LowCardinality 컬럼이 있는 테이블에 데이터를 삽입할 때 발생하던 Bad cast from type ... to DB::ColumnLowCardinality 오류를 수정했습니다. #21140을 수정했습니다 #21357 (Nikolai Kochetov).
프레디케이트에 해당 테이블 자체가 포함된 경우, 비복제 MergeTree 테이블 엔진의 ALTER DELETE 뮤테이션에서 발생하던 교착 상태를 수정했습니다. #20558를 해결합니다. #21477 (alesapin).
ALTER MODIFY COLUMN이 실패가 확실한 mutation을 생성하던 동작을 수정했습니다. #21007 (Anton Popov).
#9969를 닫습니다. 대용량 데이터, 다소 복잡한 구조, JSON 출력 형식에서 재현되던 Brotli HTTP Compression 오류를 수정했습니다. "ring-buffer에서 초기화되지 않은 데이터에 드물게 접근하던 문제 수정"을 포함하도록 Brotli를 최신 버전으로 업데이트했습니다. #20991 (Kseniia Sumarokova).
맵 데이터 타입을 위한 세 가지 함수가 추가되었습니다: 1. mapContains(map, key)는 map.keys에 두 번째 매개변수인 key가 포함되어 있는지 확인합니다. 2. mapKeys(map)는 모든 키를 배열 형식으로 반환합니다. 3. mapValues(map)는 모든 값을 배열 형식으로 반환합니다. #18788 (hexiaoting).
stat syscall 수를 줄여 파트 제거 속도를 높였습니다. 이는 예전에 있던 최적화를 다시 적용한 것입니다. 또한 IDisk 인터페이스를 더 안전하게 개선했습니다. 이 변경으로 #19065가 해결되었습니다. #19086 (alexey-milovidov).
WITH 구문에서 선언한 별칭이 인덱스 분석에 올바르게 사용되도록 했습니다. 이제 WITH column AS alias SELECT ... WHERE alias = ...와 같은 쿼리에서도 인덱스를 사용할 수 있습니다. #18896 (Amos Bird).
optimize_alias_column_prediction을 추가했습니다(기본적으로 활성화됨). 이 설정은 다음을 수행합니다. - 파티션 프루닝과 보조 인덱스를 사용한 데이터 스키핑 시 WHERE 절의 별칭 컬럼을 반영합니다. - optimize_trivial_count를 위한 단순 count 쿼리에서 WHERE 절의 별칭 컬럼을 반영합니다. - optimize_aggregation_in_order/optimize_read_in_order를 위한 GROUP BY/ORDER BY에서 별칭 컬럼을 반영합니다. #16995 (sundyli).
쿼리 계획의 Filter 단계를 Expression + Filter 쌍으로 분할할 수 있도록 지원합니다. Expression + Expression 병합 최적화(#17458)와 함께 사용하면 Filter 단계 이후 일부 표현식의 실행을 지연시킬 수 있습니다. #19253 (Nikolai Kochetov).
개선
SELECT count() FROM table는 이제 table에서 임의의 컬럼 1개만 선택할 수 있어도 실행할 수 있습니다. 이 PR은 #10639을 수정합니다. #18233 (Vitaly Baranov).
분산 쿼리에서 설정 async_socket_for_remote가 활성화된 경우, 테이블에 매우 깊게 중첩된 데이터 타입(예: Array(Array(Array(...more...))))을 사용하면 적어도 디버그 빌드 구성에서는 스택 오버플로우가 발생할 수 있었습니다. 이 변경으로 #19108가 수정되었습니다. 이 변경에는 경미한 하위 호환성 문제가 있습니다. 이제 타입 정의에서 과도한 괄호는 더 이상 지원되지 않습니다. 예시: Array((UInt8)). #19736 (alexey-milovidov).
읽기 시 체크섬 검증을 비활성화하는 옵션을 추가했습니다. 프로덕션 환경에서는 절대 사용해서는 안 됩니다. 이를 비활성화해도 어떤 이점도 기대하지 마십시오. 실험과 벤치마크에만 사용할 수 있습니다. 이 설정은 MergeTree 엔진 계열의 테이블에만 적용됩니다. 다른 테이블 엔진에서는 물론 네트워크를 통해 데이터를 수신할 때도 항상 체크섬을 검증합니다. 제 관찰로는 성능 차이가 없거나 0.5% 미만입니다. #19588 (alexey-milovidov).
이전 버전에서는 함수 bar가 특정 NaN 인수로 호출될 때 발생하는 예외가 다소 오해의 소지가 있을 수 있었습니다. 이 수정으로 #19088 문제가 해결되었습니다. #19107 (alexey-milovidov).
clickhouse-server 이미지에서 clickhouse 사용자 및 그룹의 uid / gid를 고정값(101)으로 명시적으로 설정했습니다. #19096 (filimonov).
매우 긴 문자열이 포함된 데이터를 삽입할 때 발생하던 PeekableReadBuffer: Memory limit exceed 오류를 수정했습니다. #18690을 해결합니다. #18979 (tavplubix).
Docker 이미지: clickhouse-server 엔트리포인트가 여러 면에서 개선되었습니다. #18954 (filimonov).
긴 이름을 ?로 마스킹하지 않고도 쿼리를 정규화할 수 있도록 normalizeQueryKeepNames와 normalizedQueryHashKeepNames를 추가했습니다. 이를 통해 복잡한 쿼리 로그를 더욱 효과적으로 분석할 수 있습니다. #18910 (Amos Bird).
전송 전에 송신 측에서 분산 배치의 블록별 체크섬을 확인합니다(파일을 두 번 읽지 않고도, 읽는 동안 체크섬이 검증됩니다). 이렇게 하면 송신 측의 잘린 .bin 파일로 인해 수신 측에서 INSERT가 멈추는 현상을 방지할 수 있습니다. 또한 배치 INSERT를 위해 .bin 파일을 두 번 읽지 않도록 했습니다(이전에는 squashing을 고려해 행 수/바이트 수를 계산하기 위해 필요했지만, 이제 이 정보가 헤더에 포함되며 하위 호환성도 유지됩니다). #18853 (Azat Khuzhin).
집계 함수 상태를 가진 테이블의 RIGHT 및 FULL JOIN 문제를 수정했습니다. 이전 버전에서는 cloneResized 메서드와 관련된 예외가 발생했습니다. #18818 (templarzq).
LowCardinality 인수와 함께 함수 ignore를 사용할 때 발생할 수 있는 오류 Expected single dictionary argument for function를 수정했습니다. #14275를 해결했습니다. #19016 (Nikolai Kochetov).
TinyLog 엔진을 사용하는 테이블에 LowCardinality 컬럼을 삽입할 때 발생하던 문제를 수정했습니다. 이 변경으로 #18629가 해결되었습니다. #19010 (Nikolai Kochetov).
JOIN의 사소한 문제를 수정했습니다. Join이 const 컬럼을 구체화하려고 시도하지만, 코드의 다른 부분에서는 이러한 컬럼이 그대로 남아 있기를 기대합니다. #18982 (Nikita Mikhaylov).
최적화가 항상 올바르게 작동하는 것은 아니므로 optimize_move_functions_out_of_any를 비활성화합니다. 이 변경으로 #18051이 해결됩니다. 이 변경으로 #18973이 해결됩니다. #18981 (alexey-milovidov).
쿼리 계획의 Expression 단계가 병합될 때 발생할 수 있는 QueryPipeline stream: different number of columns 예외를 수정했습니다. #18190을 해결합니다. #18980 (Nikolai Kochetov).
bitmapOrCardinality에서 널 포인터 역참조가 발생할 수 있는 문제를 수정했습니다. 이로써 #18911이 해결되었습니다. #18912 (sundyli).
Nullable(String)에서 Nullable(Decimal(P, S))로 NULL을 CAST하려고 할 때 발생하던 Attempt to read after eof 오류를 수정했습니다. 이제 함수 CAST는 널 허용 문자열에서 decimal을 파싱할 수 없으면 NULL을 반환합니다. #7690을 해결했습니다. #18718 (Winter Zhang).
MySQL engine의 데이터 타입 변환 문제를 해결했습니다. #18124 (bo zeng).
select만 실행할 때 clickhouse-client에서 발생하는 abort 예외를 수정했습니다. #19790 (taiyang-li).
system.parts _state 컬럼을 수정했습니다(잘못된 순서 때문에 이 컬럼을 쿼리하면 LOGICAL_ERROR가 발생하던 문제). #19346 (Azat Khuzhin).
materialized view와 대상 테이블의 구조가 서로 다를 때 집계에서 발생할 수 있는 잘못된 결과 또는 segfault를 수정했습니다. #18063를 해결했습니다. #19322 (tavplubix).
오류 Cannot convert column now64() because it is constant but values of constants are different in source and result를 수정했습니다. #7156의 후속 작업입니다. #19316 (Nikolai Kochetov).
동시 ALTER 및 DROP 쿼리로 인해 ReplicatedMergeTree 테이블 처리 중 멈출 수 있던 버그를 수정했습니다. #19237 (alesapin).
Template 또는 CustomSeparated 포맷을 사용해 HTTP 인터페이스로 데이터를 삽입할 때 발생하던 There is no checkpoint 오류를 수정했습니다. #19021을 해결했습니다. #19072 (tavplubix).
집계 함수 timeSeriesGroupSum, timeSeriesGroupRateSum을 제거했습니다. 지인의 말에 따르면 이 함수들은 한 번도 제대로 동작한 적이 없었기 때문입니다. 이로써 #16869가 수정됩니다. 이 함수들을 운 좋게 사용하고 있었다면 feedback@clickhouse.com으로 이메일을 보내십시오. #17423 (alexey-milovidov).
toUnixTimestamp(Date()) 사용을 금지했습니다(이전에는 단순히 Date의 UInt16 표현을 반환했습니다). #17376 (Azat Khuzhin).
avg 및 avgWeighted 함수에서 확장 정수 타입(Int128, Int256, UInt256)을 사용할 수 있도록 허용합니다. 또한 avgWeighted 함수에서 값과 가중치에 서로 다른 타입(정수, decimal, 부동소수점)을 사용할 수 있도록 허용합니다. 이는 하위 호환되지 않는 변경 사항입니다. 이제 avg 및 avgWeighted 함수는 항상 Float64를 반환합니다(문서에 명시된 대로). 이 변경 전에는 Decimal 인수의 반환 타입도 Decimal이었습니다. #15419 (Mike).
표현식 toUUID(N)은 더 이상 동작하지 않습니다. 대신 toUUID('00000000-0000-0000-0000-000000000000')를 사용하십시오. 이 변경은 N이 0이 아닐 때 toUUID(N)의 결과가 직관적이지 않기 때문에 적용되었습니다.
"key usage"가 올바르지 않은 SSL 인증서는 거부됩니다. 이전 버전에서는 이런 인증서도 사용할 수 있었습니다. #19262를 참조하십시오.
기본 config에서 substitutions 파일(/etc/metrika.xml)에 대한 incl 참조가 제거되었습니다(<remote_servers>, <zookeeper>, <macros>, <compression>, <networks>). substitutions 파일을 사용하고 있었고 이러한 암묵적 참조에 의존했다면, 업데이트 전에 해당 섹션을 incl="..." 속성과 함께 추가해 수동으로 명시적으로 다시 설정해야 합니다. #18740 (alexey-milovidov).
여러 ZooKeeper 클러스터를 사용할 수 있도록 했습니다. #17070 (fastio).
REPLACE TABLE 및 CREATE OR REPLACE TABLE 쿼리를 구현했습니다. #18521 (tavplubix).
UNION DISTINCT를 구현하고, 일반 UNION 절은 기본적으로 UNION DISTINCT로 처리하도록 했습니다. 또한 이를 UNION ALL로 처리하거나 모드를 명시적으로 지정하도록 요구할 수 있는 union_default_mode 설정을 추가했습니다. #16338 (flynn).
함수 accurateCastOrNull을 추가했습니다. 이로써 #10290이 해결되었습니다. x IN (subquery) 표현식에 형 변환을 추가했습니다. 이로써 #10266이 해결되었습니다. #16724 (Maksim Kita).
IP 딕셔너리에서 IPv4 / IPv6 타입을 직접 지원합니다. #17571 (vdimir).
데이터 가져오기 및 내보내기에 *.zst 압축/압축 해제 지원이 추가되었습니다. 이제 file() 함수에서 *.zst를 사용하고, HTTP 클라이언트에서 Content-encoding: zstd를 사용할 수 있습니다. 이로써 #16791 가 해결되었습니다. #17144 (Abi Palagashvili).
mannWitneyUTest, studentTTest, welchTTest 집계 함수를 추가했습니다. rankCorr도 일부 리팩터링했습니다. #16883 (Nikita Mikhaylov).
countMatches/countMatchesCaseInsensitive 함수를 추가했습니다. #17459 (Azat Khuzhin).
system.query_log에 사용된 데이터베이스, 테이블, 컬럼 정보를 추가했습니다. query_kind 및 normalized_query_hash 필드를 추가했습니다. #17726 (Amos Bird).
optimize_on_insert 설정이 추가되었습니다. 활성화되면, 해당 블록에서 머지가 수행된 경우와 동일한 변환(예: Replacing, Collapsing, Aggregating…)이 INSERT된 데이터 블록에 적용됩니다. 이 설정은 기본적으로 활성화되어 있습니다. 이로 인해 materialized view와 MaterializeMySQL의 동작에 영향을 줄 수 있습니다(자세한 설명 참조). 이 변경으로 #10683가 해결되었습니다. #16954 (Kruglov Pavel).
SHOW SETTINGS 문을 지원하여 system.settings의 매개변수를 표시할 수 있습니다. SHOW CHANGED SETTINGS와 LIKE/ILIKE 절도 지원됩니다. #18056 (Jianmei Zhang).
함수 position은 이제 SQL 호환성을 위해 POSITION(needle IN haystack) 구문도 지원합니다. 이로써 #18701 문제가 해결되었습니다. … #18779 (Jianmei Zhang).
이제 MergeTree 엔진 계열 테이블에 새로운 스토리지 설정 max_partitions_to_read가 도입되었습니다. 이 설정은 하나의 쿼리에서 액세스할 수 있는 최대 파티션 수를 제한합니다. 이 제한을 적용하기 위한 사용자 설정 force_max_partition_limit도 추가되었습니다. #18712 (Amos Bird).
ATTACH TABLE name FROM 'path/to/data/' (col1 Type1, ... 쿼리를 구현했습니다. 이 쿼리는 지정된 구조로 새 테이블을 생성하고, user_files 아래의 지정된 디렉터리에서 테이블 데이터를 연결하여 등록합니다. #17903 (tavplubix).
StorageMemory에 mutation 지원이 추가되었습니다. 이로써 #9117이 해결되었습니다. #15127 (flynn).
중복 검사에 사용할 컬럼 목록을 명시적으로(또는 별표/컬럼 변환기를 통해 암시적으로) 지정할 수 있도록 OPTIMIZE ... DEDUPLICATE 구문을 확장했습니다. … #17846 (Vasily Nemkov).
toModifiedJulianDay, fromModifiedJulianDay, toModifiedJulianDayOrNull, fromModifiedJulianDayOrNull 함수가 추가되었습니다. 이 함수들은 프로렙틱 그레고리력 날짜와 수정 율리우스일 번호 간 변환을 수행합니다. #17750 (PHO).
사용자 지정 TLD 목록을 사용할 수 있도록 기능을 추가했습니다. 함수 firstSignificantSubdomainCustom, cutToFirstSignificantSubdomainCustom를 추가했습니다. #17748 (Azat Khuzhin).
네이티브 TCP 인터페이스를 감싸는 PROXYv1 프로토콜 지원을 추가했습니다. 프록시가 전달한 IP 주소를 기준으로 쿼터를 적용할 수 있도록 했습니다(PROXYv1 주소와 HTTP 인터페이스의 X-Forwarded-For에 적용됨). 이는 ClickHouse에 신뢰할 수 있는 프록시(예: CloudFlare)를 통해서만 액세스를 제공하면서도, 원래 IP 주소를 기준으로 사용자 리소스 사용량을 집계하려는 경우에 유용합니다. 이 변경으로 #17268이 수정되었습니다. #17707 (alexey-milovidov).
이제 clickhouse-client에서 명령을 편집할 때 EDITOR를 열 수 있습니다. Alt-Shift-E. #17665 (Amos Bird).
문자열을 XML 텍스트 노드 또는 속성에 넣을 때 문자를 이스케이프하는 함수 encodeXMLComponent를 추가했습니다. #17659 (nauta).
DETACH TABLE/VIEW ... PERMANENTLY 구문을 도입하여, 재시작 후 테이블이 자동으로 다시 나타나지 않도록 했습니다(명시적으로 요청한 경우에만 다시 나타납니다). 테이블은 짧은 구문인 ATTACH TABLE을 사용해 다시 attach할 수 있습니다. #5555를 구현했습니다. #13850을 수정했습니다. #17642 (filimonov).
MergeTree 테이블의 총 행 수, 바이트 수 및 파트 수에 대한 비동기 메트릭을 추가했습니다. 이 수정으로 #11714를 해결했습니다. #17639 (flynn).
SQL 외부에서 페이지네이션할 수 있도록 limit 및 offset 설정이 추가되었습니다: #16176 이 설정은 API를 구축할 때 유용합니다. 이 두 설정은 select * from (your_original_select_query) t limit xxx offset xxx;를 추가한 것과 같은 방식으로 SELECT 쿼리에 영향을 줍니다. #17633 (hexiaoting).
쿼리를 통해 SimpleAggregateFunction 타입을 만들 수 있도록 새로운 집계 함수 combinator인 -SimpleState를 추가했습니다. 이는 AggregatingMergeTree 엔진의 MaterializedView를 정의할 때 유용하며, 프로젝션에도 도움이 됩니다. #16853 (Amos Bird).
텍스트 n-그램과 shingle의 minHash 및 simHash를 계산하는 함수가 추가되었습니다. 이 함수들은 유사 중복 검색에 사용됩니다. 또한 bitHammingDistance 및 tupleHammingDistance 함수도 추가되었습니다. #7649 (flynn).
새로운 데이터 타입 Map이 추가되었습니다. #1841을 참조하십시오. Map의 첫 번째 버전은 키와 값에 String 타입만 지원합니다. #15806 (hexiaoting).
ANTLR4 런타임을 기반으로 하고 EBNF 문법에서 생성된 대체 SQL 파서가 구현되었습니다. #11298 (Ivan).
성능 개선
메모리 사용량을 줄인 새로운 IP 딕셔너리 구현으로, 일부 경우 성능을 개선하고 버그를 수정했습니다. #16804 (vdimir).
max_distributed_connections를 수정했습니다(prefer_localhost_replica = 1 및 max_threads != max_distributed_connections에 영향을 줍니다). #17848 (Azat Khuzhin).
S3로 데이터를 전송할 때 단일/다중 part 업로드를 자동으로 선택합니다. 단일 part 업로드는 새로운 설정 max_single_part_upload_size로 제어됩니다. #17934 (Pavel Kovalenko).
PipelineExecutor에서 비동기 작업을 지원합니다. 원격 쿨리를 위한 비동기 소켓을 초기 지원합니다. #17868 (Nikolai Kochetov).
컬럼 크기를 알 수 없는 경우에도 compact 파트에서 optimize_move_to_prewhere 최적화를 사용할 수 있도록 허용했습니다. #17330 (Anton Popov).
개선
TinyLog 또는 Log 테이블 엔진을 사용하는 테이블에서 자기 자신을 대상으로 INSERT SELECT를 실행할 때 데드락이 발생하는 문제를 방지했습니다. 이로써 #6802가 해결되었습니다. 이로써 #18691가 해결되었습니다. 이로써 #16812가 해결되었습니다. 이로써 #14570가 해결되었습니다. #15260 (alexey-milovidov).
Decimal * Float 유형의 모든 쿼리와 그 반대 조합도 허용되며, 집계 쿼리도 포함됩니다(예: SELECT sum(decimal_field * 1.1) 또는 SELECT dec_col * float_col). 결과 유형은 Float32 또는 Float64입니다. #18145 (Mike).
간소한 Web UI를 개선했습니다: 이력을 추가하고, 공유 기능을 지원하며, 서로 다른 요청 간 경쟁 상태를 방지하고, 요청 처리 중 및 준비 완료 표시기를 추가하고, 파비콘을 추가했으며, textarea에 포커스가 없을 때 Ctrl+Enter 입력을 감지하도록 했습니다. #17293#17770 (alexey-milovidov).
clickhouse-server가 ZooKeeper 서버에 close 요청을 보내지 않던 문제를 수정했습니다. #16837 (alesapin).
메모리 제한이 지나치게 낮은 경우(max_memory_usage = 1 / max_untracked_memory = 1) server의 비정상 종료를 방지했습니다. #17453 (Azat Khuzhin).
서로 다른 이벤트의 timestamp가 동일한 경우 발생하던 windowFunnel 함수의 비결정적 결과를 수정했습니다. #18884 (Fuwang Hu).
Docker: clickhouse-server Docker 이미지에서 clickhouse 사용자 및 그룹의 uid / gid를 고정된 값(101)으로 명시적으로 설정했습니다. #19096 (filimonov).
Distributed 테이블로의 비동기 INSERT: MergeTree 엔진 계열과 마찬가지로 두 개의 새로운 설정이 추가되었습니다: - fsync_after_insert - 삽입할 때마다 fsync를 수행합니다. 삽입 성능이 저하됩니다. - fsync_directories - 모든 작업(쓰기, 이름 변경 등) 후 임시 디렉터리(비동기 INSERT에만 사용됨)에 fsync를 수행합니다. #18864 (Azat Khuzhin).
SummingMergeTree에서 SimpleAggregateFunction 관련 문제를 수정했습니다. 이제 AggregateFunction처럼 동작합니다. 이전 버전에서는 집계 함수와 무관하게 값이 함께 합산되었습니다. 이 수정으로 #18564가 해결됩니다. #8052. #18637 (Amos Bird). SummingMergeTree에서 SimpleAggregateFunction을 사용하는 또 다른 문제도 수정했습니다. 이 수정으로 #18676가 해결됩니다. #18677 (Amos Bird).
함수 bar의 마지막 인수가 NaN일 때 allocator 내부에서 발생하던 assertion 오류를 수정했습니다. 이제는 단순한 ClickHouse 예외가 발생합니다. 이 변경으로 #17876가 수정되었습니다. #18520 (Nikita Mikhaylov).
프라이머리 키 및 파티션 키 컬럼의 유형을 LowCardinality(Type)에서 Type으로, 또는 그 반대로 변경할 수 있는 기능을 추가했습니다. 또한 프라이머리 키 컬럼의 유형을 EnumX 에서 IntX로 변경할 수 있는 기능도 추가했습니다. #5604를 수정했습니다. #18362 (alesapin).
중첩 CSV로 직렬화된 배열이 들어 있는 문자열로 표현된 경우, CSV의 배열(Array) 필드를 파싱할 수 있습니다. 예시: "[""Hello"", ""world"", ""42"""" TV""]"는 ['Hello', 'world', '42" TV']로 파싱됩니다. CSV에서 배열을 감싸는 중괄호 없이 문자열 안에 있는 배열도 파싱할 수 있습니다. 예시: "'Hello', 'world', '42"" TV'"는 ['Hello', 'world', '42" TV']로 파싱됩니다. #18271 (alexey-milovidov).
MergeTree 와이드 파트에 대한 적응형 세분화 수준 계산을 개선했습니다. #18223 (alesapin).
이제 Mac에서도 clickhouse install이 작동할 수 있게 되었습니다. 문제는 이 플랫폼에 procfs가 없다는 점이었습니다. #18201 (Nikita Mikhaylov).
접근 제어: 이제 테이블 함수 merge()를 사용하려면 데이터를 가져오는 각 테이블에 대해 현재 사용자에게 SELECT 권한이 있어야 합니다. 이 PR은 #16964를 수정합니다. #18104#17983 (Vitaly Baranov).
이제 임시 테이블은 생성된 세션에서만 시스템 테이블 system.tables 및 system.columns에 표시됩니다. 내부 데이터베이스 _temporary_and_external_tables는 이제 해당 시스템 테이블에서 숨겨지며, 대신 임시 테이블은 데이터베이스가 비어 있고 is_temporary 플래그가 설정된 테이블로 표시됩니다. #18014 (Vitaly Baranov).
터미널 창 크기 변경 시 clickhouse-client 렌더링 문제를 수정했습니다. #18009 (Amos Bird).
클라이언트가 연결을 종료할 때 발생하는 이벤트의 로그 수준을 Warning에서 Information으로 낮췄습니다. #18005 (filimonov).
DiskS3의 파일 시스템에서 비어 있거나 손상된 메타데이터 파일을 강제로 제거합니다. S3는 실험적 기능입니다. #17935 (Pavel Kovalenko).
접근 제어: allow_introspection_functions=0은 인트로스펙션 함수의 사용을 금지하지만, 이제 더 이상 해당 함수에 대한 권한 부여를 막지는 않습니다(권한을 부여받은 사용자가 그 권한을 사용하려면 직접 allow_introspection_functions=1로 설정해야 합니다). 마찬가지로 allow_ddl=0은 DDL 명령의 사용을 금지하지만, 이제 더 이상 해당 명령에 대한 권한 부여를 막지는 않습니다. #17908 (Vitaly Baranov).
이제 MySQL 및 PostgreSQL 프로토콜을 통해 서버에 들어오는 쿼리에는 각각 고유한 인터페이스 유형이 부여됩니다(이는 tablesystem.query_log의 interface 컬럼에서 확인할 수 있습니다). MySQL은 4, PostgreSQL은 5이며, 이전에 사용되던 1은 이제 네이티브 프로토콜에만 사용됩니다. #17437 (Vitaly Baranov).
캐시 사전: 값을 가져올 때 필요한 콜백과 잠금을 완전히 제거했습니다. 키는 쿼리 수행 중 "찾을 수 없음"과 "만료됨"으로 구분하지 않고 동일한 맵에 저장합니다. #14958 (Nikita Mikhaylov).
fsync_part_directory/fsync_after_insert/in_memory_parts_insert_sync가 전혀 작동하지 않던 문제를 수정했습니다(실험적 기능). #18845 (Azat Khuzhin).
MaterializeMySQL 엔진의 중첩된 데이터베이스에서 Atomic 엔진을 사용할 수 있게 했습니다. #14849 (tavplubix).
버그 수정
매우 드문 경우에 server가 연결을 더 이상 수락하지 않을 수 있는 문제를 수정했습니다. #17542 (Amos Bird, alexey-milovidov).
잘못된 쿼리 결과를 초래하던 상수 인수가 있는 이항 함수의 인덱스 분석을 수정했습니다. 이 수정으로 #18364가 해결됩니다. #18373 (Amos Bird).
인덱스 비교에 사용되는 타입이 서로 다를 때 발생할 수 있는 잘못된 인덱스 분석을 수정했습니다. 이 변경으로 #17122가 해결됩니다. #17145 (Amos Bird).
머지 중 AIO 쓰기를 비활성화했습니다. 머지 과정에서 프라이머리 키 컬럼의 데이터가 극히 드물게 손상될 수 있기 때문입니다. #18481 (alesapin).
wide 파트에서 compact 파트로의 머지를 제한했습니다. 수직 병합 시 결과 파트가 손상되는 문제가 있었습니다. #18381 (Anton Popov).
읽기 백오프(로그의 <Debug> MergeTreeReadPool: Will lower number of threads 메시지) 발생 시 MergeTree*에서 읽는 동안 쿼리 결과가 불완전해질 수 있는 문제를 수정했습니다. 이 문제는 #16423에서 처음 도입되었습니다. #18137을 해결했습니다. #18216 (Nikolai Kochetov).
설정 network_compression_method가 전역적으로 기본값이 아닌 값으로 설정된 경우, 비동기 분산 INSERT가 server에서 거부될 수 있는 문제를 수정했습니다. 이 수정으로 #18741이 해결됩니다. #18776 (alexey-milovidov).
Nullable(String)에서 Nullable(Decimal(P, S))로 NULL을 CAST할 때 발생하던 Attempt to read after eof 오류를 수정했습니다. 이제 함수 CAST는 널 허용 문자열에서 10진수를 파싱하지 못하면 NULL을 반환합니다. #7690을 해결했습니다. #18718 (Winter Zhang).
Nullable(String) 유형의 인수로 toType(...) 함수(toDate, toUInt32 등)를 실행할 때 발생하던 value is too short 오류를 수정했습니다. 이제 이러한 함수는 parsing 오류가 발생하면 예외를 발생시키는 대신 NULL을 반환합니다. #7673를 수정했습니다. #18445 (tavplubix).
2단계 집계 사용 시 Distinct combinator가 적용된 집계 함수에서 발생할 수 있는 크래시를 수정했습니다. #17682를 해결했습니다. #18365 (Anton Popov).
듀얼 IPv4/IPv6 스택을 사용하는 시스템에서 서버가 clickhouse-odbc-bridge 프로세스에 연결할 수 없던 문제를 수정했습니다. ODBC 딕셔너리 업데이트 시 잘못된 쿼리가 사용되거나 odbc-bridge 프로세스가 충돌하던 문제를 수정했습니다. 아마도 #14489를 해결합니다. #18278 (Denis Glazachev).
접근 제어: 이제 사용자가 해당 테이블의 컬럼 하나에라도 접근 권한이 있으면 SELECT count() FROM table를 실행할 수 있습니다. 이 PR은 #10639을 해결합니다. #18233 (Vitaly Baranov).
접근 제어: 이제 SELECT JOIN을 사용하려면 조인되는 각 테이블에 대해 SELECT 권한이 필요합니다. 이 PR은 #17654를 수정합니다. #18232 (Vitaly Baranov).
Windows: Windows Subsystem for Linux에서 실행되는 ClickHouse의 Atomic 데이터베이스에서 RENAME 쿼리 실행 시 발생하던 Function not implemented 오류를 수정했습니다. #17661을 해결합니다. #17664 (tavplubix).
pool_size > 1일 때 발생하는 race condition으로 인해 ON CLUSTER 쿼리 실행 시 클러스터가 순환 복제 또는 (교차) 복제되었는지 잘못 판단되는 문제가 있었습니다. 수정되었습니다. #17640 (tavplubix).
server가 데몬 모드로 실행될 때 system.stack_trace table이 비어 있던 문제를 수정했습니다. #17630 (Amos Bird).
예외 fmt::v7::format_error가 MergeTree 테이블에서 백그라운드로 로그에 기록될 수 있습니다. 이 수정으로 #17613 문제가 해결되었습니다. #17615 (alexey-milovidov).
clickhouse-client를 대화형 모드에서 여러 줄 쿼리와 함께 사용할 때 한 줄 주석이 쿼리 끝까지 잘못 이어지던 문제가 있었습니다. 이 변경으로 #13654가 수정되었습니다. #17565 (alexey-milovidov).
해당 mutation이 다른 레플리카에서 강제 종료되었을 때 ALTER 쿼리가 멈추는 문제를 수정했습니다. #16953을 해결했습니다. #17499 (alesapin).
ClickHouse가 마크 캐시 크기를 과소추정할 때 메모리 사용량 계산에 발생하던 문제를 수정했습니다. 이 문제는 마크가 포함된 아주 작은 파일이 많을 때 발생할 수 있습니다. #17496 (alesapin).
설정 optimize_redundant_functions_in_order_by가 활성화된 경우의 ORDER BY를 수정했습니다. #17471 (Anton Popov).
파티션 프레디케이트 사용 시 활성화된 optimize_trivial_count_query 설정의 동작을 수정했습니다. #16767 (Azat Khuzhin).
MySQL wire protocol을 통한 INSERT 쿼리에서 영향받은 행 수를 반환합니다. 이전에는 ClickHouse가 항상 0을 반환했지만, 이제 수정되었습니다. #16605를 수정했습니다. #16715 (Winter Zhang).
최적화된 단순 count 쿼리와 시스템 테이블에서 select_sequential_consistency로 인해 발생한 일관되지 않은 동작을 수정했습니다. #16309 (Hao Chen).
존재하지 않는 컬럼에 REPLACE 컬럼 변환기가 적용되면 오류를 발생시키도록 수정했습니다. #16183 (hexiaoting).
RIGH|FULL JOIN에서 ON 표현식이 equi-join이 아닌 경우 예외를 발생시킵니다. #15162 (Artem Zuikov).
빌드/테스트/패키징 개선
ClickHouse 실행 파일에 대한 간단한 무결성 검사를 추가했습니다. 이를 통해 하드웨어 결함(저장 매체의 비트 손상 또는 RAM의 비트 반전)으로 인한 손상을 감지할 수 있습니다. #18811 (alexey-milovidov).
OpenSSL을 BoringSSL로 변경했습니다. 이를 통해 sanitizers 관련 문제를 방지할 수 있습니다. 이 변경으로 #12490이 수정되었습니다. 이 변경으로 #17502이 수정되었습니다. 이 변경으로 #12952이 수정되었습니다. #18129 (alexey-milovidov).
Sys/V init 스크립트를 간소화했습니다. Ubuntu 12.04 및 그 이전 버전에서는 작동하지 않았습니다. #17428 (alexey-milovidov).
이제 clickhouse-test는 타임아웃을 적용해 데이터베이스에 대해 DROP/CREATE를 수행합니다. #18098 (alesapin).
stateless 테스트를 위한 Pytest 프레임워크의 실험적 지원을 활성화했습니다. #17902 (Ivan).
이제 통합 테스트에서 최신 docker daemon 버전을 사용합니다. #17671 (alesapin).
Sentry가 활성화된 경우 공식 빌드 정보, 메모리, CPU 및 사용 가능한 디스크 여유 공간 정보를 Sentry로 전송합니다. Sentry는 ClickHouse 개발자를 지원하기 위한 옵트인 기능입니다. 이로써 #17279가 해결되었습니다. #17543 (alexey-milovidov).