最新动态
Clickhouse 新功能 Projection
2024-11-10 23:16

        Clickhouse的MergeTree只支持一种排序规则,如建表时定义Order BY A,B,C ,查询where A很快,查询where C无法命中索引。

Clickhouse 新功能 Projection

        由于业务规则变更,原来宽表的排序键是issueId,产品修改了问题Id的计算规则,引入了一个新字段bugIssueId,为了查询效率,应该把排序键换成bugIssueId,但是Clickhouse并不支持更换排序键。于是我查了一下针对这个问题是否有解决办法,首先物化视图(materialized view)是可以考虑的,但是存在数据一致性问题。另外Clickhouse在上个月正式投产的Projection这个功能非常优秀,可以完美解决上述问题。Projection原来在Experimental Feature下,需要开启配置才能使用,于2022-02-17正式投入生产使用。

        Projection的概念出自《C-Store A Column-oriented DBMS》这篇论文,作者是2015年图领奖获得者、Vertica之父——Mike Stonebraker。来自快手的Amos Bird(郑天祺)借鉴了这个思想,在Clickhouse中实现了Projection功能,并贡献到社区。

Projection的特点

        1) part-level:Projection类型物化视图,但物化视图是完完全全的一张新表,而Projection是原表的一个部分,存储在分区目录中的一个子目录。

        2) consistency:Projection保存在原表的分区,数据的更新、合并都是同源的,不存在不一致的问题。在读写一致性方面,Projection采用版本控制(multi-versioning,没有冗长的锁机制,插入不会影响读操作。

        3) automatic: 查询数据时,自动匹配最佳的projection。匹配规则如下

        1)创建Projection

 

        2) 删除Projection

 

        3)手动触发物化(首次创建Projection时使用,否则只有新插入数据会自动物化

 

        4)删除Projection磁盘文件,但不删除说明(类似Mysql的truncate

 

        Projection的ADD,DROp,CLEAR只是对元数据进行修改和文件的删除,因此这些操作都是轻量级的。但是MATERIALIZE 是一个重量级的操作,需要对原有数据进行重排序,所以尽量分区内进行操作或在一个合适的时间节点进行操作。

        案例来自官网:UK Property Price Paid | ClickHouse documentation

1)下载数据源

 

 2)建表

 

3)导入数据

 

 4)验证

 

5)查询以下三条语句

 

 6建立并物化Projection

 

 7)再次执行前面三条查询语句

 

8)查看执行计划

 

 看到 ReadFromStorage (MergeTree(with * projection *))说明命中了projection。

9)结果对比

 

        可以看出,无论是在时间还是空间上,Projection的表现都是相当优秀的。

        projection在功能上有点类似mysql的index,但跟MergeTree的完全是两码事,MergeTree的index是主键基础上的跳数索引。Projection的主要构件包含三个部分,分别是:Projection定义、Projection存储、Projection查询分析。

    Projection的定义可以看作CREATE TABLE AS SELECT (CTAS)语句

        1) select中的别名与表达式转换为标准命名

        2)group by语句生成Aggregate projections,使用Group by指定的聚合维度作为主键

        3)聚合维度将生成中间状态类型AggregateFunction(...)AggregateFunction(sum, UInt64), AggregateFunction(duration, UInt64) --注:这一点我不是很理解

    Projection是底表Part的伴生Part(即分区目录的子目录

        1)存储结果完全跟底表的MergeTree结构相同

        2)Projection Part复用底表Part的分区信息

        3)merge, mutation 和replication均对照父part进行处理

        PS:在我自己做的实验中,Projection的存储跟父Part的存储结构并非是完全一致的。我想应该是Projection的数据量较少的时候,.bin文件和.mrk2文件均合并成一个文件,而不是按列独立存储。

原理

一致性保障: 

Clickhouse官方文档:MergeTree | ClickHouse documentation

 《C-Store A Column-oriented DBMS:http://www.doczj.com/doc/f236381bfc4ffe473368ab67-1.html

【clickhouse】clickhouse强大智能的 Projection (投影) 功能_九师兄的博客-CSDN博客

Experimental ClickHouse: Projections · Tinybird

    以上就是本篇文章【Clickhouse 新功能 Projection】的全部内容了,欢迎阅览 ! 文章地址:http://sjzytwl.xhstdz.com/quote/71550.html 
     行业      资讯      企业新闻      行情      企业黄页      同类资讯      网站地图      返回首页 物流园资讯移动站 http://mip.xhstdz.com/ , 查看更多   
发表评论
0评