本文介紹雲資料庫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,方便您自助排查問題。
提升系統對記憶體彈性的感知速度,降低。
對打包格式檔案排序,以最佳化緩衝下載內容,降低Object Storage Service網路訪問流量和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參數進行控制。
Object Storage Service不再使用固定密鑰,而是產生密鑰來確定其刪除對象的能力。
預設不推斷指數標記法中的浮點數。
允許用括弧包圍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倍。
解析器邏輯最佳化,修複了當語法錯誤的查詢包含帶有Regex的COLUMNS匹配器時,會觸發解析器多次編譯,影響解析速度的問題。