最近这几周集中火力研究了下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(count, String)
) 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(time) AS 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(time) AS 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. 最后
没有一款十全十美的数据库,大家都各自带着优点和缺陷,需要根据你的业务特点,去甄别和选择。
严格来说,以上的对比内容相对来说还比较片面。
对于任何一款数据库的任何一个功能,想要全方位体验它的优劣,必须要经过多个项目,长时间周期,以及多个不同业务需求场景的锤炼,才能对一个功能做出相对完整、客观的评价。
希望在之后的文章中,继续对这一部分追加和补充。
