ClickHouse 特性 | 一文读懂 ClickHouse V22.8 新版本重要特性
1.背景介绍
各位 ClickHouse 圈友们!ClickHouse 又双叒叕发布新版本了。
大家都知道ClickHouse的发版节奏非常快,从官网发布记录来看,2022年依旧保持了一个月一个大版本的节奏,详情可以参阅ClickHouse 2022 Changelog(https://clickhouse.com/docs/en/whats-new/changelog/)。除了主版本之外,小版本就更多了,可见 ClickHouse 社区非常的活跃,内核迭代效率非常高。在此也呼吁国内的开发者小伙伴们多多参与到 ClickHouse 社区建设活动中。
今天给大家重点介绍 ClickHouse 社区最新版本的 LTS 版本 - V22.8 LTS 。LTS 全称是Long Term Support 长期支持版。LTS 版本是社区官方推荐的内核功能稳定,可以用于生产环境,且会长期进行稳维护升级的版本系列,也是被社区用户最广泛使用的版本,阿里云也于近期正式提供了全托管的企业级 ClickHouse V22.8 版本,大家可以到阿里云官网搜索体验。
闲言少叙,咱们一起来揭开 V22.8 版本的面纱,看看有哪些值得关注的重要特性发布。
2.特性介绍
日期&时间类型扩展
日期类型精度转化为可设置精度参数,最大为 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 来标记列处于“已删除状态”,实现更加轻量,因此性能提升明显。语法差异如下:
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 From SQL 语法的支持以及轻量实现,但当前的 Delete 实现默认仍然是异步执行。所以 Delete 操作的结果并不是实时反馈在查询结果上的,并不能等同于在线处理类数据库的实时删除效果,也不能将 ClikHouse 应用于 TP 类型的在线业务类场景。官网强调 “this new feature does not make ClickHouse an HTAP DBMS”。
文件数据分布式并行写入
在 ClickHouse 早期的版本里支持了 S3 表函数,用于支持从 S3 进行数据导入操作,但是数据写入过程是串行的,面向集群中单台 ClickHouse Server 进行写入,典型场景写入效率通常是每秒百万行记录。
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 读写
CREATE TABLE games (data String)
ENGINE = MergeTree ORDER BY tuple();
SELECT JSONExtractString(data, 'teams', 1, 'name')
FROM games;
新版本独立 JSON 对象类型和动态子列
DROP TABLE IF EXISTS github_JSON;
SET allow_experimental_object_type=1;
CREATE table github_JSON(event JSON) ENGINE = MergeTree ORDER BY tuple(
动态子列的支持,大幅提高了非结构化数据的分析效率和扩展性支持。
而新版本中由于有了动态子列,开发者完全不需要关心 JSON 的嵌套层次和内部数据类型,只需要在目标表中创建 JSON 数据类型字段,直接将半结构化的数据批量导入到 ClickHouse 目标表中即可。同时,即使在业务变更 JSON 对象属性增加的情况下,也无需要修改目标表的结构,内核会动态增加子列,并进行数据存储,扩展灵活度大幅提升。
INSERT INTO github_JSON SELECT * FROM OSS('oss-endpoint',
JSONAsObject, 'event JSON');
SELECT event.type, event.repo, event.actor FROM github_JSON LIMIT 1;
引擎级远程文件缓存
在阿里云 ClickHouse 的云原生版本中,我们已经基于对象存储 OSS 实现了基于多 shard 共享存储的存算分离架构。通过应用引擎的缓存能力,保证了云原生版本的查询性能。
性能及其他
除了以上的重要的特性发布之外,V22.8 LTS 保持了社区一贯的持续性能优化提升,带来数十项的性能优化。以及其他一些成熟特性如:
Projection 的支持,相比较物化视图增强了和源表数据一致性的保证。同时基于“空间换效率”的逻辑,创建基于不同排序索引维度的物理表,数十倍地提高了非排序键数据的查询效率。
UDF (UserDefinedFunction) 的支持,支持按照 SQL 模式和脚本执行模式的用户自定义函数,增加了用户自主进行数据清洗和处理的能力。
4.总结