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' 表生成 600 百万行数据。
缩放因子为 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
语句创建空表。
查询
设置 join_use_nulls
应该启用,以根据 SQL 标准生成正确的结果。
这些查询由 ./qgen -s <scaling_factor>
生成。缩放因子 s = 100
的示例查询:
正确性
查询的结果与官方结果一致,除非另有说明。要验证,请生成缩放因子为 1 的 TPC-H 数据库(使用 dbgen
,见上文)并与 tpch-kit 中的期望结果 进行比较。
Q1
Q2
截至2025年2月,由于相关子查询,查询无法直接运行。相应问题: https://github.com/ClickHouse/ClickHouse/issues/6697
以下替代实现可行,并已验证返回参考结果。
Q3
Q4
截至2025年2月,由于相关子查询,查询无法直接运行。相应问题: https://github.com/ClickHouse/ClickHouse/issues/6697
以下替代实现可行,并已验证返回参考结果。
Q5
Q6
截至2025年2月,由于 Decimal 加法的错误,查询无法直接运行。相应问题: https://github.com/ClickHouse/ClickHouse/issues/70136
以下替代实现可行,并已验证返回参考结果。
Q7
Q8
Q9
Q10
Q11
Q12
Q13
Q14
Q15
Q16
Q17
截至2025年2月,由于相关子查询,查询无法直接运行。相应问题: https://github.com/ClickHouse/ClickHouse/issues/6697
以下替代实现可行,并已验证返回参考结果。
Q18
Q19
Q20
截至2025年2月,由于相关子查询,查询无法直接运行。相应问题: https://github.com/ClickHouse/ClickHouse/issues/6697
Q21
截至2025年2月,由于相关子查询,查询无法直接运行。相应问题: https://github.com/ClickHouse/ClickHouse/issues/6697
Q22
截至2025年2月,由于相关子查询,查询无法直接运行。相应问题: https://github.com/ClickHouse/ClickHouse/issues/6697