一文读懂 ClickHouse V22.8 新版本重要特性
文 / 凤豪
1.背景介绍
各位 ClickHouse 圈友们!ClickHouse 又双叒叕发布新版本了。
大家都知道ClickHouse的发版节奏非常快,从官网发布记录来看,2022年依旧保持了一个月一个大版本的节奏,详情可以参阅 ClickHouse 2022 Changelog 。除了主版本之外,小版本就更多了,可见 ClickHouse 社区非常的活跃,内核迭代效率非常高。在此也呼吁国内的开发者小伙伴们多多参与到 ClickHouse 社区建设活动中。
今天给大家重点介绍 ClickHouse 社区最新版本的 LTS 版本 - V22.8 LTS 。 LTS 全称是Long Term Support 长期支持版。LTS 版本是社区官方推荐的内核功能稳定,可以用于生产环境,且会长期进行稳维护升级的版本系列,也是被社区用户最广泛使用的版本,阿里云也于近期正式提供了全托管的企业级 ClickHouse V22.8 版本,大家可以到阿里云官网搜索体验。
闲言少叙,咱们一起来揭开 V22.8 版本的面纱,看看有哪些值得关注的重要特性发布。
2.特性介绍
日期&时间类型扩展
扩展 Date32 和 DateTime64 类型,将日期支持范围从之前版本的 1925年-2283年,扩展到支持 1900年-2299 年。需要注意的是,此特性变更不兼容之前的版本,尤其是对于超出日期边界值的转化逻辑。在之前的版本中1899-01-01会被强制转换为1925-01-01,而新的版本中则会转换为 1900-01-01。
日期类型精度转化为可设置精度参数,最大为 8 位,也就是达到微秒级精度,可覆盖所有日期支持范围内的时间值。假如设置了 9 位的时间精度参数,则精度进一步增加,但是需要注意最大时间范围仅仅支持到 2262-04-11 23:47:16 UTC。
对日期类型的扩展,将增加对实际业务的支持力度,尤其是对于有实际日期时间类型依赖的业务,例如会员生日的存储分析支持。
轻量 Delete 及语法支持
V22.8 LTS 对于 MergeTree 引擎表,支持标准的 DELETE FROM SQL 语法,同时实现了“轻量” Delete 逻辑 。在之前的版本中,ClickHouse 的 DELETE 操作是 Mutation 类操作,所有的 DELETE 事件是通过单独文件进行记录存储,然后基于内核调度不定时的异步执行完成;执行过程也比较重,需要定位到相应的记录位置,进行物理删除。新版本中 Delete 基于 ClickHouse 的列更新机制,在数据分区中增加了系统虚拟列“_row_exists ”,通过 update_row_exists=0 where predicate 来标记列处于“已删除状态”,实现更加轻量,因此性能提升明显。语法差异如下:
旧版本 Delete 语法
ALTER TABLE [db.]table [ON CLUSTER cluster] DELETE WHERE filter_expr
新版本 Delete 语法
DELETE FROM [db.]table [WHERE expr]
举例如下:
DELETE FROM hits WHERE Title LIKE '%hello%' ;
所以轻量的 DELETE 也可以说是社区用户广泛期待的能力,从开发者的角度来看,标准 SQL 语法的支持,相比较之前的 Mutation 类操作方式,增强了开发的便利性。从官方的测试性能结果来看,在单表1亿记录总量,110个part规模下,轻量 Delete 的性能较之前版本提升了近40倍左右,性能提升明显。
但是需要注意的是,虽然有了标准 Delete From SQL 语法的支持以及轻量实现,但当前的 Delete 实现默认仍然是异步执行。所以 Delete 操作的结果并不是实时反馈在查询结果上的,并不能等同于在线处理类数据库的实时删除效果,也不能将 ClikHouse 应用于 TP 类型的在线业务类场景。官网强调 “this new feature does not make ClickHouse an HTAP DBMS”。
文件数据分布式并行写入
在 ClickHouse 早期的版本里支持了 S3 表函数,用于支持从 S3 进行数据导入操作,但是数据写入过程是串行的,面向集群中单台 ClickHouse Server 进行写入,典型场景写入效率通常是每秒百万行记录。
V22.8 版本中新增支持 S3 数据的分布式并行写入模式。当ClickHouse目标表是多副本 Replicated 或者是 Distributed 分布式表时,写入过程将跨集群多 Server 并行写入,写入效率提升 100 倍左右,可以达到十亿行记录每秒,理论性能提升近 1000 倍。
S3数据写入 ClickHouse 使用实例:
INSERT INTO distributed SELECT * FROM s3Cluster(....)
阿里云 ClickHouse 服务兼容社区的标准行为,支持 S3 导入的同时,增强扩展了对于阿里云 OSS 的支持,支持 OSS 的表函数模式,从 OSS 进行数据的导入。同样,阿里云 OSS 也支持并行导入 ClickHouse 的模式,语法示例如下。
insert into oss_test_tbl_distributed
select * from oss('<oss-endpoint>', '<access-key-id>', '<access-key-secret>', '<oss-file-path>', '<file-format-name>', '<column-definitions>');
3.其他版本合并特性
除了以上在V22.8版本上首次发布的能力之外,在上一个 LTS 版本 - V22.3 LTS 版本里发布的一些重要能力,也演进到 V22.8 LTS 版本中,在此一起介绍。
JSON类型和动态子列支持
老版本 String 方式 JSON 读写
在之前的版本中,ClickHouse支持以String类型来存储JSON对象,因为JSON对象是文本格式,需要通过特殊的String解析函数来解析复杂的JSON 结构,从而获得 JSON 对象内部字段信息。这种 String 类型存储方式,内部多个字段混合存储,针对内部特定属性的查询会带有额外的字段扫描消耗,因此查询效率非常低。同时使用起来也比较麻烦,如果 JSON 数据存在多层嵌套,那么查询 JSON 数据就需要一层层去进行解析和类型转换,才能被业务使用。示例如下:
CREATE TABLE games (data String)
ENGINE = MergeTree ORDER BY tuple();
SELECT JSONExtractString(data, 'teams', 1, 'name')