DorisDB vs ClickHouse 查询测试

数据分析挖掘与算法

共 22817字,需浏览 46分钟

 ·

2021-06-16 11:50

测试方法

为了方便用户快速的了解DorisDB的性能指标,这里我们提供了一个标准的Star schema benchmark的测试方法和工具仅供参考。

Star schema benchmark(以下简称SSB)是学术界和工业界广泛使用的一个星型模型测试集(来源论文),通过这个测试集合也可以容易的和其他OLAP产品进行性能对比。

测试数据

表名行数解释
lineorder6亿SSB商品订单表
customer300万SSB客户表
part140万SSB 零部件表
supplier20万SSB 供应商表
dates2556日期表
lineorder_flat6亿SSB打平后的宽表

测试数据环境

主机资源:

主机内存CPU
CentOS128G16core

DorisDB使用资源:

FE 单台,BE 5台 部署

内存CPU数量
80G16core6

ClickHouse使用资源:

内存CPU数量
80G16core1

说明:由于资源原因,DorisDB、ClickHouse集群和上同时部署了CDH集群和其他组件,所以该测试并不能100%代表DorisDB、ClickHouse的性能。

测试结果

单表测试结果如下

img

多表测试结果如下

img

测试过程

DorisDB

下载ssb-poc工具包并编译

wget http://dorisdb-public.oss-cn-zhangjiakou.aliyuncs.com/ssb-poc-0.9.zip
unzip ssb-poc-0.9.zip
cd ssb-poc
make && make install
#所有相关工具安装到output目录

生成数据

cd output 
# 运行生成数据的脚本
bin/gen-ssb.sh 100 data_dir

建表

CREATE TABLE IF NOT EXISTS `lineorder` (
  `lo_orderkey` int(11NOT NULL COMMENT "",
  `lo_linenumber` int(11NOT NULL COMMENT "",
  `lo_custkey` int(11NOT NULL COMMENT "",
  `lo_partkey` int(11NOT NULL COMMENT "",
  `lo_suppkey` int(11NOT NULL COMMENT "",
  `lo_orderdate` int(11NOT NULL COMMENT "",
  `lo_orderpriority` varchar(16NOT NULL COMMENT "",
  `lo_shippriority` int(11NOT NULL COMMENT "",
  `lo_quantity` int(11NOT NULL COMMENT "",
  `lo_extendedprice` int(11NOT NULL COMMENT "",
  `lo_ordtotalprice` int(11NOT NULL COMMENT "",
  `lo_discount` int(11NOT NULL COMMENT "",
  `lo_revenue` int(11NOT NULL COMMENT "",
  `lo_supplycost` int(11NOT NULL COMMENT "",
  `lo_tax` int(11NOT NULL COMMENT "",
  `lo_commitdate` int(11NOT NULL COMMENT "",
  `lo_shipmode` varchar(11NOT NULL COMMENT ""
ENGINE=OLAP
DUPLICATE KEY(`lo_orderkey`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`lo_orderkey`) BUCKETS 96
PROPERTIES (
"replication_num" = "1",
"colocate_with" = "group1",
"in_memory" = "false",
"storage_format" = "DEFAULT"
);
  
  
CREATE TABLE IF NOT EXISTS `customer` (
  `c_custkey` int(11NOT NULL COMMENT "",
  `c_name` varchar(26NOT NULL COMMENT "",
  `c_address` varchar(41NOT NULL COMMENT "",
  `c_city` varchar(11NOT NULL COMMENT "",
  `c_nation` varchar(16NOT NULL COMMENT "",
  `c_region` varchar(13NOT NULL COMMENT "",
  `c_phone` varchar(16NOT NULL COMMENT "",
  `c_mktsegment` varchar(11NOT NULL COMMENT ""
ENGINE=OLAP
DUPLICATE KEY(`c_custkey`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`c_custkey`) BUCKETS 12
PROPERTIES (
"replication_num" = "1",
"colocate_with" = "groupa2",
"in_memory" = "false",
"storage_format" = "DEFAULT"
);
  
  
CREATE TABLE IF NOT EXISTS `dates` (
  `d_datekey` int(11NOT NULL COMMENT "",
  `d_date` varchar(20NOT NULL COMMENT "",
  `d_dayofweek` varchar(10NOT NULL COMMENT "",
  `d_month` varchar(11NOT NULL COMMENT "",
  `d_year` int(11NOT NULL COMMENT "",
  `d_yearmonthnum` int(11NOT NULL COMMENT "",
  `d_yearmonth` varchar(9NOT NULL COMMENT "",
  `d_daynuminweek` int(11NOT NULL COMMENT "",
  `d_daynuminmonth` int(11NOT NULL COMMENT "",
  `d_daynuminyear` int(11NOT NULL COMMENT "",
  `d_monthnuminyear` int(11NOT NULL COMMENT "",
  `d_weeknuminyear` int(11NOT NULL COMMENT "",
  `d_sellingseason` varchar(14NOT NULL COMMENT "",
  `d_lastdayinweekfl` int(11NOT NULL COMMENT "",
  `d_lastdayinmonthfl` int(11NOT NULL COMMENT "",
  `d_holidayfl` int(11NOT NULL COMMENT "",
  `d_weekdayfl` int(11NOT NULL COMMENT ""
ENGINE=OLAP
DUPLICATE KEY(`d_datekey`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`d_datekey`) BUCKETS 1
PROPERTIES (
"replication_num" = "1",
"in_memory" = "false",
"colocate_with" = "groupa3",
"storage_format" = "DEFAULT"
);
  
 CREATE TABLE IF NOT EXISTS `supplier` (
  `s_suppkey` int(11NOT NULL COMMENT "",
  `s_name` varchar(26NOT NULL COMMENT "",
  `s_address` varchar(26NOT NULL COMMENT "",
  `s_city` varchar(11NOT NULL COMMENT "",
  `s_nation` varchar(16NOT NULL COMMENT "",
  `s_region` varchar(13NOT NULL COMMENT "",
  `s_phone` varchar(16NOT NULL COMMENT ""
ENGINE=OLAP
DUPLICATE KEY(`s_suppkey`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`s_suppkey`) BUCKETS 12
PROPERTIES (
"replication_num" = "1",
"colocate_with" = "groupa4",
"in_memory" = "false",
"storage_format" = "DEFAULT"
);
  
CREATE TABLE IF NOT EXISTS `part` (
  `p_partkey` int(11NOT NULL COMMENT "",
  `p_name` varchar(23NOT NULL COMMENT "",
  `p_mfgr` varchar(7NOT NULL COMMENT "",
  `p_category` varchar(8NOT NULL COMMENT "",
  `p_brand` varchar(10NOT NULL COMMENT "",
  `p_color` varchar(12NOT NULL COMMENT "",
  `p_type` varchar(26NOT NULL COMMENT "",
  `p_size` int(11NOT NULL COMMENT "",
  `p_container` varchar(11NOT NULL COMMENT ""
ENGINE=OLAP
DUPLICATE KEY(`p_partkey`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`p_partkey`) BUCKETS 12
PROPERTIES (
"replication_num" = "1",
"colocate_with" = "groupa5",
"in_memory" = "false",
"storage_format" = "DEFAULT"
);
  
CREATE TABLE IF NOT EXISTS `lineorder_flat` (
  `LO_ORDERKEY` int(11NOT NULL COMMENT "",
  `LO_ORDERDATE` date NOT NULL COMMENT "",
  `LO_LINENUMBER` tinyint(4NOT NULL COMMENT "",
  `LO_CUSTKEY` int(11NOT NULL COMMENT "",
  `LO_PARTKEY` int(11NOT NULL COMMENT "",
  `LO_SUPPKEY` int(11NOT NULL COMMENT "",
  `LO_ORDERPRIORITY` varchar(100NOT NULL COMMENT "",
  `LO_SHIPPRIORITY` tinyint(4NOT NULL COMMENT "",
  `LO_QUANTITY` tinyint(4NOT NULL COMMENT "",
  `LO_EXTENDEDPRICE` int(11NOT NULL COMMENT "",
  `LO_ORDTOTALPRICE` int(11NOT NULL COMMENT "",
  `LO_DISCOUNT` tinyint(4NOT NULL COMMENT "",
  `LO_REVENUE` int(11NOT NULL COMMENT "",
  `LO_SUPPLYCOST` int(11NOT NULL COMMENT "",
  `LO_TAX` tinyint(4NOT NULL COMMENT "",
  `LO_COMMITDATE` date NOT NULL COMMENT "",
  `LO_SHIPMODE` varchar(100NOT NULL COMMENT "",
  `C_NAME` varchar(100NOT NULL COMMENT "",
  `C_ADDRESS` varchar(100NOT NULL COMMENT "",
  `C_CITY` varchar(100NOT NULL COMMENT "",
  `C_NATION` varchar(100NOT NULL COMMENT "",
  `C_REGION` varchar(100NOT NULL COMMENT "",
  `C_PHONE` varchar(100NOT NULL COMMENT "",
  `C_MKTSEGMENT` varchar(100NOT NULL COMMENT "",
  `S_NAME` varchar(100NOT NULL COMMENT "",
  `S_ADDRESS` varchar(100NOT NULL COMMENT "",
  `S_CITY` varchar(100NOT NULL COMMENT "",
  `S_NATION` varchar(100NOT NULL COMMENT "",
  `S_REGION` varchar(100NOT NULL COMMENT "",
  `S_PHONE` varchar(100NOT NULL COMMENT "",
  `P_NAME` varchar(100NOT NULL COMMENT "",
  `P_MFGR` varchar(100NOT NULL COMMENT "",
  `P_CATEGORY` varchar(100NOT NULL COMMENT "",
  `P_BRAND` varchar(100NOT NULL COMMENT "",
  `P_COLOR` varchar(100NOT NULL COMMENT "",
  `P_TYPE` varchar(100NOT NULL COMMENT "",
  `P_SIZE` tinyint(4NOT NULL COMMENT "",
  `P_CONTAINER` varchar(100NOT NULL COMMENT ""
ENGINE=OLAP
DUPLICATE KEY(`LO_ORDERKEY`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`LO_ORDERKEY`) BUCKETS 192
PROPERTIES (
"replication_num" = "1",
"colocate_with" = "groupxx1",
"in_memory" = "false",
"storage_format" = "DEFAULT"
);

导入数据

通过stream load

#执行导入数据的脚本`
bin /stream_load.sh data_dir
生成ssb单表数据
bin/flat_insert.sh

查询

单表查询

测试ssb单表查询(SQL 参见 share/ssb_test/sql/ssb-flat/)

bin/benchmark.sh -p -d ssb-flat

查询结果:

image2021-4-16_16-50-49.png
多表查询

测试ssb多表查询 (SQL 参见 share/ssb_test/sql/ssb/)

bin/benchmark.sh -p -d ssb

查询结果

image2021-4-16_17-3-4.png

Clickhouse

下载安装 dbgen

git clone https://github.com/vadimtk/ssb-dbgen.git 

cd ssb-dbgen make

生成数据

./dbgen -s 1000 -T c 
./dbgen -s 1000 -T l 
./dbgen -s 1000 -T p 
./dbgen -s 1000 -T s 
./dbgen -s 1000 -T d

在ClickHouse中创建表

CREATE TABLE test.customer(C_CUSTKEY UInt32,C_NAME String,C_ADDRESS String,C_CITY LowCardinality (String),C_NATION LowCardinality (String),C_REGION LowCardinality (String),C_PHONE String,C_MKTSEGMENT LowCardinality (String))ENGINE = MergeTree ORDER BY (C_CUSTKEY);
CREATE TABLE test.lineorder (LO_ORDERKEY UInt32,LO_LINENUMBER UInt8,LO_CUSTKEY UInt32,LO_PARTKEY UInt32,LO_SUPPKEY UInt32,LO_ORDERDATE Date,LO_ORDERPRIORITY LowCardinality (String),LO_SHIPPRIORITY UInt8,LO_QUANTITY UInt8,LO_EXTENDEDPRICE UInt32,LO_ORDTOTALPRICE UInt32,LO_DISCOUNT UInt8,LO_REVENUE UInt32,LO_SUPPLYCOST UInt32,LO_TAX UInt8,LO_COMMITDATE Date,LO_SHIPMODE LowCardinality (String) ) ENGINE = MergeTree PARTITION BY toYear (LO_ORDERDATE) ORDER BY(LO_ORDERDATE, LO_ORDERKEY);
CREATE TABLE test.part (P_PARTKEY UInt32,P_NAME String,P_MFGR LowCardinality (String),P_CATEGORY LowCardinality (String),P_BRAND LowCardinality (String),P_COLOR LowCardinality (String),P_TYPE LowCardinality (String),P_SIZE UInt8,P_CONTAINER LowCardinality (String) ) ENGINE = MergeTree ORDER BY P_PARTKEY;
CREATE TABLE test.supplier (S_SUPPKEY UInt32,S_NAME String,S_ADDRESS String,S_CITY LowCardinality (String),S_NATION LowCardinality (String),S_REGION LowCardinality (String),S_PHONE StringENGINE = MergeTree ORDER BY S_SUPPKEY;
CREATE TABLE test.date(D_DATEKEY UInt32,D_DATE String,D_DAYOFWEEK String,D_MONTH String,D_YEAR UInt32,D_YEARMONTHNUM UInt32,D_YEARMONTH String,D_DAYNUMINWEEK UInt32,D_DAYNUMINMONTH UInt32,D_DAYNUMINYEAR UInt32,D_MONTHNUMINYEAR UInt32,D_WEEKNUMINYEAR UInt32,D_SELLINGSEASON String,D_LASTDAYINWEEKFL UInt32,D_LASTDAYINMONTHFL UInt32,D_HOLIDAYFL UInt32,D_WEEKDAYFL UInt32) ENGINE = MergeTree ORDER BY D_DATEKEY;

导入数据

clickhouse-client -h prd-worker05 --port=9002 --query "INSERT INTO test.customer FORMAT CSV" < customer.tbl clickhouse-client -h prd-worker05 --port=9002 --query "INSERT INTO test.part FORMAT CSV" < part.tbl clickhouse-client -h prd-worker05 --port=9002 --query "INSERT INTO test.supplier FORMAT CSV" < supplier.tbl clickhouse-client -h prd-worker05 --port=9002 --query "INSERT INTO test.lineorder FORMAT CSV" < lineorder.tbl clickhouse-client -h prd-worker05 --port=9002 --query "INSERT INTO test.dates FORMAT CSV" < date.tbl

将"星型模式"转换为非规范化的"平面模式"

set max_memory_usage_for_all_queries=80000000000; 
set max_memory_usage=80000000000; 
set max_bytes_before_external_group_by=40000000000; 

CREATE TABLE lineorder_flat ENGINE = MergeTree PARTITION BY toYear(LO_ORDERDATE) ORDER BY (LO_ORDERDATE, LO_ORDERKEY) AS SELECT l.LO_ORDERKEY AS LO_ORDERKEY,l.LO_LINENUMBER AS LO_LINENUMBER,l.LO_CUSTKEY AS LO_CUSTKEY,l.LO_PARTKEY AS LO_PARTKEY,l.LO_SUPPKEY AS LO_SUPPKEY,l.LO_ORDERDATE AS LO_ORDERDATE,l.LO_ORDERPRIORITY AS LO_ORDERPRIORITY,l.LO_SHIPPRIORITY AS LO_SHIPPRIORITY,l.LO_QUANTITY AS LO_QUANTITY,l.LO_EXTENDEDPRICE AS LO_EXTENDEDPRICE,l.LO_ORDTOTALPRICE AS LO_ORDTOTALPRICE,l.LO_DISCOUNT AS LO_DISCOUNT,l.LO_REVENUE AS LO_REVENUE,l.LO_SUPPLYCOST AS LO_SUPPLYCOST,l.LO_TAX AS LO_TAX,l.LO_COMMITDATE AS LO_COMMITDATE,l.LO_SHIPMODE AS LO_SHIPMODE,c.C_NAME AS C_NAME,c.C_ADDRESS AS C_ADDRESS,c.C_CITY AS C_CITY,c.C_NATION AS C_NATION,c.C_REGION AS C_REGION,c.C_PHONE AS C_PHONE,c.C_MKTSEGMENT AS C_MKTSEGMENT,s.S_NAME AS S_NAME,s.S_ADDRESS AS S_ADDRESS,s.S_CITY AS S_CITY,s.S_NATION AS S_NATION,s.S_REGION AS S_REGION,s.S_PHONE AS S_PHONE,p.P_NAME AS P_NAME,p.P_MFGR AS P_MFGR,p.P_CATEGORY AS P_CATEGORY,p.P_BRAND AS P_BRAND,p.P_COLOR AS P_COLOR,p.P_TYPE AS P_TYPE,p.P_SIZE AS P_SIZE,p.P_CONTAINER AS P_CONTAINER FROM lineorder AS l INNER JOIN customer AS c ON c.C_CUSTKEY = l.LO_CUSTKEY INNER JOIN supplier AS s ON s.S_SUPPKEY = l.LO_SUPPKEY INNER JOIN part AS p ON p.P_PARTKEY = l.LO_PARTKEY;

查询:

Q1.1

SELECT sum(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue FROM lineorder_flat WHERE toYear(LO_ORDERDATE) = 1993 AND LO_DISCOUNT BETWEEN 1 AND 3 AND LO_QUANTITY < 25;

Q1.2

SELECT sum(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue FROM lineorder_flat WHERE toYYYYMM(LO_ORDERDATE) = 199401 AND LO_DISCOUNT BETWEEN 4 AND 6 AND LO_QUANTITY BETWEEN 26 AND 35;

Q1.3

SELECT sum(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue
FROM lineorder_flat
WHERE toISOWeek(LO_ORDERDATE) = 6 AND toYear(LO_ORDERDATE) = 1994
  AND LO_DISCOUNT BETWEEN 5 AND 7 AND LO_QUANTITY BETWEEN 26 AND 35;

Q2.1

SELECT
   sum(LO_REVENUE),
   toYear(LO_ORDERDATE) AS year,
   P_BRAND
FROM lineorder_flat
WHERE P_CATEGORY = 'MFGR#12' AND S_REGION = 'AMERICA'
GROUP BY
    year,
   P_BRAND
ORDER BY
    year,
   P_BRAND;

Q2.2

SELECT
   sum(LO_REVENUE),
   toYear(LO_ORDERDATE) AS year,
   P_BRAND
FROM lineorder_flat
WHERE P_BRAND >= 'MFGR#2221' AND P_BRAND <= 'MFGR#2228' AND S_REGION = 'ASIA'
GROUP BY
    year,
   P_BRAND
ORDER BY
    year,
   P_BRAND;

Q2.3

SELECT
   sum(LO_REVENUE),
   toYear(LO_ORDERDATE) AS year,
   P_BRAND
FROM lineorder_flat
WHERE P_BRAND = 'MFGR#2239' AND S_REGION = 'EUROPE'
GROUP BY
    year,
   P_BRAND
ORDER BY
    year,
   P_BRAND;

Q3.1

SELECT
   C_NATION,
   S_NATION,
   toYear(LO_ORDERDATE) AS year,
   sum(LO_REVENUE) AS revenue
FROM lineorder_flat
WHERE C_REGION = 'ASIA' AND S_REGION = 'ASIA' AND year >= 1992 AND year <= 1997
GROUP BY
   C_NATION,
   S_NATION,
    year
ORDER BY
    year ASC,
   revenue DESC;

Q3.2

SELECT
   C_CITY,
   S_CITY,
   toYear(LO_ORDERDATE) AS year,
   sum(LO_REVENUE) AS revenue
FROM lineorder_flat
WHERE C_NATION = 'UNITED STATES' AND S_NATION = 'UNITED STATES' AND year >= 1992 AND year <= 1997
GROUP BY
   C_CITY,
   S_CITY,
    year
ORDER BY
    year ASC,
   revenue DESC;

Q3.3

SELECT
   C_CITY,
   S_CITY,
   toYear(LO_ORDERDATE) AS year,
   sum(LO_REVENUE) AS revenue
FROM lineorder_flat
WHERE (C_CITY = 'UNITED KI1' OR C_CITY = 'UNITED KI5') AND (S_CITY = 'UNITED KI1' OR S_CITY = 'UNITED KI5') AND year >= 1992 AND year <= 1997
GROUP BY
   C_CITY,
   S_CITY,
    year
ORDER BY
    year ASC,
   revenue DESC;

Q3.4

SELECT
   C_CITY,
   S_CITY,
   toYear(LO_ORDERDATE) AS year,
   sum(LO_REVENUE) AS revenue
FROM lineorder_flat
WHERE (C_CITY = 'UNITED KI1' OR C_CITY = 'UNITED KI5') AND (S_CITY = 'UNITED KI1' OR S_CITY = 'UNITED KI5') AND toYYYYMM(LO_ORDERDATE) = 199712
GROUP BY
   C_CITY,
   S_CITY,
    year
ORDER BY
    year ASC,
   revenue DESC;

Q4.1

SELECT
   toYear(LO_ORDERDATE) AS year,
   C_NATION,
   sum(LO_REVENUE - LO_SUPPLYCOST) AS profit
FROM lineorder_flat
WHERE C_REGION = 'AMERICA' AND S_REGION = 'AMERICA' AND (P_MFGR = 'MFGR#1' OR P_MFGR = 'MFGR#2')
GROUP BY
    year,
   C_NATION
ORDER BY
    year ASC,
   C_NATION ASC;

Q4.2

SELECT
   toYear(LO_ORDERDATE) AS year,
   S_NATION,
   P_CATEGORY,
   sum(LO_REVENUE - LO_SUPPLYCOST) AS profit
FROM lineorder_flat
WHERE C_REGION = 'AMERICA' AND S_REGION = 'AMERICA' AND (year = 1997 OR year = 1998) AND (P_MFGR = 'MFGR#1' OR P_MFGR = 'MFGR#2')
GROUP BY
    year,
   S_NATION,
   P_CATEGORY
ORDER BY
    year ASC,
   S_NATION ASC,
   P_CATEGORY ASC;

Q4.3

SELECT
   toYear(LO_ORDERDATE) AS year,
   S_CITY,
   P_BRAND,
   sum(LO_REVENUE - LO_SUPPLYCOST) AS profit
FROM lineorder_flat
WHERE S_NATION = 'UNITED STATES' AND (year = 1997 OR year = 1998) AND P_CATEGORY = 'MFGR#14'
GROUP BY
    year,
   S_CITY,
   P_BRAND
ORDER BY
    year ASC,
   S_CITY ASC,
   P_BRAND ASC;

查询结果

单表查询结果
img
多表查询结果


如果你有更多问题
欢迎加入我们的群聊


点个 在看 你最好看

浏览 33
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报