ITPub博客

首页 > 数据库 > 数据库开发技术 > 升级后的 Doris2.0 查询到底有没有变快?

升级后的 Doris2.0 查询到底有没有变快?

原创 数据库开发技术 作者:安瑞哥是码农 时间:2023-10-25 18:41:00 0 删除 编辑


上篇文章,跟大家聊了我的Doris集群从1.2.3升级到最新版2.0.2的故事,虽然没能实现真正的“滚动式”,但整个过程都还比较顺利,好评。


但升级集群还只是第一步,接下来,咱要做的,就是把它给跑起来看看,相比于旧版本(1.2.3),它在查询上到底有没有效率上的提升,以及提升了多少?


从之前Doris官方发布的文章标题来看,说新版本「盲测10倍性能提升」,一开始吓我一跳,但点开一看,原来这个10倍,对比的是 0.15 版本。


但我这没有0.15版本的Doris集群,所以暂时无法去对这个结论进行证伪。


至于对比1.2版本,有多少性能提升,文章中没有详细说明,但是从它给出的对比结果图来看,2.0版本的查询效率是要更高的。


但至于能快多少,或者说是不是真的就一定快?


咱还是老规矩,跑起来试试看。



0. 准备


因为之前之前在 Doris1.2.3 的时候,我们其实已经做了很多次对 Doris 的查询性能测试(有兴趣可以去查看历史文章),那么这次,咱们就可以简单点,直接沿用之前用过的查询SQL语句,面对数据量一模一样的表,再次发起查询,看效率到底有什么变化。


注意:这里数据量一模一样,可能并一定代表里面的数据完全一样,因为在此期间,有的表数据内容发生过一些更改,但是不影响查询效率对比的结论。


由于当前这个 Doris 集群暂时就我一个人在用,几乎不存在外部一些因素的干扰,因此,这个测试对比很公平。


由于表以及表中的数据都是现成的,所以,其实没什么可准备的,只需要将之前1.2.3版本时测试的结果,找出来跟现在升级后的做个对比,就可以了。


废话不多说,咱直接开始。



1. PK开始


1.1  找出target_ip为空时(实际数据为双引号),此时每个不同domain的个数(要求domain统一小写)


查询SQL为:


select 
domain, 
count(domain) as count 
from 
(
select 
lower(domain) as domain 
from 
logs_from_spark01 
where target_ip='""'
)t  
group by 
t.domain;


之前1.2.3的测试结果:



耗时0.21秒。


升级到2.0.2后:



经过多次测试,取平均成绩,为0.35秒。


结论:虽然相差不大,但升级后,针对该查询,效率变慢了一丢丢。


注意:两次查询的结果不完全一样,是因为表数据量一样,但是部分数据发生了更换导致(下同)。


1.2 查询上网次数最多的前100个client_ip,以及他们分别的归属地是哪里


查询SQL如下:


select 
t1.client_ip,
t2.nature,
t2.province,
t2.city,
t1.count
from
(
select 
client_ip,
count(client_ip) as count 
from 
logs_from_spark01 
group by 
client_ip 
order by 
count desc 
limit 100
)t1
inner join 
logs_from_spark01 t2
on 
t1.client_ip=t2.client_ip
group by 
client_ip,
nature,
province,
city,
count


1.2.3版本查询结果:



耗时2.67秒。


升级后的2.0.2,查询结果:


运行多次,取效率最差的结果,耗时2.12秒。


结论:升级后,针对该查询,效率有所提升,但不多。


1.3 count distinct的效率对比


低基列的查询场景:查询 client_ip 字段的count distinct。


1.2.3版本的查询结果:



耗时0.25秒。


升级到2.0.2版本的结果:


耗时0.24秒。


结论1:针对低基列的查询,升级前后,几乎没有差别,打平。


高基字段的查询场景:查询 domain(区分大小写情况下) 字段的 count distinct。


1.2.3版本的查询结果:



耗时3.4秒。


升级到2.0.2之后的结果:


多次查询,取最差成绩,耗时3.26秒。


结论2:针对高基列,升级后,查询效率快了一丢丢。


1.4 以分钟为标准,找出连续上网次数最多的前100个client_ip


查询SQL:


select
client_ip,
max(row_num2) as max
from
(
select 
client_ip,
row_num2,
date_min
from
(
select
client_ip,
sub_date,
row_number() over (partition by client_ip,sub_date) as row_num2,
date_min
from
(
select 
client_ip,
date_min,
row_number() over (partition by client_ip order by date_min) as row_num,
minutes_sub(to_date(date_min), row_num) as sub_date
from
(
select client_ip,
date_min,
row_number() over (partition by client_ip,date_min order by date_min) as row_num
from
(
select 
client_ip, 
minute_floor(time) AS date_min
from 
logs_from_spark01 
where  
length(time)=14 
and 
time like '20220730%' 
)t
) A
where A.row_num=1
) B
) C
)D
group by 
D.client_ip
order by max desc
limit 100


1.2.3版本的查询结果:



耗时17.57秒。


升级到2.0.2之后的结果:


多次测试,取最差成绩,耗时13.26秒。


结论:升级后,针对该查询,效率有所提升。


1.5 查询出 client_ip 中包含的所有国家、省份、城市,以及运营商


查询SQL:


select 
nature,
province,
city,
operator 
from 
logs_from_spark01 
group by 
nature,
province,
city,
operator;


1.2.3版本的查询结果:



耗时0.68秒。


升级到2.0.2之后的查询结果:



多次查询,取平均成绩,耗时0.81秒。


结论:升级后,查询效率反而降低了那么一丢丢。


1.6 查询表中不重复数据的数据总条数


因为用的是duplicate表模型,所以没有去重功能,而这里的不重复,指的是整行内容都不重复(个人认为这个查询在某些场景下还是有必要的)。


还记得上次对比Clickhouse的时候,CK是可以支持一种非常简洁写法(distinct(*))的,当时Doris的1.2.3不支持,但即便升级到现在的2.0.2,Doris依然不支持这种简洁的写法。


于是升级后的Doris,SQL依然只能这么写:


SELECT 
count(*) 
FROM 
( 
SELECT  
*, 
row_number() over (partition by client_ip, nature, province, city, operator, domain, time, target_ip, rcode, query_type, authority_record, add_msg, dns_ip) as row_num 
FROM 
logs_from_spark01 
)t 
WHERE t.row_num =1;

1.2.3版本的查询结果:



耗时33秒。


升级到2.0.2版本的结果:


测试多次,取平均成绩,耗时40秒多。


结论:升级后,针对该查询,效率反而变低了。



最后


这次对比测试,用我能想到的办法,在尽可能排除外部干扰的情况下,用多次测试的结果,来尽量保证测试的公平性。


你可以从文中看到,凡是升级后效率变高的,我取的都是成绩最差的,以此来证明升级后,查询效率确实提升了。


而如果升级后效率变低了的,我则取的测试平均值(相对平均),以此来反映升级前后真实的差距。


从这次的6个场景,一共7个查询SQL对比结果来看,新版本PK老版本的结论是:一平、三胜、三负。


所以,单纯从这次的查询效率对比来看,升级后的Doris2.0.2跟升级前的Doris1.2.3,打了个平手。


对于这个测试结论,你同意吗?




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


原文作者:安瑞哥是码农;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2022-02-16

  • 博文量
    228
  • 访问量
    115424