22.8版本新特性概覽
本文介紹云數(shù)據(jù)庫(kù)ClickHouse22.8版本推出的新特性。
日期和時(shí)間類型擴(kuò)展
擴(kuò)展
Date32
和DateTime64
類型,將日期支持范圍從之前版本的1925年~2283年,擴(kuò)展到1900年~2299年。日期類型數(shù)據(jù)精度最大為8位,達(dá)到微秒級(jí)精度。超出最大時(shí)間精度后支持的時(shí)間范圍會(huì)縮小,只支持到2262-04-11。
輕量級(jí)刪除
22.8版本MergeTree引擎表支持標(biāo)準(zhǔn)的DELETE FROM SQL
語(yǔ)法,同時(shí)實(shí)現(xiàn)了輕量級(jí)刪除的邏輯。在之前版本中,云數(shù)據(jù)庫(kù)ClickHouse的DELETE操作是Mutation類操作,所有的DELETE事件都是先通過(guò)文件進(jìn)行單獨(dú)記錄存儲(chǔ),然后再基于內(nèi)核調(diào)度不定時(shí)的異步執(zhí)行,另外執(zhí)行過(guò)程也比較復(fù)雜,需要定位到相應(yīng)的記錄,進(jìn)行實(shí)際的物理刪除。
舊版本的DELETE
語(yǔ)法如下:
ALTER TABLE [db.]table [ON CLUSTER cluster] DELETE WHERE filter_expr
新版本的DELETE
語(yǔ)法如下:
DELETE FROM [db.]table [WHERE expr]
示例如下:
DELETE FROM hits WHERE Title LIKE '%hello%' ;
關(guān)于LIKE
表達(dá)式的更多信息,請(qǐng)參見(jiàn)LIKE。
標(biāo)準(zhǔn)SQL語(yǔ)法的支持,相比較之前的Mutation類操作方式,增強(qiáng)了開發(fā)的便利性。根據(jù)官方的性能測(cè)試結(jié)果,在單表1億記錄總量,110個(gè)數(shù)據(jù)分區(qū)規(guī)模下,輕量級(jí)刪除的性能較之前版本提升了近40倍左右,性能提升明顯。但當(dāng)前DELETE
語(yǔ)法的實(shí)現(xiàn)仍然默認(rèn)是異步執(zhí)行。其內(nèi)部基于ClickHouse的列更新機(jī)制,在數(shù)據(jù)分區(qū)中增加了系統(tǒng)虛擬列“_row_exists”,通過(guò)update_row_exists=0 where predicate
來(lái)標(biāo)記行是“已刪除”狀態(tài)。
支持JSON類型和動(dòng)態(tài)子列
老版本的JSON格式數(shù)據(jù)讀寫方式
在22.8之前的版本中,ClickHouse支持以String類型來(lái)存儲(chǔ)JSON對(duì)象,因?yàn)镴SON對(duì)象是文本格式,需要通過(guò)特殊的String解析函數(shù)來(lái)解析復(fù)雜的JSON結(jié)構(gòu),從而獲得JSON對(duì)象內(nèi)部字段信息。這種String類型存儲(chǔ)方式,內(nèi)部多個(gè)字段混合存儲(chǔ),針對(duì)內(nèi)部特定屬性的查詢會(huì)帶有額外的字段掃描消耗,因此查詢效率非常低。同時(shí)使用起來(lái)也比較麻煩,如果JSON數(shù)據(jù)存在多層嵌套,那么查詢JSON數(shù)據(jù)就需要一層層去進(jìn)行解析和類型轉(zhuǎn)換,才能被業(yè)務(wù)使用。示例如下:
CREATE TABLE games (data String)
ENGINE = MergeTree ORDER BY tuple();
SELECT JSONExtractString(data, 'teams', 1, 'name')
FROM games;
新版本的JSON數(shù)據(jù)讀寫方式
新版本中推出了獨(dú)立JSON對(duì)象類型,DDL操作時(shí)JSON對(duì)象只需要指定JSON類型即可。同時(shí)引擎針對(duì)每個(gè)寫入的JSON對(duì)象值進(jìn)行動(dòng)態(tài)類型匹配,每個(gè)JSON屬性按照獨(dú)立列進(jìn)行存儲(chǔ)。當(dāng)新寫入的JSON對(duì)象值和之前的類型不匹配時(shí),引擎會(huì)動(dòng)態(tài)修改列類型來(lái)兼容所有的數(shù)據(jù)類型,對(duì)于新增JSON屬性也會(huì)動(dòng)態(tài)增加新的列進(jìn)行數(shù)據(jù)的存儲(chǔ)。示例如下:
DROP TABLE IF EXISTS github_JSON;
SET allow_experimental_object_type=1;
CREATE table github_JSON(event JSON) ENGINE = MergeTree ORDER BY tuple()
動(dòng)態(tài)子列的支持,大幅提高了非結(jié)構(gòu)化數(shù)據(jù)的分析效率和擴(kuò)展性。
對(duì)于常見(jiàn)的導(dǎo)入OSS數(shù)據(jù)到ClickHouse,在22.8之前版本中如果要實(shí)現(xiàn)JSON對(duì)象子列的獨(dú)立存儲(chǔ)和高效分析,那么就必須預(yù)先在ClickHouse建立結(jié)構(gòu)化的目標(biāo)表,并明確定義每個(gè)字段的數(shù)據(jù)類型,才能將半結(jié)構(gòu)化的JSON數(shù)據(jù)寫入到ClickHouse中。如果JSON對(duì)象結(jié)構(gòu)變更,那么需要同時(shí)修改目標(biāo)表的表結(jié)構(gòu),才能適配寫入。
而新版本中由于有了動(dòng)態(tài)子列,開發(fā)者完全不需要關(guān)心JSON的嵌套層次和內(nèi)部數(shù)據(jù)類型,只需要在目標(biāo)表中創(chuàng)建JSON數(shù)據(jù)類型字段,直接將半結(jié)構(gòu)化的數(shù)據(jù)批量導(dǎo)入到ClickHouse目標(biāo)表中即可。同時(shí)在業(yè)務(wù)變更JSON對(duì)象屬性增加的情況下,也不需要修改目標(biāo)表的結(jié)構(gòu),內(nèi)核會(huì)動(dòng)態(tài)增加子列,并進(jìn)行數(shù)據(jù)存儲(chǔ),擴(kuò)展靈活度大幅提升。示例如下:
INSERT INTO github_JSON SELECT * FROM OSS('oss-endpoint',
JSONAsObject, 'event JSON');
讀取數(shù)據(jù)時(shí)不需要按照字符串進(jìn)行解析和類型轉(zhuǎn)換,可直接基于JSON對(duì)象進(jìn)行屬性的嵌套讀取。動(dòng)態(tài)子列的支持大大提升了JSON類型數(shù)據(jù)的存儲(chǔ)和查詢效率。根據(jù)社區(qū)官方的測(cè)試結(jié)果,新版本JSON對(duì)比老版本String整體查詢效率提升了40倍左右。示例如下:
SELECT event.type, event.repo, event.actor FROM github_JSON LIMIT 1;
遠(yuǎn)程文件系統(tǒng)的本地緩存
當(dāng)ClickHouse從本地磁盤文件系統(tǒng)讀取數(shù)據(jù)時(shí)是非常快的,例如阿里云ECS本地盤或者云盤上的數(shù)據(jù)被OSS緩存在Page Cache中再進(jìn)行讀取。但是,如果ClickHouse從遠(yuǎn)程文件系統(tǒng)(例如OSS)讀取數(shù)據(jù),則系統(tǒng)不會(huì)感知到這些讀取,且無(wú)法使用Page Cache。在22.8版本中,ClickHouse內(nèi)核層面實(shí)現(xiàn)了引擎級(jí)別的遠(yuǎn)程文件系統(tǒng)的緩存,緩存同時(shí)使用本地磁盤和RAM,極大地提高了性能。
云數(shù)據(jù)庫(kù)ClickHouse云原生版基于對(duì)象存儲(chǔ)OSS實(shí)現(xiàn)了基于多計(jì)算節(jié)點(diǎn)共享存儲(chǔ)的存算分離架構(gòu),通過(guò)應(yīng)用引擎的緩存能力保證了云原生版本的查詢性能。
其他特性
22.8版本除了以上的重要的特性發(fā)布之外,還帶來(lái)一些其他特性,例如:
Projection:源表數(shù)據(jù)的一致性增強(qiáng)。同時(shí)基于“空間換效率”的邏輯,創(chuàng)建基于不同排序索引維度的物理表,數(shù)十倍地提高了非排序鍵數(shù)據(jù)的查詢效率。
用戶自定義函數(shù):支持SQL模式和腳本模式的用戶自定義函數(shù),提高了用戶自主進(jìn)行數(shù)據(jù)清洗和處理的能力。