• 【TPCH】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个节点
    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

    条数越多,性能越好

    (注)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" < /data8/tpcH/data/100g/partsupp.tbl;

    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);
    #分布式表
    CREATE TABLE tpch.customer AS customer_local ENGINE = Distributed(ck_cluster, tpch, customer_local, rand());

    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;       
  • 相关阅读:
    set集合
    作业(2)
    字典
    列表功能
    字符串
    while循环
    pb加密转换成C#
    NET在64位系統使用32位oracle客户端访问数据库
    SQL Server中查找包含某个文本的存储过程
    SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户
  • 原文地址:https://www.cnblogs.com/syw20170419/p/16421150.html
Copyright © 2020-2023  润新知