clickhouse单机读写性能测试(附带运行截图)
使用版本

20.10.3.30
云主机配置

数据及操作来源
https://clickhouse.tech/docs/zh/getting-started/example-datasets/star-schema/
表类型及数据量
| 表名 | 表结构 | 表定义语句 | 表数据量 |
|---|---|---|---|
| customer | ![]() | CREATE TABLE 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); | 30000000
|
| lineorder | ![]() | CREATE TABLE 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); |
导数据的时候磁盘不够了,所以只导了 4085911421条数据。 其他表导入的时间都基本可以算秒级完成的,这个表的导入时间为: Thu Nov 12 14:32:24 CST 2020 用时1小时6分钟 |
| part | ![]() | CREATE TABLE 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; | 2百万
|
| supplier | ![]() | CREATE TABLE 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; | 2百万
|
创建一个新的联合表,数据从已有的表中获取:
| 表定义语句 | 创建时使用nmon | 创建时间 | 处理行数 | 读磁盘速度 | 最后大小 |
|---|---|---|---|---|---|
| CREATE TABLE lineorder_flat\ ENGINE = MergeTree\ PARTITION BY toYear(l.LO_ORDERDATE)\ ORDER BY (l.LO_ORDERDATE, l.LO_ORDERKEY) AS\ SELECT\ l.*,\ c.*,\ s.*,\ p.*\ FROM lineorder AS l\ ANY INNER JOIN customer AS c ON c.C_CUSTKEY = l.LO_CUSTKEY\ ANY INNER JOIN supplier AS s ON s.S_SUPPKEY = l.LO_SUPPKEY\ ANY INNER JOIN part AS p ON p.P_PARTKEY = l.LO_PARTKEY; |
对磁盘吞吐和cpu占用非常高,吞吐来说大部分时间是全部占用的 | 452.055 sec | 4.12 billion rows, 178.49 GB | 9.11 million rows/s., 394.83 MB/s | 1065161行 188.85M |

在表中查到的数据大小和直接用ll -lh查到的不太一样:

查询SQL语句及执行时间
| sql语句 | 查询时间 | 处理行数 | 读磁盘速度 | 截图 |
|---|---|---|---|---|
| 1.832 sec | 619.86 million rows 4.96 GB | 338.31 million rows/s., 2.71 GB/s. |
|
|
| 0.261 sec | 52.70 million rows 421.51 MB | 202.10 million rows/s., 1.62 GB/s. |
|
|
| 0.357 sec | 12.06 million rows 96.48 MB | 33.83 million rows/s., 270.56 MB/s. |
|
| (三表联合查询) SELECT sum(l.LO_REVENUE), toYear(l.LO_ORDERDATE) AS year, P_BRAND \ | 225.177 sec | 4.09 billion rows 57.23 GB | 18.16 million rows/s., 254.14 MB/s |
|
| (四表联合查询) SELECT toYear(l.LO_ORDERDATE) AS year, \ sum(l.LO_REVENUE - l.LO_SUPPLYCOST) AS profit \ | 61.644 sec | 1.02 billion rows, 21.81 GB | 16.50 million rows/s., 353.76 MB/s |
|
| (四表联合查询,inner join调换顺序) SELECT toYear(l.LO_ORDERDATE) AS year, sum(l.LO_REVENUE - l.LO_SUPPLYCOST) AS profit \ | 72.457 sec | 1.02 billion rows, 21.81 GB | 14.04 million rows/s., 300.97 MB/s |
|
| (四表联合查询,inner join调换顺序) SELECT toYear(l.LO_ORDERDATE) AS year, sum(l.LO_REVENUE - l.LO_SUPPLYCOST) AS profit \ | 超内存,运行错误 | 超内存,运行错误 | 超内存,运行错误 |
|
可以看出,clickhouse并不会更改语句的执行顺序,做到优化,且在多表联合查询的测试下,比单表要慢一个档次。
更多推荐
















所有评论(0)