Doris与Clickhouse物化视图对比小结


最近这几周集中火力研究了下Doris的玩法,其中重点看下它的物化视图功能。


之所以对这个功能如此痴迷呢,原因在于前段时间玩CK的时候,感受到了物化视图功能的强大,于是在研究Doris的时候,也就抱着好奇的心态想对比一下,同样都叫物化视图,这两者对于使用者而言,会有什么不一样的体验呢?


经过一番对比使用后,一点愚见总结,供你参考



1. 从功能表现上


1.1 CK的物化视图功能:强


具体强在哪?


1. 可以支持单表较为复杂的查询,作为物化视图的创建条件;


2. 可以支持多表join的查询,作为物化视图的创建条件;


1.2 Doris的物化视图功能:弱


弱在哪?


1. 无法支持较为复杂的单表查询,来作为物化视图的创建条件,比如对基础表的字段运用非聚集函数就不可以;


2. 不能支持多表join的查询,来作为物化视图的创建条件;



2. 从使用便利性上


1. CK的物化视图在创建时,是以创建“额外表”的形式存在的,所以使用时,不同的查询(聚合)需求,需要查不同的表(视图),这样就需要你清楚每一张新建的“额外表”的具体功能以及表名字,管理成本比较高;


2. Doris的物化视图,它是对“基础表”为了满足多样查询的一种“加速”手段,有点类似我们对传统数据库的表创建额外索引,但是普通索引只能对条件查找加速,它这个可以对一些简单的聚合查询也可以起到加速作用。



3. 举个栗子


3.1 稍微复杂一点的单表聚合场景

比如对于我的这份DNS日志数据而言,如果我想以“查询每个小时每个client_ip上网的次数”作为我创建物化视图的条件,该怎么做?


先瞅一眼基础表数据:


如果要对基础表进行该条件查询的话,该怎么办?


对于CK来说:


基础表的查询语句应该这么写:


而如果我想针对这个查询条件,创建物化视图呢,可以这么来写:

CREATE MATERIALIZED VIEW cluster_db.dns_logs_agg_by_hour_cluster_view TO cluster_db.dns_logs_agg_by_hour_cluster
(
    `client_ip` String,
    `date_hour` DateTime,
    `count` AggregateFunction(countString)
AS
SELECT
    client_ip,
    toStartOfHour(parseDateTimeBestEffort(time)) AS date_hour,
    countState(client_ip) AS count
FROM dns_logs_cluster_later
WHERE length(time) = 14
GROUP BY
    client_ip,
    date_hour

而创建后的物化视图 dns_logs_agg_by_hour_cluster_view 就是我们要的目标“额外表”,后续该聚合需求就可以直接查询该视图就可以。


对于Doris来说:


同样的需求在Doris上,对其基础表的查询语句是这样的:

SELECT 
client_ip,
hour_floor(timeAS date_hour,
count(client_ip) AS count 
FROM example_db.dns_logs_from_kafka 
WHERE length(time)=14 
GROUP BY 
client_ip,
date_hour 
limit 10;

查询结果是这样的:


但是,如果我想用Doris的方式来创建个物化视图,那么根据其提供的语法规则,我应该这么来从创建:

create MATERIALIZED VIEW 
agg_by_hour_view 
AS 
SELECT 
client_ip,
hour_floor(timeAS date_hour,
count(client_ip) AS count 
FROM 
example_db.dns_logs_from_kafka 
WHERE 
length(time)=14 
GROUP BY 
client_ip,
date_hour;

但当我自信满满去执行时,发现我天真了,给我来个不支持函数的报错:

所以我猜测,在对Doris创建物化视图时,除了能对字段运用聚合函数外,其他任何函数都不能用(大概测试了一下,确实如此)。



3.2 来个两表关联的场景


需求:对2张不同的表,通过client_ip这个字段进行关联查询。


对于CK来说:


这个物化视图可以这么来创建,建表语句如下:


这样一来,join_view02 就承接了这两种关联表的结果。



对于Doris来说:


我尝试这么来写物化视图的创建语句:


结果被明确告知,它的物化视图只能基于一张表来创建。



4. 最后


没有一款十全十美的数据库,大家都各自带着优点和缺陷,需要根据你的业务特点,去甄别和选择。


严格来说,以上的对比内容相对来说还比较片面。


对于任何一款数据库的任何一个功能,想要全方位体验它的优劣,必须要经过多个项目,长时间周期,以及多个不同业务需求场景的锤炼,才能对一个功能做出相对完整、客观的评价。


希望之后的文章中,继续对这一部分追加和补充。




你可以添加我的私人微信,拉你入技术讨论群,跟一群热爱技术的小伙伴一起成长...

请使用浏览器的分享功能分享到微信等