A popular benchmark which models the internal data warehouse of a wholesale supplier. The data is stored into a 3rd normal form representation, requiring lots of joins at query runtime. Despite its age and its unrealistic assumption that the data is uniformly and independently distributed, TPC-H remains the most popular OLAP benchmark to date.
References
- TPC-H
- New TPC Benchmarks for Decision Support and Web Commerce (Poess et. al., 2000)
- TPC-H Analyzed: Hidden Messages and Lessons Learned from an Influential Benchmark (Boncz et. al.), 2013
- Quantifying TPC-H Choke Points and Their Optimizations (Dresseler et. al.), 2020
Data Generation and Import
First, checkout the TPC-H repository and compile the data generator:
git clone https://github.com/gregrahn/tpch-kit.git
cd tpch-kit/dbgen
makeThen, generate the data. Parameter -s specifies the scale factor. For example, with -s 100, 600 million rows are generated for table ‘lineitem’.
./dbgen -s 100To speed things up, you can use “chunked” generation (in multiple processes):
for i in $(seq 1 8); do
./dbgen -s 100 -C 8 -S $i &
done
waitDetailed table sizes with scale factor 100:
| Table | size (in rows) | size (compressed in 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.000.000 | 26.69 GB |
(Compressed sizes in ClickHouse are taken from system.tables.total_bytes and based on below table definitions.)
Now create tables in ClickHouse. The table definitions are available in init.sql in the ClickHouse repository.
The data can be imported as follows:
clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO nation FORMAT CSV" < nation.tbl
clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO region FORMAT CSV" < region.tbl
clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO part FORMAT CSV" < part.tbl
clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO supplier FORMAT CSV" < supplier.tbl
clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO partsupp FORMAT CSV" < partsupp.tbl
clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO customer FORMAT CSV" < customer.tbl
clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO orders FORMAT CSV" < orders.tbl
clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO lineitem FORMAT CSV" < lineitem.tblQueries
The 22 TPC-H queries can be found here in the ClickHouse repository.
To get SQL standard compatible behavior and expected results, apply the settings from settings.json. See the README for known issues and notes on specific queries.
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.
Performance benchmark
ClickHouse tracks TPC-H query performance across every released version. You can explore run times for all 22 TPC-H queries (scale factor 40) on the ClickHouse versions benchmark page to see how performance has evolved over time.