专栏名称: 石杉的架构笔记
专注原创、用心雕琢!十余年BAT一线大厂架构经验倾囊相授
目录
相关文章推荐
人民日报评论  ·  经济大省何以挑大梁 | 人民时评 ·  2 天前  
51好读  ›  专栏  ›  石杉的架构笔记

6亿数据秒级查询,ClickHouse太快了!

石杉的架构笔记  · 公众号  ·  · 2021-04-01 10:04

正文

点击上方蓝色“ 石杉的架构笔记”,选择“设为星标”

回复“PDF”获取独家整理的学习资料!

长按扫描上方二维码 一元购买


ClickHouse 在数据分析技术领域早已声名远扬,最近由于项目需求使用到了 ClickHouse 做分析数据库,于是用测试环境做了一个单表 6 亿数据量的性能测试。



本文记录一下测试结果,有做超大数据量分析技术选型需求的朋友可以参考下。


服务器信息


如下:

  • CPU:Intel Xeon Gold 6240 @ 8x 2.594GHz

  • 内存:32G

  • 系统:CentOS 7.6

  • Linux 内核版本:3.10.0

  • 磁盘类型:机械硬盘

  • 文件系统:ext4


Clickhouse 信息


如下:

  • 部署方式:单机部署

  • 版本:20.8.11.17


测试情况


测试数据和测试方法来自 Clickshouse 官方的 Star Schema Benchmark:

https://clickhouse.tech/docs/en/getting-started/example-datasets/star-schema/

按照官方指导造出了测试数据之后,先看一下数据量和空间占用情况。

①数据量和空间占用


如下图:

可以看到 Clickhouse 的压缩率很高,压缩率都在 50 以上,基本可以达到 70 左右。

数据体积的减小可以非常有效的减少磁盘空间占用、提高 I/O 性能,这对整体查询性能的提升非常有效。


supplier、customer、part、lineorder 为一个简单的「供应商-客户-订单-地区」的星型模型。


lineorder_flat 为根据这个星型模型数据关系合并的大宽表,所有分析都直接在这张大宽表中执行,减少不必要的表关联,符合我们实际工作中的分析建表逻辑。


以下性能测试的所有分析 SQL 都在这张大宽表中运行,未进行表关联查询。


查询性能测试详情


①Query 1.1


SELECT




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

┌────────revenue─┐
│ 44652567249651 │
└────────────────┘

1 rows in set. Elapsed: 0.242 sec. Processed 91.01 million rows728.06 MB (375.91 million rows/s., 3.01 GB/s.)

扫描行数: 91,010,000,大约 9100 万


耗时(秒): 0.242


查询列数: 2


结果行数: 1。


②Query 1.2


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

┌───────revenue─┐
│ 9624332170119 │
└───────────────┘

1 rows in set. Elapsed: 0.040 sec. Processed 7.75 million rows61.96 MB (191.44 million rows/s., 1.53 GB/s.)

扫描行数: 7,750,000,775 万


耗时(秒): 0.040


查询列数: 2


返回行数: 1


③Query 2.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 ASC,
    P_BRAND ASC

┌─sum(LO_REVENUE)─┬─year─┬─P_BRAND───┐
│     64420005618 │ 1992 │ MFGR#121  │
│     63389346096 │ 1992 │ MFGR#1210 │
│     ........... │ .... │ ..........│
│     39679892915 │ 1998 │ MFGR#128  │
│     35300513083 │ 1998 │ MFGR#129  │
└─────────────────┴──────┴───────────┘

280 rows in set. Elapsed: 8.558 sec. Processed 600.04 million rows6.20 GB (70.11 million rows/s., 725.04 MB/s.)

扫描行数: 600,040,000,大约 6 亿


耗时(秒): 8.558


查询列数: 3


结果行数: 280


④Query 2.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 ASC,
    P_BRAND ASC

┌─sum(LO_REVENUE)─┬─year─┬─P_BRAND───┐
│     66450349438 │ 1992 │ MFGR#2221 │
│     65423264312 │ 1992 │ MFGR#2222 │
│     ........... │ .... │ ......... │
│     39907545239 │ 1998 │ MFGR#2227 │
│     40654201840 │ 1998 │ MFGR#2228 │
└─────────────────┴──────┴───────────┘

56 rows in set. Elapsed: 1.242 sec. Processed 600.04 million rows5.60 GB (482.97 million rows/s., 4.51 GB/s.)

扫描行数: 600,040,000,大约 6 亿


耗时(秒): 1.242


查询列数: 3


结果行数: 56


⑤Query 3.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 >= 1992AND (year <= 1997)
GROUP BY 
    C_NATION,
    S_NATION,
    year
ORDER BY 
    year ASC,
    revenue DESC

┌─C_NATION──┬─S_NATION──┬─year─┬──────revenue─┐
│ INDIA     │ INDIA     │ 1992 │ 537778456208 │
│ INDONESIA │ INDIA     │ 1992 │ 536684093041 │
│ .....     │ .......   │ .... │ ............ │
│ CHINA     │ CHINA     │ 1997 │ 525562838002 │
│ JAPAN     │ VIETNAM   │ 1997 │ 525495763677 │
└───────────┴───────────┴──────┴──────────────┘

150 rows in set. Elapsed: 3.533 sec. Processed 546.67 million rows5.48 GB (154.72 million rows/s., 1.55 GB/s.)

扫描行数: 546,670,000,大约 5 亿 4 千多万


耗时(秒): 3.533


查询列数: 4


结果行数: 150


⑥Query 3.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 >= 1992AND (year <= 1997)
GROUP BY 
    C_CITY,
    S_CITY,
    year
ORDER BY 
    year ASC,
    revenue DESC

┌─C_CITY─────┬─S_CITY─────┬─year─┬────revenue─┐
│ UNITED ST6 │ UNITED ST6 │ 1992 │ 5694246807 │
│ UNITED ST0 │ UNITED ST0 │ 1992 │ 5676049026 │
│ .......... │ .......... │ .... │ .......... │
│ UNITED ST9 │ UNITED ST9 │ 1997 │ 4836163349 │
│ UNITED ST9 │ UNITED ST5 │ 1997 │ 4769919410 │
└────────────┴────────────┴──────┴────────────┘

600 rows in set. Elapsed: 1.000 sec. Processed 546.67 million rows5.56 GB (546.59 million rows/s., 5.56 GB/s.)

扫描行数: 546,670,000,大约 5 亿 4 千多万


耗时(秒): 1.00


查询列数: 4


结果行数: 600


⑦Query 4.1


SELECT 
    toYear(LO_ORDERDATE) AS year,
    C_NATION,
    sum(LO_REVENUE - LO_SUPPLYCOST) AS profit
FROM






请到「今天看啥」查看全文