TPC-H (1999)
Популярный бенчмарк, моделирующий внутреннее хранилище данных оптового поставщика. Данные хранятся в виде схемы в третьей нормальной форме, что требует большого количества соединений (JOIN) при выполнении запросов. Несмотря на возраст и нереалистичное предположение о равномерном и независимом распределении данных, TPC-H по-прежнему остается самым популярным OLAP-бенчмарком на сегодняшний день.
Ссылки
- 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
Генерация и импорт данных
Сначала клонируйте репозиторий TPC-H и скомпилируйте генератор данных:
Затем сгенерируйте данные. Параметр -s задаёт коэффициент масштабирования. Например, при -s 100 для таблицы 'lineitem' будет сгенерировано 600 миллионов строк.
Подробные размеры таблиц при коэффициенте масштабирования 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 |
(Сжатые размеры в ClickHouse получены из system.tables.total_bytes и соответствуют приведённым ниже определениям таблиц.)
Теперь создадим таблицы в ClickHouse.
Мы придерживаемся правил спецификации TPC-H настолько строго, насколько это возможно:
- Первичные ключи создаются только для столбцов, указанных в разделе 1.4.2.2 спецификации.
- Параметры подстановки заменены значениями для проверки запросов в разделах 2.1.x.4 спецификации.
- В соответствии с разделом 1.4.2.1 определения таблиц не используют необязательные ограничения
NOT NULL, даже еслиdbgenгенерирует их по умолчанию. Производительность запросовSELECTв ClickHouse не зависит от наличия или отсутствия ограниченийNOT NULL. - В соответствии с разделом 1.3.1 мы используем собственные типы данных ClickHouse (например,
Int32,String) для реализации абстрактных типов данных, указанных в спецификации (например,Identifier,Variable text, size N). Единственный эффект этого — лучшая читаемость; типы данных SQL-92, генерируемыеdbgen(например,INTEGER,VARCHAR(40)), также будут работать в ClickHouse.
Данные можно импортировать следующим образом:
Вместо использования tpch-kit и самостоятельной генерации таблиц вы можете импортировать данные из общедоступного бакета S3. Перед этим обязательно
создайте пустые таблицы, используя приведённые выше операторы CREATE.
Запросы
Для получения корректных результатов в соответствии со стандартом SQL необходимо включить настройку join_use_nulls.
Некоторые запросы TPC-H используют коррелированные подзапросы, которые доступны начиная с v25.8. Пожалуйста, используйте версию ClickHouse не ниже этой для запуска запросов.
В версиях ClickHouse 25.5, 25.6, 25.7 необходимо дополнительно задать:
Запросы генерируются командой ./qgen -s <scaling_factor>. Примеры запросов для s = 100 приведены ниже:
Корректность
Результаты запросов совпадают с официальными результатами, если не указано иное. Чтобы проверить корректность, сгенерируйте базу данных TPC-H с коэффициентом масштабирования = 1 (dbgen, см. выше) и сравните её с ожидаемыми результатами в tpch-kit.
Q1
Q2
Q3
4 кв.
Q5
Вопрос 6
По состоянию на февраль 2025 года этот запрос не работает «из коробки» из‑за ошибки при сложении значений типа Decimal. Соответствующая проблема: https://github.com/ClickHouse/ClickHouse/issues/70136
Эта альтернативная формулировка запроса работает; проверено, что она возвращает эталонные результаты.
Вопрос 7
Q8
Q9
Q10
Q11
Q12
Q13
Q14
Q15
Q16
Q17
Q18
Q19
Q20
Q21
Вопрос 22