洞察探索open banking如何通过小程序容器技术助力金融企业实现数据安全和数字化转型
1276
2022-10-10
【TPC-H】100G性能测试结果
概述
本次性能测试分别在同等硬件配置、同等数据规模、同等测试方法、同等测试工具下,对比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个节点 | 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 | 条数越多,性能越好 |
(注)ClickHouse查询SQL21无法完成测试(原因见下方说明),因此图表的展示上同时去掉了ClickHouse与AtomData的时间。
AtomData与ClickHouse性能优劣分析总结:
查询耗时总时长:AtomData比ClickHouse快69.4倍单表耗时查询:ClickHouse比AtomData快1.77倍SQL可执行完整度:TPC-H的22条SQL,AtomData均可对22条执行通过,ClickHouse仅能执行通过21条,ClickHouse执行SQL21时报错:Memory Limit,运行查询SQL21将耗用226.62G的内存大小,已经超出了机器所能提供的可用内存大小,本次测试的环境将无法完成SQL21的查询。可见,ClickHouse的内存耗用特别厉害。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的差距有多大,然后具体分析原因和进行优化,从而提升产品的能力。
测试过程
安装所测产品并配置分布式集群环境构建数据结构
AtomDataClickhouse
数据初始化
构建数据导入数据验证数据
编写测试执行脚本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_orderfrom lineitemwhere -- l_shipdate <= date '1998-12-01' - interval '90' day (3) l_shipdate <= date '1998-12-01' - interval '90' daygroup by l_returnflag, l_linestatusorder 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_commentfrom 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_regionkeywhere 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_partkeylimit 100;
1.作者:Syw
3.如果文中有什么错误,欢迎指出。以免更多的人被误导。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~