Перейти к основному содержимому
Перейти к основному содержимому

TPC-H (1999)

Популярный бенчмарк, который моделирует внутреннее хранилище данных оптового поставщика. Данные хранятся в представлении 3-й нормальной формы, что требует множества joins во время выполнения запросов. Несмотря на его возраст и нереалистичное предположение о том, что данные распределены равномерно и независимо, TPC-H остается самым популярным бенчмарком OLAP на сегодняшний день.

Ссылки

Генерация данных и импорт

Сначала клонируйте репозиторий TPC-H и скомпилируйте генератор данных:

Затем сгенерируйте данные. Параметр -s указывает коэффициент масштаба. Например, с -s 100 для таблицы 'lineitem' будет сгенерировано 600 миллионов строк.

Подробные размеры таблиц с коэффициентом масштаба 100:

Таблицаразмер (в строках)размер (сжатый в ClickHouse)
nation252 кБ
region51 кБ
part20.000.000895 МБ
supplier1.000.00075 МБ
partsupp80.000.0004.37 ГБ
customer15.000.0001.19 ГБ
orders150.000.0006.15 ГБ
lineitem600.00.0026.69 ГБ

(Сжатые размеры в 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.

Запросы

примечание

Настройка join_use_nulls должна быть включена для получения правильных результатов в соответствии с SQL стандартом.

Запросы генерируются с помощью ./qgen -s <scaling_factor>. Примеры запросов для s = 100:

Корректность

Результаты запросов совпадают с официальными результатами, если не указано иное. Чтобы проверить, создайте базу данных TPC-H с коэффициентом масштаба = 1 (dbgen, см. выше) и сравните с ожидаемыми результатами в 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 года запрос не работает "из коробки" из-за ошибки с добавлением Decimal. Соответствующая проблема: 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