跳到主要内容
跳到主要内容

TPC-H (1999)

一个流行的基准,模拟了批发供应商的内部数据仓库。数据以第三范式形式存储,要求在查询运行时进行大量连接。尽管它的年代较久,且基于不切实际的假设(数据均匀且独立分布),但TPC-H 仍然是迄今为止最流行的OLAP基准。

参考文献

数据生成与导入

首先,克隆 TPC-H 仓库并编译数据生成器:

然后,生成数据。参数 -s 指定缩放因子。例如,使用 -s 100,为 'lineitem' 表生成 600 百万行数据。

缩放因子为 100 的详细表大小:

表名行数ClickHouse 中的压缩大小
nation252 kB
region51 kB
part20.000.000895 MB
supplier1.000.00075 MB
partsupp80.000.0004.37 GB
customer15.000.0001.19 GB
orders150.000.0006.15 GB
lineitem600.00.0026.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 的本地数据类型(例如 Int32String)来实现规范中提到的抽象数据类型(例如 IdentifierVariable text, size N)。这样做的唯一效果是可读性更佳,由 dbgen 生成的 SQL-92 数据类型(例如 INTEGERVARCHAR(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