秒杀 SQL 的开源神器,测试报告来了

一、 测试任务

TPCH 100G。

TPCH是国际标准,具体内容不再过多解释。

需要说明的是,TPCH 虽然有 22 个题,但仍然不能全面反映出被测系统对实际业务的响应性能。主要原因如下两点:

1. TPCH中问题比较常规,没有涉及序运算,分步运算也较简单。而实际业务中有性能瓶颈的运算,其复杂度通常会远高于 TPCH,会大量涉及序运算和分步计算;

2. 测试问题已经被长期公开,有些数据库可能会专门做相应的优化;

当然,作为国际标准,也会有一定的参考价值。

二、 对比技术

我们选择了下面几个产品用为对比技术

  1. ClickHouse, 传说中世界上最快的OLAP数据库,测试版本 23

  2. Starrocks, 宣称更快的OLAP数据库,测试版本 2.5.2

  3. Oracle,使用量很大,常常作为数据库性能测试的对比标杆,测试版本 19

Oracle不是专业的OLAP数据库,性能指标会弱于其它产品,仅作为参考。

三、 测试环境

单台物理服务器,配置:

2颗Intel3014,主频1.7G,共12核CPU

64G内存

SSD固态硬盘

TPCH 100G中最大表也就约70G,简单压缩后就很可能小于机器的物理内存。为了能测试出这些产品的外存计算能力以及对内存的敏感性,我们使用了虚拟机来限制CPU数量和内存,根据业界较常见的云虚拟机规格,我们设计了两套测试环境:

VM1:8CPU,32G内存

VM2:4CPU,16G内存

Starrocks至少要安装两个节点BE和FE,将承担计算任务的BE安装在虚拟机上,管理节点FE安装在物理机上,这样不会影响测试效果。

SPL、Clickhouse和Oracle都只要在虚拟机下安装就可以了。

SPL、Clickhouse、Starrocks在两套虚拟机上都测试了,Oracle因为仅作为参考,只在VM1测试了。

四、 数据准备

将TPCH工具生成的文本数据做了如下转换:

1. 维表的单字段主键和事实表中的对应外键做序号化处理(TPCH的几个维表主键原本就是序号)

2. 所有数据表按主键排序

将改造过的数据导入到数据库中。再将:

3. 枚举字段串字段值转换成序号、日期型字段转换成整数

然后生成SPL的组表文件。

具体动作可参考这套学习资料:用 TPCH 练习性能优化

专业的OLAP数据库通常会根据元数据信息自动做上述的第3步以优化数据类型,而SPL没有元数据,缺乏自动优化能力,需要用代码事先处理。不过,即使加上这部分动作,大部分情况时,SPL代码也仍比SQL更短。

五、 测试过程

1. SPL测试

用SPL社区版和企业版分别写了两套脚本,在VM1上用8线程并行,在VM2上用4线程并行。

SPL可以使用与SQL不同的算法,对于较复杂的查询,其代码更简单且计算复杂度更低,通常会有性能上的优势。

TPCH有22个题,依次罗列并讲解占篇幅太大,这里将SPL代码打包供下载阅读:

PL-TPCH.zip

右侧扫码下载查看 ⇨

e8ccd00e9d57a01d43cdbbb99e65f05d.png

脚本理解可以参考:用 TPCH 练习性能优化

需要指出的是,和上述学习资料中的优化代码不同,这次测试代码没有使用任何预加载动作,所有运算都是临时从文件中读取数据再计算。有元数据信息的专业数据库有时可以预加载一些小数据表,没有元数据的SPL也需要人工处理预加载(可参考上述学习资料),但考虑到小内存场景,这次测试没有使用这个技巧。

2. SQL测试

使用TPCH提供的SQL语句在Starrocks、Clickhouse和Oracle中运行。SQL语句本身不能描述低复杂的算法,只能依赖数据库的优化引擎。

用监控工具观察发现:Starrocks和Clickhouse在VM1上使用了全部8个CPU运行,在VM2上使用了全部4个CPU运行,并且使用率足够高,说明这款数据库都能充分利用CPU资源。而Oracle(仅在VM1)用8并行时,所有CPU的使用率都只在50%左右,用4个并行时,CPU使用率才能到达90%以上,说明Oracle还不能充分利用CPU资源。

测试过程中,如果某题运行10分钟后还未出结果,就终止运行,在测试结果中记录“>600”。

Clickhouse的SQL不支持子查询中引用主查询的字段,TPCH有几个标准SQL语句无法直接执行(报语法错误),需要改写后才能运行。下面列出改写后的SQL语句:

Q2:

select  s_acctbal, s_name,  n_name,  p.p_partkey,  p_mfgr,  s_address,  s_phone,  s_comment
from  part p,  partsupp,  supplier,  nation,  region, (
      select  p_partkey, min(ps_supplycost) as supplycost
      from  partsupp,  part, supplier,  nation,  region
      where
        p_partkey = ps_partkey
        and s_suppkey = ps_suppkey
        and s_nationkey = n_nationkey
        and n_regionkey = r_regionkey
        and r_name = 'ASIA'
      group by p_partkey
  ) pps
where
  p.p_partkey = pps.p_partkey
  and ps_supplycost = pps.supplycost
  and p.p_partkey = ps_partkey
  and s_suppkey = ps_suppkey
  and p.p_size = 25
  and p.p_type like '%COPPER'
  and s_nationkey = n_nationkey
  and n_regionkey = r_regionkey
  and r_name = 'ASIA'
order by  s_acctbal desc, n_name,  s_name,  p.p_partkey
limit 100;

Q4:

select
    o_orderpriority,
    count(*) as order_count
from (
    select 
        distinct l_orderkey,o_orderpriority
    from orders
    join lineitem on 
        l_orderkey = o_orderkey 
    where
        o_orderdate >= date '1995-10-01'
        and o_orderdate < date '1995-10-01' + interval '3' month
        and l_commitdate < l_receiptdate
)
group by
    o_orderpriority
order by
    o_orderpriority;

Q20:

select s_name, s_address
from supplier, nation
where
  s_suppkey in (
    select ps_suppkey
    from partsupp, (
        select l_partkey lpk, l_suppkey lsk, 0.5 * sum(l_quantity) as lq
        from lineitem
        where
           l_shipdate >= date '1995-01-01'
           and l_shipdate < date '1995-01-01' + interval '1' year
       group by l_partkey, l_suppkey
    ) li
    where
      ps_partkey = li.lpk
      and ps_suppkey = li.lsk
      and ps_partkey in (
        select p_partkey from part
        where p_name like 'bisque%'
      )
      and ps_availqty > li.lq
  )
  and s_nationkey = n_nationkey
  and n_name = 'CHINA'
order by s_name
limit 100;

Q21:

改写困难,放弃执行。

Q22:

select
  cntrycode,
  count(*) as numcust,
  sum(c_acctbal) as totacctbal
from
  (
    select
      substr(c_phone, 1, 2) as cntrycode,
      c_acctbal
    from
      customer
    where
      substr(c_phone, 1, 2) in
        ('11', '14', '15', '19', '20', '21', '23')
      and c_acctbal > (
        select
          avg(c_acctbal)
        from
          customer
        where
          c_acctbal > 0.00
          and substr(c_phone, 1, 2) in
            ('11', '14', '15', '19', '20', '21', '23')
      )
      and c_custkey not in (
        select distinct o_custkey from orders
      )
  ) as custsale
group by
  cntrycode
order by
  cntrycode;

六、 测试结果

VM1(单位:秒)

TPCH编号SPL社区版SPL企业版StarrocksClickhouseOracleSnowflake
129.99.714.015.4114.37.3
22.71.30.617.31.93.0
317.88.89.8内存溢出165.83.3
47.44.95.7内存溢出158.43.0
535.38.913.1内存溢出174.54.0
68.64.53.94.8126.70.5
724.110.512.4内存溢出181.53.8
845.36.98.3内存溢出209.74.2
966.316.821.3内存溢出256.014.7
1016.48.311.158.3195.68.2
113.30.91.36.78.71.7
1210.34.94.810.7186.01.7
1353.912.121.3134.133.37.7
1412.83.34.610.2170.01.3
1514.34.77.111.2161.80.8
1610.22.72.94.010.82.6
1724.75.34.244.6156.52.8
1818.66.420.8内存溢出416.812.0
1910.05.86.0>600144.12.2
2014.35.25.231.2171.01.5
2125.511.914.5语法错误360.79.0
2211.02.51.98.437.71.7
合计462.7146.3194.8-3441.896.5

这里我们附加了一列Snowflake自己做的测试(从其SIGMOD论文中的统计图扒出来,数值可能不精确)供参考,该项测试使用Snowflake Medium级集群,由4台8核16线程机器构成,CPU也更好,硬件资源相当于本次测试的4-8倍以上。

VM2(单位:秒)

TPCH编号SPL社区版SPL企业版StarrocksClickhouse
161.821.526.029.1
23.72.00.931.1
338.520.817.5内存溢出
414.312.110.8内存溢出
572.121.325.3内存溢出
619.87.57.98.9
751.424.122.5内存溢出
877.818.514.3内存溢出
9100.839.043.0内存溢出
1033.522.420.7内存溢出
114.91.21.912.0
1221.38.812.019.3
1377.022.844.5内存溢出
1428.35.49.216.6
1525.710.313.420.0
1613.64.45.87.0
1742.214.08.068.6
1832.514.8内存溢出内存溢出
1924.214.211.8>600
2030.215.59.647.0
2152.220.928.8语法错误
2221.83.53.511.7
合计847.6325.0337.8-

注:Starrocks有一题未跑出来,合计值不包括此题。

七、 结果点评

  1. 总体来看,SPL 企业版的成绩最好,Starrocks 其次,SPL 社区版第三,Oracle 的表现和这些专业计算技术产品相差非常远。

  2. Clickhouse表现很差,除了之前说过的某些 SQL 不支持外,还有许多题跑不出来,甚至有慢于 Oracle 的。即使能跑出来的题,也大都比 SPL 企业版和 Starrocks 更慢,减小内存后跑不出来就更多。传说中的世界上最快看来是严重名不符实的,应用场景就很少,能用的场景也不算快。

  3. Starrocks在 SQL 数据库中表现优秀,它宣称采用了 CPU 的向量计算技术而拥有最快的 SQL 引擎(SPL 不是 SQL 引擎),至少从这个测试上看可以说是实至名归的。不过在小内存时也会发生内存溢出,说明其对资源要求较高。

  4. SPL的社区版和企业版都能在小内存环境下跑出所有题,对资源要求较低。

  5. SPL社区版会使用 Java 对象存储字段值,能获得灵活的泛型效果,但占用内存大且计算过程中判断很多。采用了低复杂度的算法后,性能远远超过 Oracle,但和 Starrocks 还存在差距。说明仅在工程上优化也会有相当大的潜力。

  6. SPL企业版也实现了向量式计算(放弃泛型性),这方面和 Starrocks 接近,再在低复杂度算法的加持下,总体性能表现最为优异。但由于 Java 实现时还不能直接利用 CPU 特性,只是克服社区版中对象过大及判断过多的问题,所以不是每个题都能超越 Starrocks。

  7. 测试结论:

SPL和 Starrocks 都是优秀的计算引擎,对于 TPCH 这类不算复杂的任务,SPL 略占优势但并不太大。

Clickhouse计算能力很差,无法和 SPL 及 Starrocks 相提并论。

Oracle稳定,但性能和专业的 OLAP 计算引擎差距很大,不适合承担大计算量任务。

GitHub:https://github.com/SPLWare/esProc

73045a5700caf78397eec0cf29f7a04a.png

重磅!开源SPL交流群成立了

简单好用的SPL开源啦!

为了给感兴趣的技术人员提供一个相互交流的平台,

特地开通了交流群(群完全免费,不广告不卖课)

需要进群的朋友,可长按扫描下方二维码

fea865a5732e8c0dff3bb241374abd3a.png

本文感兴趣的朋友,请到阅读原文去收藏 ^_^

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值