概述

本次性能测试分别在同等硬件配置、同等数据规模、同等测试方法、同等测试工具下,对比AtomData、开源ClickHouse基于标准TPC-H的测试结果,针对TPC-H提供的不同应用场景进行不同的测试结果。本次性能测试时间为2022年 6月。

 

TPC-H由TPC委员会制定发布,用于评测数据库的分析查询能力。TPC-H查询包含八张数据表和二十二条复杂SQL查询,大多数查询包含多表Join、子查询和Group By等。更多信息可参考TPC-H测试集(见附录)。

 

石原子AtomData是下一代的企业级云原生实时数仓,是一种基于云上的支持高并发低延时查询的企业级数据仓库的解决方案,提供近乎无限的存储和算力、灵活性和并发性以便您对组织的全量数据进行整合、分析,提取数据的最大价值,获得数据洞察力。

基本信息

Test Tools

TPC-H Rev.3.0.0

Database Size

100G

Test Database

AtomData、ClickHouse

OS

Ubuntu 20.04 (5.4.0-104-generic x86_64)

Report Data

2022-06-10

测试环境

下表列出了本次性能测试所使用的环境信息。

产品

架构

CPU

MEM

Network

版本

AtomData

rc:1个节点
worker:4个节点

64核

rc与worker同等:256GB

万兆

AtomData:1.0

ClickHouse

shard:4个节点
无副本

64核

shard:256GB

万兆

ClickHouse:22.4.4.7

测试结论

 

AtomData

ClickHouse

 

查询耗时总时长(秒)

90.60

6287.66

秒数越少,性能越好

单表查询耗时(秒)

3.22

1.82

秒数越少,性能越好

SQL可执行完整度(条)

22

21

条数越多,性能越好

SQL单条查询优势(条)

19

3

条数越多,性能越好

【TPC-H】100G性能测试结果_数据库

(注)ClickHouse查询SQL21无法完成测试(原因见下方说明),因此图表的展示上同时去掉了ClickHouse与AtomData的时间。

AtomData与ClickHouse性能优劣分析总结:

  1. 查询耗时总时长:AtomData比ClickHouse快69.4倍
  2. 单表耗时查询:ClickHouse比AtomData快1.77倍
  3. SQL可执行完整度:TPC-H的22条SQL,AtomData均可对22条执行通过,ClickHouse仅能执行通过21条,ClickHouse执行SQL21时报错:Memory Limit,运行查询SQL21将耗用226.62G的内存大小,已经超出了机器所能提供的可用内存大小,本次测试的环境将无法完成SQL21的查询。可见,ClickHouse的内存耗用特别厉害。
  4. SQL单条查询优势:TPC-H的22条SQL为基准:
  • AtomData:有19条的查询耗时比ClickHouse具有性能优势,此19条SQL特征:具有大数据量、宽表、多维、复杂join、聚合、子查询的特点。ClickHouse在此部分的性能表现很差。
  • ClickHouse:有3条的查询耗时比AtomData具有性能优势,此3条SQL的特征:单表,AtomData在单表的性能表现上低于ClickHouse,但是性能表现差距不大。

不建议继续和ClickHouse进行分布式集群的性能对比,ClickHouse主打单表性能,建议后期可进行与ClickHouse的单表性能对比测试,了解AtomData OP在单表性能上与ClicHouse的差距有多大,然后具体分析原因和进行优化,从而提升产品的能力。

测试过程

  1. 安装所测产品并配置分布式集群环境
  2. 构建数据结构
  1. AtomData
  2. Clickhouse
  1. 数据初始化
  1. 构建数据
  2. 导入数据
  3. 验证数据
  1. 编写测试执行脚本
  2. TPC-H测试集
  • 单次执行22条query,有关测试过程的更多信息可参见附录:测试过程详解

测试方法

  • 本次测试使用TPC-H的脚本,依次执行TPC-H测试集。
  • 测试前,均执行两轮测试集作为预热环境。
  • 连续执行三次测试,取第三次测试结果的值。

测试优化

为保证顺利完成测试,每个产品进行测试之前,进行了必要的配置优化

  • AtomData

未进行配置优化,采用默认配置

  • ClickHouse

部分执行参数进行了优化,优化参数内容如下:

set max_bytes_before_external_group_by=800000000000000;
set max_memory_usage=800000000000000;

测试指标

测试指标包括整个TPC-H测试集和单条SQL的执行时长。

测试结果

本文介绍AtomData、ClickHouse、Doris的TPC-H性能测试结果,查询执行时间以秒(s)为单位

 

AtomData

ClickHouse

Q1

0.86

0.22

Q2

1.05

170.04

Q3

2.47

855.77

Q4

2.05

522.28

Q5

3.18

817.43

Q6

0.62

0.40

Q7

2.60

466.02

Q8

3.59

465.79

Q9

7.22

482.23

Q10

2.52

835.68

Q11

1.58

35.22

Q12

2.76

467.91

Q13

5.50

544.60

Q14

0.71

36.01

Q15

1.73

1.20

Q16

1.41

44.95

Q17

23.55

60.07

Q18

7.66

192.83

Q19

1.43

116.20

Q20

6.94

147.99

Q21

7.80

Memory limit

Q22

11.17

24.85

总时长(s)

90.60

6287.66

(重要说明)总时长的计算方式:AtomData和ClickHouse均未计算Q21,ClickHouse执行SQL21时报错:Memory Limit,运行查询SQL21将耗用226.62G的内存大小,已经超出了机器所能提供的可用内存大小,本次测试的环境将无法完成SQL21的查询

数据导入

AtomData:LOAD DATA LOCAL INFILE.....方式进行数据向表中导入。

ClickHouse:insert into方式进行导入,将lineitem、orders、partsupp进行文件切割,再次将数据导入对应的表。

附录:测试过程详解

TPC-H介绍

TPC基准™ H(TPC-H)是一个决策支持基准。它是一套面向业务的即席查询和并发修改。选择的查询和填充数据库的数据具有广泛的行业相关性,同时保持足够的易实现性。该基准说明了决策支持系统:

  • 检查大量数据
  • 执行高度复杂的查询
  • 回答关键业务问题

TPC-H通过在受控条件下对标准数据库执行一组查询来评估各种决策支持系统的性能。TPC-H查询:

  • 回答现实世界中的商业问题
  • 模拟生成的即席查询
  • 比大多数OLTP事务复杂得多
  • 包含丰富的操作员范围和选择性约束
  • 在被测系统的数据库服务器组件上生成密集活动
  • 针对符合特定人口和规模要求的数据库执行
  • 通过与在线生产数据库保持密切同步而产生的约束来实现

准备工作

在进行AtomData、ClickHouse、Doris环境运行和测试TPC-H(Transaction ProcessingPerformance Council) 标准benchmark测试集之前,您需要完成以下准备工作。

  • 提前准备好性能测试的环境,且3款数据库产品的测试环境配置均保持一致
  • 创建数据库测试账号
  • 新建用于测试的数据库

构造数据

性能测试以TPC-H 10G数据为测试数据,使用标准的DBGEN工具构造样本数据。从TPC官网下载TPC-H标准的数据生成工具DBGEN,编译后生成二进制可执行文件dbgen

./dbgen -s $scale -C $chunks -S $i -f

-s:指定scale,例如10G时,scale值为10

-C:一共分成几个chunk(注:一条语句只能生成一个chunk)

-S:当前命名生成第几个chunk

导入数据

本文介绍如何将TPC-H 10G的测试数据分别导入到AtomData、ClickHouse、Doris中,下表列出了TPC-H 10G测试数据集中的表数据条数。

表名

数据条数

CUSTOMER

1500,0000

NATION

25

PART

2000,0000

PARTSUPP

8000,0000

REGION

5

SUPPLIER

100,0000

LINEITEM

6,0003,7902

ORDERS

1,5000,0000

AtomData

LOAD DATA LOCAL INFILE '/data8/tpcH/100g/customer.tbl' INTO TABLE customer FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA LOCAL INFILE '/data8/tpcH/100g/nation.tbl' INTO TABLE nation FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA LOCAL INFILE '/data8/tpcH/100g/lineitem.tbl' INTO TABLE lineitem FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA LOCAL INFILE '/data8/tpcH/100g/orders.tbl' INTO TABLE orders FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA LOCAL INFILE '/data8/tpcH/100g/part.tbl' INTO TABLE part FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA LOCAL INFILE '/data8/tpcH/100g/partsupp.tbl' INTO TABLE partsupp FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA LOCAL INFILE '/data8/tpcH/100g/region.tbl' INTO TABLE region FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA LOCAL INFILE '/data8/tpcH/100g/supplier.tbl' INTO TABLE supplier FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';

ClickHouse

clickhouse-client -h 192.168.30.118 --port 9000 -u default --password "" -d tpch_single --format_csv_delimiter="|" --query="insert into tpch_single.region format CSV" < /data8/tpcH/data/100g/region.tbl;
clickhouse-client -h 192.168.30.118 --port 9000 -u default --password "" -d tpch_single --format_csv_delimiter="|" --query="insert into tpch_single.nation format CSV" < /data8/tpcH/data/100g/nation.tbl;
clickhouse-client -h 192.168.30.118 --port 9000 -u default --password "" -d tpch_single --format_csv_delimiter="|" --query="insert into tpch_single.supplier format CSV" < /data8/tpcH/data/100g/supplier.tbl;
clickhouse-client -h 192.168.30.118 --port 9000 -u default --password "" -d tpch_single --format_csv_delimiter="|" --query="insert into tpch_single.part format CSV" < /data8/tpcH/data/100g/part.tbl;
clickhouse-client -h 192.168.30.118 --port 9000 -u default --password "" -d tpch_single --format_csv_delimiter="|" --query="insert into tpch_single.customer format CSV" < /data8/tpcH/data/100g/customer.tbl;
clickhouse-client -h 192.168.30.118 --port 9000 -u default --password "" -d tpch_single --format_csv_delimiter="|" --query="insert into tpch_single.lineitem format CSV" < /data8/tpcH/data/100g/lineitem.tbl;
clickhouse-client -h 192.168.30.118 --port 9000 -u default --password "" -d tpch_single --format_csv_delimiter="|" --query="insert into tpch_single.orders format CSV" < /data8/tpcH/data/100g/orders.tbl;
clickhouse-client -h 192.168.30.118 --port 9000 -u default --password "" -d tpch_single --format_csv_delimiter="|" --query="insert into tpch_single.partsupp format CSV"

CreateTable SQL

AtomData

如下给出了customer建表的示例语句,其他7张表采用同样的SQL建表方式即可

CUSTOMER表

CREATE TABLE if not exists `CUSTOMER`
(
`C_CUSTKEY` int NOT NULL,
`C_NAME` varchar NOT NULL,
`C_ADDRESS` varchar NOT NULL,
`C_NATIONKEY` int NOT NULL,
`C_PHONE` varchar NOT NULL,
`C_ACCTBAL` decimal(12, 2) NOT NULL,
`C_MKTSEGMENT` varchar NOT NULL,
`C_COMMENT` varchar NOT NULL,
primary key (c_custkey)
) DISTRIBUTE BY HASH(`c_custkey`)
INDEX_ALL='Y';

 

revenue视图

create view revenue (supplier_no, total_revenue) as
select
l_suppkey,
sum(l_extendedprice * (1 - l_discount))
from
lineitem
where
l_shipdate >= date '1994-08-01'
and l_shipdate < date '1994-08-01' + interval '3' month
group by
l_suppkey;

ClickHouse

如下给出了customer建表的示例语句,其他7张表采用同样的SQL建表方式即可

CUSTOMER表

#本地表
create table customer_local (
c_custkey bigint,
c_name varchar(25) ,
c_address varchar(40) ,
c_nationkey bigint,
c_phone char(15) ,
c_acctbal decimal(15,2) ,
c_mktsegment char(10) ,
c_comment varchar(117)
)engine=MergeTree order by (c_custkey,c_name);
#分布式表

Query SQL

AtomData

以query1为示例,其他的query可自动生成

----【query 1】
select
l_returnflag,
l_linestatus,
sum(l_quantity) as sum_qty,
sum(l_extendedprice) as sum_base_price,
sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,
sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,
avg(l_quantity) as avg_qty,
avg(l_extendedprice) as avg_price,
avg(l_discount) as avg_disc,
count(*) as count_order
from
lineitem
where
-- l_shipdate <= date '1998-12-01' - interval '90' day (3)
l_shipdate <= date '1998-12-01' - interval '90' day
group by
l_returnflag,
l_linestatus
order by
l_returnflag,
l_linestatus;

 

ClickHouse

以query 2为示例,其他的query可自动生成,并进行必要语法的修改即可

-- TPC-H/TPC-R Minimum Cost Supplier Query (Q2)
select
s.s_acctbal,
s.s_name,
n.n_name,
p.p_partkey,
p.p_mfgr,
s.s_address,
s.s_phone,
s.s_comment
from
part as p
global join partsupp as ps on p.p_partkey = ps.ps_partkey
global join supplier as s on ps.ps_suppkey = s.s_suppkey
global join nation as n on s.s_nationkey = n.n_nationkey
global join region as r on n.n_regionkey = r.r_regionkey
where
p.p_size = 15
and p.p_type like '%BRASS'
and r.r_name = 'EUROPE'
and ps.ps_supplycost =(
select
min(ps.ps_supplycost)
from
partsupp as ps
global join supplier as s on s.s_suppkey = ps.ps_suppkey
global join nation as n on s.s_nationkey = n.n_nationkey
global join region as r on n.n_regionkey = r.r_regionkey
global join part as p on p.p_partkey = ps.ps_partkey
where r.r_name = 'EUROPE'
)
order by
s.s_acctbal desc,
n.n_name,
s.s_name,
p.p_partkey
limit 100;

 

 

  1.作者:Syw

2.本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

3.如果文中有什么错误,欢迎指出。以免更多的人被误导。