TPC-H (1999)
一个流行的基准测试,它模拟了批发供应商的内部数据仓库。数据以第三范式表示,查询运行时需要大量连接。尽管它已经存在很久,并且假设数据是均匀和独立分布的,这种假设并不现实,但到目前为止,TPC-H 仍然是最流行的 OLAP 基准测试。
参考文献
- TPC-H
- 用于决策支持和网络商务的新 TPC 基准 (Poess et. al., 2000)
- TPC-H 分析:有影响的基准中隐藏的信息和经历的教训 (Boncz et. al.), 2013
- 量化 TPC-H 瓶颈及其优化 (Dresseler et. al.), 2020
数据生成与导入
首先,检出 TPC-H 仓库,并编译数据生成器:
然后,生成数据。参数 -s
指定规模因子。例如,使用 -s 100
,将为表 'lineitem' 生成 6 亿行。
规模因子为 100 时,详细的表大小:
表名 | 行数 | 在 ClickHouse 中的压缩大小 |
---|---|---|
nation | 25 | 2 kB |
region | 5 | 1 kB |
part | 20.000.000 | 895 MB |
supplier | 1.000.000 | 75 MB |
partsupp | 80.000.000 | 4.37 GB |
customer | 15.000.000 | 1.19 GB |
orders | 150.000.000 | 6.15 GB |
lineitem | 600.00.00 | 26.69 GB |
(ClickHouse 中的压缩大小是从 system.tables.total_bytes
获取的,基于以下表定义。)
现在在 ClickHouse 中创建表。
我们尽可能遵循 TPC-H 规范的规则:
- 主键仅为规范第 1.4.2.2 部分中提到的列创建。
- 替换参数已在规范第 2.1.x.4 部分中用查询验证的值替换。
- 根据第 1.4.2.1 部分,表定义不使用可选的
NOT NULL
约束,即使dbgen
默认生成它们。 ClickHouse 中SELECT
查询的性能不受NOT NULL
约束的存在或缺失的影响。 - 根据第 1.3.1 部分,我们使用 ClickHouse 的原生数据类型(例如
Int32
、String
)来实现规范中提到的抽象数据类型(例如Identifier
、Variable text, size N
)。这唯一的效果是可读性更好,由dbgen
生成的 SQL-92 数据类型(例如INTEGER
、VARCHAR(40)
)在 ClickHouse 中也能工作。
数据可以如下导入:
您可以选择从公共 S3 存储桶中导入数据,而不是使用 tpch-kit 并自己生成表。确保首先使用上述 CREATE
语句创建空表。
Queries
Setting join_use_nulls
should be enabled to produce correct results according to SQL standard.
The queries are generated by ./qgen -s <scaling_factor>
. Example queries for s = 100
:
Correctness
The result of the queries agrees with the official results unless mentioned otherwise. To verify, generate a TPC-H database with scale
factor = 1 (dbgen
, see above) and compare with the expected results in tpch-kit.
Q1
Q2
在 v25.5 之前,由于相关子查询,该查询无法开箱即用。相关问题: https://github.com/ClickHouse/ClickHouse/issues/6697
这个替代公式有效,并已验证返回参考结果。
Q3
Q4
在 v25.5 之前,由于相关子查询,该查询无法开箱即用。相关问题: https://github.com/ClickHouse/ClickHouse/issues/6697
这个替代公式有效,并已验证返回参考结果。
Q5
Q6
截至 2025 年 2 月,该查询由于小数加法的错误而无法开箱即用。相关问题: https://github.com/ClickHouse/ClickHouse/issues/70136
这个替代公式有效,并已验证返回参考结果。
Q7
Q8
Q9
Q10
Q11
Q12
Q13
Q14
Q15
Q16
Q17
在 v25.5 之前,由于相关子查询,该查询无法开箱即用。相关问题: https://github.com/ClickHouse/ClickHouse/issues/6697
这个替代公式有效,并已验证返回参考结果。
Q18
Q19
Q20
在 v25.5 之前,由于相关子查询,该查询无法开箱即用。相关问题: https://github.com/ClickHouse/ClickHouse/issues/6697
Q21
在 v25.5 之前,由于相关子查询,该查询无法开箱即用。相关问题: https://github.com/ClickHouse/ClickHouse/issues/6697
Q22
在 v25.5 之前,由于相关子查询,该查询无法开箱即用。相关问题: https://github.com/ClickHouse/ClickHouse/issues/6697