本文介紹云數據庫ClickHouse24.2.2.16399企業發布的功能詳情。
新特性
新增system.dns_cache表,此表有助于調試DNS問題。
新增表函數mergeTreeIndex。
此函數是關于MergeTree表的索引和標記文件的內容。可以用于自檢。
語法:
說明以下SQL語法中,database.table是一個具有MergeTree引擎的現有表。
mergeTreeIndex(database.table, [with_marks = true])
新增表函數generate_series。此函數可生成一個具有自然數等差數列的表。
內存引擎StorageMemory新增了四個屬性。
說明啟用對表參數范圍的訪問需要在memory.md文檔的MemorySink添加表context屬性。
min_bytes_to_keep
max_bytes_to_keep
min_rows_to_keep
max_rows_to_keep
支持merge表函數的單參數版本。語法為
merge([<db_name>, ] <tables_regexp>)
。新增聚合函數groupArrayIntersect。
新增函數toMillisecond。
說明此函數的DateTime或DateTime64類型值的單位為秒。
支持使用SQL移除與空分區相關的ZooKeeper節點。
語法:
ALTER TABLE <table_name> FORGET PARTITION partition;
參數說明:
參數名稱
參數說明
示例值
table_name
表名稱
test
新增
DIFINER=<userName>
語法,允許在View或者Materialized View中指定視圖定義者。視圖定義者擁有對視圖執行查詢/插入操作的權限,無需對底層表的顯式授權。Topk/topkweighed模式支持返回計數和誤差。
支持在schema推斷過程中自動檢測在file/s3/hdfs/url/azureBlobStorage引擎中未知的文件格式。
默認壓縮算法從LZ4HC(3)變為LZ4HC(2),提高了查詢效率,但壓縮率有所降低。
支持擴展名忽略大小寫,例如Tsv、TSV、tsv。
支持ATTACH PARTITION ALL語句。
管控改進
支持ClickHouse-Server和Keeper內核中內存軟限隨CCU動態調整,解除了Keeper最大支持內存過小的限制,并在一定程度上避免了OOM。
關閉Uncompressed Cache。
優化MarkCache大小的設置邏輯,減少了一些情況下的內存占用,以便彈降。
支持FileSystemCache隨CCU規格動態變化(原先固定100GB)。
支持調整為更激進的Serverless策略。(目前邀測)
默認開啟text_log,方便您自助排查問題。
提升系統對內存彈性的感知速度,降低。
對打包格式文件排序,以優化緩存下載內容,降低對象存儲網絡訪問流量和QPS放大倍數。
改進
允許對S3Queue表引擎進行并行和分布式處理。
說明對于分布式處理,使用設置s3queue_total_shards_num(默認值為1)。
之前設置s3queue_processing_threads_num不允許有序處理模式,現在允許。
需要注意:s3queue_processing_threads_num(每個分片的處理線程)和s3queue_total_shards_num設置對有序模式更改元數據存儲方式(使max_processed_file節點的數量等于
s3queue_processing_threads_num * s3queue_total_shards_num
),因此它們必須在所有分片中保持相同,并且一旦創建了至少一個分片就不能更改。
在運行物化視圖的MODIFY COLUMN查詢時,確保內部表的每列都在。
新增system.keywords表,此表包含了解析器中所有關鍵字,有助于您更好的進行模糊測試和語法高亮顯示。
支持帶有分析器的參數化視圖,不對創建參數化視圖進行分析。重構現有參數化視圖邏輯,不對創建參數化視圖進行分析
不再支持新建ordinary引擎的數據庫,存量ordinary引擎數據庫可正常使用。
在刪除表時,必須同時刪除與表相關的所有零拷貝鎖以及這些鎖的目錄。
dictGetOrDefault函數新增了短路功能。
允許在外部表結構中聲明枚舉。
對具有
DEFAULT
或MATERIALIZED
表達式的列執行ALTER COLUMN MATERIALIZE
命令時,將會寫入正確的值。說明新版本對于已有部分中帶有默認值的行,將寫入默認值;而對于已有部分中帶有非默認值的行,則寫入其原有的非默認值。
舊版本對于所有已存在的部分,不論其原先是否有非默認值,都會被錯誤地寫入默認值。
啟用了退避邏輯(例如指數退避),降低了CPU使用率、內存占用量,并減小了日志文件的大小。
在數據合并操作時,考慮了輕量級刪除的行。
說明輕量級刪除的行指的是數據實際上并沒有從存儲中刪除,只是被標記為已刪除。更多輕量級刪除的行詳情,請參見DELETE Statement。
T64編解碼器開始支持Date32類型。
PR使得HTTP/HTTPS的連接在所有應用場景中都可重用,即便遇到3xx或4xx的響應狀態碼也不例外。
為系統表的所有列添加注釋。
支持在PREWHERE子句中使用虛擬列。
說明對于非常量型的虛擬列_part_offset,這種優化具有重要意義。
Keeper改進:在內存中緩存一定數量的日志,通過設置latest_logs_cache_size_threshold和commit_logs_cache_size_threshold參數進行控制。
對象存儲不再使用固定密鑰,而是生成密鑰來確定其刪除對象的能力。
默認不推斷指數表示法中的浮點數。
允許用括號包圍ALTER操作。
說明較舊版本無法讀取新語法,因此在單個集群中混合使用新舊版本的ClickHouse可能會導致問題。
默認情況下,在格式化查詢中包含圓括號,是因為在某些地方(例如:變異)將格式化的ALTER操作為元數據。
新語法支持一些修改操作以列表結尾的查詢。例如:舊語法無法正確解析
ALTER TABLE x MODIFY TTL date GROUP BY a, b, DROP COLUMN c
,但是,在新語法中,ALTER TABLE x (MODIFY TTL date GROUP BY a, b), (DROP COLUMN c)
可以正確執行。
對Intel QPL的升級,改進了DEFLATE_QPL編解碼器,并且修復了一個可能導致并發處理問題的輪詢超時機制的錯誤。
在libhdfs3中新增了位置性預讀功能。
說明如果您想在libhdfs3中進行位置讀取,需要調用hdfs.h中的hdfsPread函數。示例如下:
tSize hdfsPread(hdfsFS fs, hdfsFile file, void * buffer, tSize length, tOffset position);
即使您錯誤地將max_parser_depth設置為了一個非常高的值,解析器也會檢查堆棧溢出。
說明舊版本如果將max_parser_depth值設置地太大可能會導致服務器崩潰。
max_parser_depth的默認值為1000。更多信息,請參見max_parser_depth。
統一kafka存儲中由XML和SQL創建命名集合的行為。
說明kafka存儲有兩種參數類型:存儲自身的存儲參數以及librdkafka配置設置參數。
未優化前,存儲參數在兩種情況下均會被應用,但Kafka設置只加載使用XML創建的命名集合。
此優化統一了Kafka存儲對命名集合的訪問方式,并且允許在不重啟服務器的情況下使用新的XML命名集合。
如果
CREATE TABLE
明確指定了uuid,則允許在replica_path中使用此uuid。示例:
CREATE TABLE x UUID 'aaaaaaaa-1111-2222-3333-aaaaaaaaaaaa' (key Int) ENGINE = ReplicatedMergeTree('/tables/{database}/{uuid}', 'r1') ORDER BY tuple();
在系統表system.tables中添加了ReplicatedMergeTree表的metadata_version列。
Keeper改進:為磁盤相關操作添加失敗重試。
如果StorageBuffer有多個分片(num_layers > 1),后臺會啟動多個線程對所有分片進行刷新。
ULIDStringToDateTime函數新增了短路功能。
優化ClickHouse在無活躍事務時的表現,從報INVALID_TRANSACTION異常變成和MySQL一樣無異常拋出。
distributed_ddl_output_mode新增了none_only_active模式。
通過MySQL端口的連接ClickHouse時,參數prefer_column_name_to_alias默認設置為1, 同時也默認啟用mysql_map_string_to_text_in_show_columns和mysql_map_fixed_string_to_text_in_show_columns,提高了clickhouse與BI工具的兼容性。
函數substring新增了一個別名byteSlice。
SHOW INDEX | INDEXES | INDICES | KEYS
不再按主鍵列排序。Keeper改進:在啟動期間檢測到無效快照時中止啟動,以避免數據丟失。
字符串類型和枚舉可以在相同的上下文中使用,例如:數組、UNION查詢、條件表達式。
為SMJ添加標志用以便將NULL值視為最大/最小。這樣可以使ClickHouse與其他SQL系統(如Apache Spark)兼容。
新增設置項
parallel_replicas_allow_in_with_subquery = 1
,允許IN子查詢在并行副本中工作。DNSResolver隨機分配解析的IP集合。
默認啟用處理器分析(排序、聚合的時間花費/輸入和輸出字節)。
新增函數toUInt128OrZero,兼容別名FROM_UNIXTIME和DATE_FORMAT(不區分大小寫)。
改進了訪問檢查,支持在目標用戶沒有撤銷權限的情況下撤銷未擁有的權限。
示例:
GRANT SELECT ON . TO user1; REVOKE SELECT ON system.* FROM user1;
移除break以確保第一個過濾列具有最小長度。
修復has()函數與Nullable列的兼容性。
為虛擬內存映射添加異步指標VMMaxMapCount和VMNumMaps。
在創建臨時數據使用temporary_files_codec設置項,例如外部內存排序和外部內存分組。之前它僅在partial_merge的JOIN算法中。
不允許S3存儲隊列的分片模式,因為它將被重寫。
刪除blob_storage_log中的一些重復條目。
添加current_user函數作為MySQL的兼容性別名。
bug修復
修復由于內存統計錯誤導致查詢被意外終止的問題。
修復重啟實例后,第一個DDL報異常的問題。
修復intDiv函數在處理decimal參數類型時的錯誤。
修復由wingfuzz發現的KQL問題。
修復AsynchronousBoundedReadBuffer的
Read beyond last offset
錯誤。修復RabbitMQ和ClickHouse通信異常時消息狀態既不返回ACK也不返回NACK的問題,目前讀寫階段異常后會返回NACK。
修復QueryAnalyzer在對含有GROUP BY一個LowCardinality類型常量的query執行分析時返回失敗的問題。
修復DateTime64的比例轉換。
修復插
INSERT into SQLite
時單引號的轉義(通過用單引號而不是反斜杠轉義單引號)。修復使用ClickHouse無法識別列別名并報錯的問題。
修復MergeTree的
finished_mutations_to_keep=0
(如文檔所述,0是保留所有內容)。修復S3Queue表在刪除時可能發生的異常。
PartsSplitter相同部分的無效范圍。
在DDLLogEntry中,使用上下文中的max_query_size代替硬編碼4096。
修復查詢格式不一致問題。
修復子查詢中explain格式不一致問題。
修復由于Nullable引發cosineDistance崩潰的問題。
允許將字符串表示的布爾值轉換為真正的布爾值。
說明支持執行類似
SELECT true = 'true'
的語句,在之前版中,執行這類語句時會發生異常。修復system.s3queue_log。
說明修復系統表system.s3queue_log中未填充的列table_uuid。新增了database和table兩列。并將table_uuid列重命名為uuid。
修復arrayReduce可能產生報錯
Bad cast from type DB::ColumnVector<double> to DB::ColumnNullable。
修復多次insert情況下PK、分區修剪等初步過濾不生效的問題。
隱藏S3Queue表的敏感信息。
還原
Replace ORDER BY ALL by ORDER BY *
。Azure Blob Storage:修復端點和前綴問題。
修復HTTP異常代碼。
修復LRUResource Cache(Hive緩存)。
s3queue:修復錯誤(也修復了flaky test_storage_s3_queue/test.py::test_shards_distributed)。
修復IPv6哈希函數中的未初始化值和無效結果。
如果并行副本發生變化,強制重新分析。
修復帶有新磁盤配置選項的普通元數據類型的使用。
不允許將
max_parallel_replicas
設置為0,因為這沒有意義。嘗試修復mapContainsKeyLike中的邏輯錯誤
Cannot capture column because it has incompatible type
。修復帶有空參數的OptimizeDateOrDateTimeConverterWithPreimageVisitor。
嘗試避免為
CREATE TABLE
計算標量子查詢。正確檢查s3Cluster中的密鑰。
修復在并行解析時,由于錯誤跳過大量行時的死鎖。
修復KQL復合運算符(例如mv-expand)在設置max_query_size時的問題。
Keeper修復:添加在等待提交日志時的超時。
減少從system.numbers讀取的行數。
不為日期類型輸出數字提示。
修復從MergeTree表讀取數據時,在過濾條件中使用非確定性函數導致結果集不正確的問題。
修復設置錯誤兼容性值類型的邏輯錯誤。
修復在混合x86-64/ARM集群中聚合函數狀態不一致的問題。
修復(prql):更健壯的panic handler。
修復intDiv函數參數為十進制和日期/時間類型時引發的程序崩潰問題。
ALTER TABLE ... MODIFY QUERY
語句在使用CTE時異常的問題。修復非原子/普通數據庫引擎(即內存)中的system.parts。
修復參數化視圖的Invalid storage definition in metadata file問題。
修復CompressionCodecMultiple緩沖區溢出問題。
刪除SQL/JSON中無意義內容。
刪除聚合函數quantileGK中錯誤的清理檢查。
修復了在query中使用自定義 insert_deduplication_token 參數時出現非預期的重復數據刪除的問題。
修復在調用分片上傳時會添加不支持的自定義元數據頭的問題。
修復toStartOfInterval函數。
修復arrayEnumerateRanked函數中的崩潰。
修復在INSERT SELECT JOIN中使用input()函數時的崩潰。
修復在子查詢中具有不同allow_experimental_analyzer值的崩潰。
讀取S3時移除遞歸。
修復HashedDictionaryParallelLoader中錯誤情況下的可能卡住的問題。
修復Replicated數據庫的異步恢復(Async Restore)機制。
修復通過本地協議異步插入到Log表時的死鎖。
修復RangeHashedDictionary中dictGetOrDefault默認參數的延遲執行。
修復groupArraySorted中的多個錯誤。
修復Keeper的獨立二進制文件的重新配置。
修復S3引擎中session_token的使用。
修復聚合函數uniqExact可能產生不正確結果的問題。
修復顯示數據庫中的錯誤。
修復具有MATERIALIZED列的RabbitMQ存儲中的錯誤邏輯。
修復CREATE OR REPLACE DICTIONARY。
修復帶有外部ON CLUSTER的ATTACH查詢。
修復操作DAG拆分問題。
修復失敗的RESTORE命令無法正常結束的問題。
正確禁用具有兼容性設置的async_insert_use_adaptive_busy_timeout。
允許在恢復池中排隊。
修復讀取system.parts使用UUID報錯的問題。
修復窗口視圖中的崩潰問題。
修復使用非本機整數時的重復問題。
修復客戶端
-s
參數。修復使用arrayPartialReverseSort函數引發的程序崩潰問題。
修復具有常量位置的字符串搜索。
修復使用datetime64時因addDays導致的錯誤。
修復異步插入數據時,system.part_log中重復數據的問題。
修復system.parts的未就緒狀態。
修復SMT中潛在的垃圾數據或數據丟失的問題。
允許從所有可用區域獲取分布式緩存指標。
修復DISTINCT和窗口函數的崩潰問題。
DistrCache:更多的配置文件事件,更好的異常消息。
修復集群默認數據庫授權問題。
修復MemoryTrackerSwitcher中未跟蹤的內存問題。
修復一項因內存統計錯誤導致的查詢被意外中斷的問題。
修復OrderByLimitByDuplicateEliminationVisitor的跨子查詢問題。
修復TTL執行中的向后不兼容問題。
分布式緩存中連接和連接池相關的改進。
修復Replicated數據庫引擎下設置TTL可能導致崩潰的一項問題。
避免在ActionsDAG::split結果的新輸入中重復命名。
分析器:修復RewriteAggregateFunctionWithIfPass問題。
修復帶有默認表達式的CREATE TABLE AS查詢。
分析器:修復查詢樹大小驗證問題。
修復GLOBAL IN別名問題。
02228_merge_tree_insert_memory_usage不使用隨機設置。
分析器:修復AggregateFunctionsArithmeticOperationsPass問題。
修復遠程查詢中帶有分析器的INTERPOLATE別名問題。
允許在復制數據庫的ZooKeeper路徑中使用特殊宏{uuid}和{database}。
更新異常消息。
捕獲ContextAccess的弱指針以確保安全。
修復哈希字典短路時的錯誤。
修復UniqInjectiveFunctionsEliminationPass和uniqCombined崩潰問題。
修復初始化順序(ServerUUID/ZooKeeper)。
CI:向回溯工作流程添加aarch構建。
修復packed part存儲中的getFileLastModified問題。
修復定義者的備份恢復問題。
totalqpslimitexceeded是否是可重試的s3錯誤。
修復因OSS QPS限流導致插入中斷的問題。
修復MySQL字典源問題。
嘗試修復MergeTreeReadPoolBase::createTask中的段錯誤。
為集成測試運行器添加jwcrypto。
MergeTreePrefetchedReadPool更安全。
修復一項罕見報錯:在ALTER 后可能造成SELECT查詢報錯
Unexpected return type from materialize. Expected type_XXX. Got type_YYY.
的問題。修復02362_part_log_merge_algorithm易碎測試。
修復SMT插入期間的數據丟失問題。
撤銷在次級查詢的GROUP BY鍵中不移除服務器常量”。
修復嵌套lambda捕獲問題。
用戶空間頁面緩存:如果未使用緩存則不收集統計信息。
分析器查看僅必要的列。
修復StorageS3在重啟后缺少extra_credentials的問題。
在使用并行讀取時,正確取消S3讀取操作。
修復Linuxs上arm64的test_odbc_interaction。
S3Queue:在tracked_file_ttl_sec和traked_files_limit中計算失敗的文件。
僅在移除前檢查部件校驗和。
修復部分合并連接中的非法列問題。
修復標量創建選擇問題。
arm修復test_short_strings_aggregation。
修復test_disk_types的aarch64。
修復test_catboost_evaluate的aarch64。
移除窗口函數多余的DISTINCT。
修復復制數據庫中的flatten_nested問題。
禁用arm使用test_non_default_compression/test.py::test_preconfigured_deflateqpl_codec。
修復02124_insert_deduplication_token_multiple_blocks。
修復在刪除范圍后,重啟時數據重疊問題。
修復在使用新分析器和并行副本從MV讀取時,結果錯誤的問題。
當某DDL任務連續失敗超過max_retries_before_automatic_recovery參數預設的次數后,將自動標記該數據庫副本為lost,并啟動恢復程序,同時修復DDL執行階段報錯可能導致該DDL直接被跳過的問題。
修復在物化視圖中使用IN函數時涉及任意深度子查詢的分析器問題。
修復keeper-client的find_super_nodes和find_big_family命令的問題。
更新lambda的執行名稱。
修復在發布分支上自動創建新版本的問題。
以更安全的方式反序列化不受信任的二進制輸入數據。
修復投影部件備份/恢復中的問題,在投影從表元數據中移除但部件仍有投影的情況下。
支持
Array(Nothing)
轉換成Map(Nothing, Nothing)
。修復分析器中的COLUMNS的問題。
在訪問current_parts.size()和future_parts.size()之前獲取鎖。
忽略Keeper的text_log。
防止在使用
CREATE TABLE AS MaterializedView
時出現LOGICAL_ERROR。修復在不使用自適應粒度的表時,帶FINAL的查詢結果錯誤問題。
修復在撤銷仲裁插入事務時的邏輯錯誤問題。
修復使用分析器時的SQL安全訪問檢查問題。
查詢緩存:對于不同數據庫的相同查詢被視為不同查詢。
修復select_sequential_consistency中的錯誤。
修復分析器:只有插值表達式能用于DAG。
更新InterpreterCreateQuery.cpp。
修復Buffer表使用prewhere子句時的錯誤邏輯。
CI:向可重用的階段工作流yml添加密鑰。
修復由于并發更新導致提交失敗后,FS元數據緩存失效的問題。
修復由于CPU/實時性能分析器引起的SIGSEGV。
在備份副本過程中正確回退。
禁用enable_vertical_final。
優化ASAN鏡像。
測試qps_limit_exceeded。
修復在StatusFile 中,~WriteBufferFromFileDescriptor未捕獲異常導致程序中止的問題。
修復isNull/isNotNul和分析器的早期常量折疊問題。
修復ClickHouse Keeper中導致在關閉會話期間摘要不匹配的錯誤。
在證書重新加載期間重新加載證書鏈。
SharedMergeTree的TTL過期后,清理空parts。
修復Alter語句復制SQL安全性的相關問題。
修復銷毀AccessControl時程序崩潰的問題,添加顯式關閉。
性能改進
消除SELECT部分中GROUP BY鍵的min/max/any/anyLast聚合器。
改善涉及多個[可為空]列時序列化聚合方法的性能。
延遲構建連接輸出以提高ALL連接的性能。
優化ArgMin/ArgMax/any/anyLast/anyHeavy聚合函數,以及對ORDER BY使用無符號整型( u8、u16、u32、u64) 和有符號整型 (i8、i16、i32、i64)排序并且使用 LIMIT 1 條件查詢的優化。
通過減少分支錯誤來優化bigint和big decimal類型的條件sum/avg性能。
改善具有活動突變的SELECT`查詢性能。
對列過濾進行細節優化。避免過濾底層數據類型不是數字的列的
result_size_hint = -1
。在某些情況下,峰值內存可以減少到原來的44%。主鍵將使用更少的內存。
改善主鍵和其他操作的內存使用情況。
表的主鍵將在首次訪問時延遲加載。
說明通過設置MergeTree的primary_key_lazy_load控制,默認開啟。此設置有以下優缺點。
優點:
不會加載對于未使用的表。
如果內存不足,將在首次使用時拋出異常,而不是在服務器啟動時。
缺點:
加載主鍵的延遲將在第一個查詢時支付,而不是在接受連接之前
可能會引入一個突發請求問題。
矢量化函數dotProduct有助于向量搜索。
如果表的主鍵包含大部分無用的列,請不要將它們保留在內存中。
說明通過設置primary_key_ratio_of_unique_prefix_values_to_skip_suffix_columns控制。
默認值為0.9。其含義為對于復合主鍵,如果一列在至少0.9次更改其值,之后的列將不被加載。
如果multiIf函數預計會返回一個數字類型的結果,系統會采用列式執行來對這個函數的調用進行優化。這意味著在執行類似multiIf的函數時,如果涉及大量數據,系統會嘗試以更高效的方式,并發地按列處理這些數據。
通過使用位與代替邏輯與,改變了過濾器組合過程的實現,使得該操作可以被編譯器自動向量化。這項更改是嘗試通過向量化操作來提高數據庫查詢執行性能的一部分,使得可以通過使用處理器的功能進行更有效的操作。
優化ThreadFuzzer的mutex性能問題,幾乎快了2倍。
解決分布式查詢時由于連接不能并行造成的性能問題。
優化insertManyFrom循環調用insertFrom導致的性能損失問題。
優化函數dotProduct,省略不必要且昂貴的內存復制。
文件系統緩存操作將減少鎖競爭。
優化ColumnString::replicate并防止memcpySmallAllowReadWriteOverflow15Impl被優化為內置memcpy。使得ColumnString::replicate在x86-64上速度提高了2.46倍。
對于256位整數,打印速度提高了30倍。
解析器邏輯優化,修復了當語法錯誤的查詢包含帶有正則表達式的COLUMNS匹配器時,會觸發解析器多次編譯,影響解析速度的問題。