본문으로 바로가기
본문으로 바로가기

TPC-H (1999)

도매 공급업체의 내부 데이터 웨어하우스를 모델링한 대표적인 벤치마크입니다. 데이터는 3차 정규형으로 저장되어, 쿼리를 실행할 때 많은 조인이 필요합니다. 데이터가 균일하고 서로 독립적으로 분포한다는 비현실적인 가정과 제법 오래된 설계임에도 불구하고, TPC-H는 현재까지 가장 널리 사용되는 OLAP 벤치마크입니다.

참고 자료

데이터 생성 및 가져오기

먼저 TPC-H 저장소를 체크아웃한 다음 데이터 생성기를 컴파일합니다.

git clone https://github.com/gregrahn/tpch-kit.git
cd tpch-kit/dbgen
make

그다음 데이터를 생성합니다. 매개변수 -s는 스케일 팩터(scale factor)를 지정합니다. 예를 들어 -s 100을 사용하면 「lineitem」 테이블에는 6억 개의 행이 생성됩니다.

./dbgen -s 100

속도를 높이기 위해 여러 프로세스에서 실행되는 「청크 단위」 생성 방식을 사용할 수 있습니다.

for i in $(seq 1 8); do
    ./dbgen -s 100 -C 8 -S $i &
done
wait

스케일 팩터 100에서의 테이블별 상세 크기:

Tablesize (in rows)size (compressed in 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.000.00026.69 GB

(ClickHouse에서의 압축 크기는 system.tables.total_bytes 값을 기반으로 하며, 아래 테이블 정의를 바탕으로 산출되었습니다.)

이제 ClickHouse에 테이블을 생성합니다. 테이블 정의는 ClickHouse 저장소의 init.sql에서 확인할 수 있습니다.

데이터는 다음과 같이 가져올 수 있습니다:

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.tbl
참고

tpch-kit을 사용하여 직접 테이블을 생성하는 대신, 공개 S3 버킷에서 데이터를 가져와 사용할 수도 있습니다. 먼저 init.sql을 사용하여 비어 있는 테이블을 생성했는지 확인하십시오.

-- Scaling factor 1
INSERT INTO nation SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/h/1/nation.tbl', NOSIGN, CSV) SETTINGS format_csv_delimiter = '|', input_format_defaults_for_omitted_fields = 1, input_format_csv_empty_as_default = 1;
INSERT INTO region SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/h/1/region.tbl', NOSIGN, CSV) SETTINGS format_csv_delimiter = '|', input_format_defaults_for_omitted_fields = 1, input_format_csv_empty_as_default = 1;
INSERT INTO part SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/h/1/part.tbl', NOSIGN, CSV) SETTINGS format_csv_delimiter = '|', input_format_defaults_for_omitted_fields = 1, input_format_csv_empty_as_default = 1;
INSERT INTO supplier SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/h/1/supplier.tbl', NOSIGN, CSV) SETTINGS format_csv_delimiter = '|', input_format_defaults_for_omitted_fields = 1, input_format_csv_empty_as_default = 1;
INSERT INTO partsupp SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/h/1/partsupp.tbl', NOSIGN, CSV) SETTINGS format_csv_delimiter = '|', input_format_defaults_for_omitted_fields = 1, input_format_csv_empty_as_default = 1;
INSERT INTO customer SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/h/1/customer.tbl', NOSIGN, CSV) SETTINGS format_csv_delimiter = '|', input_format_defaults_for_omitted_fields = 1, input_format_csv_empty_as_default = 1;
INSERT INTO orders SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/h/1/orders.tbl', NOSIGN, CSV) SETTINGS format_csv_delimiter = '|', input_format_defaults_for_omitted_fields = 1, input_format_csv_empty_as_default = 1;
INSERT INTO lineitem SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/h/1/lineitem.tbl', NOSIGN, CSV) SETTINGS format_csv_delimiter = '|', input_format_defaults_for_omitted_fields = 1, input_format_csv_empty_as_default = 1;

-- Scaling factor 100
INSERT INTO nation SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/h/100/nation.tbl.gz', NOSIGN, CSV) SETTINGS format_csv_delimiter = '|', input_format_defaults_for_omitted_fields = 1, input_format_csv_empty_as_default = 1;
INSERT INTO region SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/h/100/region.tbl.gz', NOSIGN, CSV) SETTINGS format_csv_delimiter = '|', input_format_defaults_for_omitted_fields = 1, input_format_csv_empty_as_default = 1;
INSERT INTO part SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/h/100/part.tbl.gz', NOSIGN, CSV) SETTINGS format_csv_delimiter = '|', input_format_defaults_for_omitted_fields = 1, input_format_csv_empty_as_default = 1;
INSERT INTO supplier SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/h/100/supplier.tbl.gz', NOSIGN, CSV) SETTINGS format_csv_delimiter = '|', input_format_defaults_for_omitted_fields = 1, input_format_csv_empty_as_default = 1;
INSERT INTO partsupp SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/h/100/partsupp.tbl.gz', NOSIGN, CSV) SETTINGS format_csv_delimiter = '|', input_format_defaults_for_omitted_fields = 1, input_format_csv_empty_as_default = 1;
INSERT INTO customer SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/h/100/customer.tbl.gz', NOSIGN, CSV) SETTINGS format_csv_delimiter = '|', input_format_defaults_for_omitted_fields = 1, input_format_csv_empty_as_default = 1;
INSERT INTO orders SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/h/100/orders.tbl.gz', NOSIGN, CSV) SETTINGS format_csv_delimiter = '|', input_format_defaults_for_omitted_fields = 1, input_format_csv_empty_as_default = 1;
INSERT INTO lineitem SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/h/100/lineitem.tbl.gz', NOSIGN, CSV) SETTINGS format_csv_delimiter = '|', input_format_defaults_for_omitted_fields = 1, input_format_csv_empty_as_default = 1;

쿼리

22개의 TPC-H 쿼리는 ClickHouse 리포지터리의 여기에서 확인할 수 있습니다.

SQL 표준과 호환되는 동작과 기대한 결과를 얻으려면 settings.json에 정의된 설정을 적용하십시오. 알려진 이슈와 특정 쿼리에 대한 참고 사항은 README를 참조하십시오.

정확성(Correctness)

별도로 언급하지 않는 한 쿼리 결과는 공식 결과와 일치합니다. 이를 검증하려면 스케일 팩터(scale factor)가 1인 TPC-H 데이터베이스를 dbgen(위 참조)으로 생성한 후 tpch-kit의 예상 결과와 비교하십시오.