Clickhouse性能测试

一、数据导入性能测试

文件名称

文件大小

数据量大小

导入花费时间

表空间大小

customer.tbl

317M

300W27s114M

lineorder.tbl

66G

6亿1h25m16s16.7G

part.tbl

135M

140W7s24M

supplier.tbl

19M

20W

1s7.5M

建表语句:

1)主表

CREATE TABLE tutorial.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);

2)特征表

CREATE TABLE tutorial.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);

3)特征表

CREATE TABLE tutorial.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;

4)特征表

CREATE TABLE tutorial.supplier
(
S_SUPPKEY UInt32,
S_NAME String,
S_ADDRESS String,
S_CITY LowCardinality(String),
S_NATION LowCardinality(String),
S_REGION LowCardinality(String),
S_PHONE String
)
ENGINE = MergeTree ORDER BY S_SUPPKEY;

二、运行测试

1、基础测试

1)简单聚合 + 条件筛选

编号

执行sql

首次执行时间

平均执行时间

1

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

715ms390ms
2

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

84ms64ms
3

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

52ms40ms

2)简单聚合 + 条件筛选 + group by + order by

    

编号

执行sql

首次执行时间

平均执行时间

1

SELECT sum(LO_REVENUE), toYear(LO_ORDERDATE) AS year
FROM tutorial.lineorder
WHERE LO_ORDERPRIORITY = '3-MEDIUM'
GROUP BY year
ORDER BY year;

3.48s1.706s
2

SELECT sum(LO_REVENUE), toYear(LO_ORDERDATE) AS year,LO_ORDERPRIORITY
FROM tutorial.lineorder
WHERE LO_SHIPMODE = 'SHIP' or LO_SHIPMODE = 'AIR'
GROUP BY year,LO_ORDERPRIORITY 
ORDER BY year;

5.59s4.740s
3

SELECT sum(LO_EXTENDEDPRICE * LO_DISCOUNT),sum(LO_REVENUE), toYear(LO_ORDERDATE) AS year,LO_ORDERPRIORITY
FROM tutorial.lineorder
WHERE LO_SHIPMODE = 'SHIP' or LO_SHIPMODE = 'AIR'
AND toYear(LO_ORDERDATE) < '1996'
GROUP BY year,LO_ORDERPRIORITY 
ORDER BY year desc,LO_ORDERPRIORITY asc;

6.834s5.943s

3)多表join + 简单聚合 + 条件筛选

编号执行sql首次执行时间平均执行时间
1SELECT sum(l.LO_EXTENDEDPRICE * l.LO_DISCOUNT) AS revenue
FROM tutorial.lineorder l
left join tutorial.part p
on l.LO_PARTKEY = p.P_PARTKEY 
WHERE toYear(l.LO_ORDERDATE) = 1993 
AND l.LO_DISCOUNT BETWEEN 1 AND 3 
AND l.LO_QUANTITY < 25
AND p.P_BRAND BETWEEN 'MFGR#2221' AND 'MFGR#2228';
2.943s2.595s
2SELECT sum(l.LO_EXTENDEDPRICE * l.LO_DISCOUNT) AS revenue
FROM tutorial.lineorder l 
left join tutorial.customer c
on c.C_CUSTKEY = l.LO_CUSTKEY
WHERE toYYYYMM(l.LO_ORDERDATE) = 199401 
AND l.LO_DISCOUNT BETWEEN 4 AND 6 
AND l.LO_QUANTITY BETWEEN 26 AND 35
AND c.C_REGION = 'AMERICA';
1.80s868ms
3SELECT sum(l.LO_EXTENDEDPRICE * l.LO_DISCOUNT) AS revenue
FROM tutorial.lineorder l
left join tutorial.supplier s
on l.LO_SUPPKEY = s.S_SUPPKEY
left join tutorial.part p
on l.LO_PARTKEY = p.P_PARTKEY 
left join tutorial.customer c
on l.LO_CUSTKEY = c.C_CUSTKEY
WHERE toISOWeek(l.LO_ORDERDATE) = 6 
AND toYear(l.LO_ORDERDATE) = 1994 
AND l.LO_DISCOUNT BETWEEN 5 AND 7 
AND l.LO_QUANTITY BETWEEN 26 AND 35
AND p.P_BRAND BETWEEN 'MFGR#2221' AND 'MFGR#2228'
AND c.C_REGION = 'AMERICA'
and s.S_NATION = 'UNITED KINGDOM';
1.48s890ms

4)多表join + 简单聚合 + 脚尖筛选 + group by + order by

编号执行sql首次执行时间平均执行时间
1SELECT sum(l.LO_REVENUE), toYear(l.LO_ORDERDATE) AS year, p.P_BRAND
FROM tutorial.lineorder l
left join tutorial.supplier s
on l.LO_SUPPKEY = s.S_SUPPKEY
left join tutorial.part p
on l.LO_PARTKEY = p.P_PARTKEY 
WHERE p.P_CATEGORY = 'MFGR#12' 
AND s.S_REGION = 'AMERICA' 
GROUP BY toYear(l.LO_ORDERDATE), p.P_BRAND 
ORDER BY toYear(l.LO_ORDERDATE), p.P_BRAND;
56.34s56s
2SELECT sum(l.LO_REVENUE), toYear(l.LO_ORDERDATE) AS year, p.P_BRAND 
FROM tutorial.lineorder l
left join tutorial.supplier s
on l.LO_SUPPKEY = s.S_SUPPKEY
left join tutorial.part p
on l.LO_PARTKEY= p.P_PARTKEY 
WHERE p.P_BRAND BETWEEN 'MFGR#2221' AND 'MFGR#2228' 
AND s.S_REGION = 'ASIA'
GROUP BY toYear(l.LO_ORDERDATE), p.P_BRAND 
ORDER BY toYear(l.LO_ORDERDATE), p.P_BRAND;
42.637s41.95s
3

SELECT sum(l.LO_REVENUE), toYear(l.LO_ORDERDATE) AS year, p.P_BRAND 
FROM tutorial.lineorder l 
left join tutorial.part p
on l.LO_PARTKEY = p.P_PARTKEY
left join tutorial.supplier s
on l.LO_SUPPKEY = s.S_SUPPKEY
WHERE p.P_BRAND = 'MFGR#2239' AND s.S_REGION = 'EUROPE' 
GROUP BY toYear(l.LO_ORDERDATE), p.P_BRAND 
ORDER BY toYear(l.LO_ORDERDATE), p.P_BRAND;

41.7s41.645s

2、BitMap测试

bitMap表设计结构:

序号字段英文名字段中文名字段类型示例
1LO_ORDERPRIORITY订单优先级LowCardinality(String) 
2LO_ORDERDATE订单日期date1993-01-01
3order_nbr_bmporder_nbr_bmpbitmap 

建表语句:

CREATE TABLE if not exists tutorial.lineorder_bmp(
LO_ORDERPRIORITY LowCardinality(String),
LO_ORDERDATE date,
ORDERKEY_BMP AggregateFunction(groupBitmap,UInt64)
)
ENGINE=AggregatingMergeTree()
partition by LO_ORDERPRIORITY
order by LO_ORDERDATE;

导入数据:

INSERT INTO tutorial.lineorder_bmp
SELECT
LO_ORDERPRIORITY,
LO_ORDERDATE,
groupBitmapState(toUInt64(ORDERKEY_BMP))
from (
select l.LO_ORDERPRIORITY,l.LO_ORDERDATE, l.LO_ORDERKEY as ORDERKEY_BMP
from tutorial.lineorder l
)
group by LO_ORDERPRIORITY,LO_ORDERDATE

测试案例一:统计每一天的每个订单优先级的订单数

序号执行sql首次消耗时间平均消耗时间
1

select lb.LO_ORDERDATE ,lb.LO_ORDERPRIORITY ,bitmapCardinality(lb.ORDERKEY_BMP)
from tutorial.lineorder_bmp lb
order by LO_ORDERDATE ,LO_ORDERPRIORITY

2.9s2.9s

测试案例二:求取1993-01-01和1993-01-02两日订单优先级最高的商品数增长百分比

序号执行sql首次消耗时间平均消耗时间
1

select (c1-c0)/c1
from (
select bitmapCardinality(
(select lb1.ORDERKEY_BMP from tutorial.lineorder_bmp lb1 where lb1.LO_ORDERDATE = '1993-01-01' and lb1.LO_ORDERPRIORITY = '1-URGENT')
) as c0,
bitmapCardinality(
(select lb2.ORDERKEY_BMP from tutorial.lineorder_bmp lb2 where lb2.LO_ORDERDATE = '1993-01-02' and lb2.LO_ORDERPRIORITY = '1-URGENT')
) as c1
)

3.328s2.7s
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sileiH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值