TPC-DS 는 의사결정 지원 시스템(데이터 웨어하우스)의 성능을 재는 벤치마크다. 매장 · 카탈로그 · 인터넷 세 판매 채널을 가진 소매업체를 모델로 하며, 대용량 데이터에 대한 복잡한 분석 쿼리와 데이터 유지보수(적재 · 갱신)를 한 워크로드로 묶는다.[1] 현행 규격과 도구는 4.0.0 이다.[2]
정식 결과 공표가 목적이 아니라도, 도구가 만드는 데이터와 99개 쿼리가 Hive · Trino · Spark 같은 SQL 엔진의 성능 비교에 널리 쓰인다.
스노플레이크 스키마다. 판매 채널마다 판매 · 반품 사실 테이블 한 쌍씩과 재고 사실 테이블 하나를 합쳐 사실 테이블 7개, 모든 채널이 함께 쓰는 차원 테이블 17개, 합쳐서 24개 테이블이다.[1:1]
| 구분 | 테이블 |
|---|---|
| 사실 (7) | store_sales · store_returns · catalog_sales · catalog_returns · web_sales · web_returns · inventory |
| 차원 (17) | date_dim · time_dim · item · customer · customer_address · customer_demographics · household_demographics · income_band · store · promotion · warehouse · ship_mode · reason · call_center · catalog_page · web_site · web_page |
쿼리는 99개 템플릿으로 정의되고, 도구 dsqgen 이 템플릿에 난수 파라미터를 넣어 실행 가능한 SQL 로 만든다.[1:2]
스케일 팩터(SF)는 데이터 웨어하우스에 들어가는 데이터 크기를 GB 단위로 어림한 값이다. 정식 결과에 쓸 수 있는 값은 다음 다섯 가지뿐이고, 서로 다른 SF 의 결과는 비교하지 않는다.[1:3]
| 스케일 팩터 | SF |
|---|---|
| 1 TB | 1000 |
| 3 TB | 3000 |
| 10 TB | 10000 |
| 30 TB | 30000 |
| 100 TB | 100000 |
규격 검증용 데이터베이스는 SF 1(1 GB)로 만든다. dsdgen 은 그 밖의 값도 만들어 주지만 "결과 공표에 유효하지 않다"는 경고를 찍는다. 내부 비교용으로는 1 · 10 · 100 같은 작은 값으로 시작하면 된다.
현행 규격 페이지에서 TPC-DS 의 Tools 를 따라가 신청 양식을 채우면 다운로드 링크가 이메일로 온다.[3] 받은 zip 의 구성은 다음과 같다.[1:4]
| 경로 | 내용 |
|---|---|
tools/ |
dsdgen · dsqgen 소스와 makefile, DDL(tpcds.sql · tpcds_ri.sql · tpcds_source.sql) |
query_templates/ |
99개 쿼리 템플릿(query1.tpl …)과 DBMS 방언 파일(ansi.tpl · db2.tpl · netezza.tpl · oracle.tpl · sqlserver.tpl) |
query_variants/ |
대체 쿼리 템플릿 |
answer_sets/ |
초기 적재 검증용 답안 |
data_maintenance/ |
데이터 유지보수 단계용 SQL |
specification.pdf |
규격 문서 |
GitHub 에 v2.x 도구를 리눅스 · macOS 에서 바로 빌드되게 손본 비공식 미러(gregrahn/tpcds-kit)가 있다.[4] 현행 4.0.0 과는 버전이 다르므로 규격 대조가 필요하면 공식 도구를 쓴다.
gcc · make 가 필요하다. tools/ 에서 OS 를 지정해 빌드하면 dsdgen 과 dsqgen 이 생긴다.
unzip TPC-DS-Tool.zip
cd DSGen-software-code-*/tools
make OS=LINUX
ls -l dsdgen dsqgen
출력 디렉터리는 미리 만들어 둔다. tools/ 밖에서 실행할 때는 -DISTRIBUTIONS 로 tpcds.idx 위치를 알려 준다.[4:1]
mkdir -p /data/tpcds/sf1
./dsdgen -SCALE 1 -DIR /data/tpcds/sf1 -TERMINATE N -FORCE Y
| 옵션 | 뜻 |
|---|---|
-SCALE n |
스케일 팩터(GB) |
-DIR path |
출력 디렉터리 |
-TERMINATE N |
각 줄 끝의 구분자 \| 를 붙이지 않는다. 기본값 Y 는 줄 끝에도 \| 가 붙어 적재 도구가 빈 열 하나를 더 읽는다 |
-FORCE Y |
기존 파일을 묻지 않고 덮어쓴다 |
-PARALLEL n · -CHILD i |
전체를 n 조각으로 나눠 i 번째 조각만 만든다. 큰 SF 를 여러 프로세스 · 여러 노드에서 나눠 만들 때 쓴다 |
-DISTRIBUTIONS file |
tpcds.idx 경로 |
-VALIDATE Y |
규격 검증용 참조 데이터를 만든다 |
병렬로 만들 때는 -CHILD 를 1 부터 n 까지 바꿔 가며 각각 실행한다.
for i in $(seq 1 8); do
./dsdgen -SCALE 100 -DIR /data/tpcds/sf100 -PARALLEL 8 -CHILD $i -TERMINATE N -FORCE Y &
done
wait
결과는 테이블마다 <table>.dat(병렬이면 <table>_<i>_<n>.dat) 이고, 필드는 | 로 구분된다. 빈 필드는 NULL 로 다뤄야 한다.[1:5] 문자열에는 라틴 확장 문자가 섞이므로 적재 시 인코딩을 ISO-8859-1 로 읽거나 미리 UTF-8 로 바꾼다.
템플릿 디렉터리 · 템플릿 목록 · 방언 · 스케일을 주면 99개 쿼리를 만든다.[4:2]
mkdir -p /data/tpcds/queries
./dsqgen \
-DIRECTORY ../query_templates \
-INPUT ../query_templates/templates.lst \
-VERBOSE Y \
-QUALIFY Y \
-SCALE 1 \
-DIALECT netezza \
-OUTPUT_DIR /data/tpcds/queries
| 옵션 | 뜻 |
|---|---|
-DIRECTORY |
템플릿 디렉터리 |
-INPUT |
만들 템플릿 목록. templates.lst 가 99개 전부다 |
-DIALECT |
방언 파일 이름. ansi · db2 · netezza · oracle · sqlserver 중 하나. Hive · Trino · Spark 는 netezza 나 ansi 로 만든 뒤 손본다 |
-SCALE |
파라미터 치환에 쓰는 스케일 팩터 |
-QUALIFY Y |
규격 검증용 고정 파라미터로 번호 순서대로 만든다 |
-OUTPUT_DIR |
출력 디렉터리. 기본은 모든 쿼리를 query_0.sql 한 파일에 이어 붙인다 |
-RNGSEED n |
난수 시드. 같은 시드면 같은 파라미터가 나온다 |
-STREAMS n |
동시 실행 스트림 수만큼 쿼리 세트를 만든다 |
템플릿 하나만 만들려면 -TEMPLATE query1.tpl 을 준다. 방언 파일에는 define __LIMITA, __LIMITB, __LIMITC 같은 매크로가 있어 LIMIT · TOP · FETCH FIRST 표현을 DBMS 에 맞춘다. 새 엔진을 쓰려면 방언 파일을 하나 복사해 고친다.
DDL 은 tools/tpcds.sql(테이블) 과 tpcds_ri.sql(참조 무결성) 을 쓴다. -TERMINATE N 으로 만든 파일을 PostgreSQL 에 넣는 예다.
\i tools/tpcds.sql
\copy store_sales from '/data/tpcds/sf1/store_sales.dat' with (format csv, delimiter '|', null '', encoding 'LATIN1')
Hive 는 외부 테이블로 잡아 읽는다.
CREATE EXTERNAL TABLE store_sales_text (
ss_sold_date_sk INT, ss_sold_time_sk INT, ss_item_sk INT, ss_customer_sk INT,
ss_cdemo_sk INT, ss_hdemo_sk INT, ss_addr_sk INT, ss_store_sk INT, ss_promo_sk INT,
ss_ticket_number BIGINT, ss_quantity INT, ss_wholesale_cost DECIMAL(7,2),
ss_list_price DECIMAL(7,2), ss_sales_price DECIMAL(7,2), ss_ext_discount_amt DECIMAL(7,2),
ss_ext_sales_price DECIMAL(7,2), ss_ext_wholesale_cost DECIMAL(7,2), ss_ext_list_price DECIMAL(7,2),
ss_ext_tax DECIMAL(7,2), ss_coupon_amt DECIMAL(7,2), ss_net_paid DECIMAL(7,2),
ss_net_paid_inc_tax DECIMAL(7,2), ss_net_profit DECIMAL(7,2)
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'
STORED AS TEXTFILE
LOCATION '/data/tpcds/sf1/store_sales';
텍스트 테이블을 ORC · Parquet 테이블로 한 번 옮긴 뒤 쿼리를 돌려야 엔진 성능이 제대로 나온다. Trino 는 tpcds 커넥터가 같은 스키마를 내장하고 있어 파일 생성 없이 tpcds.sf1 같은 스키마를 바로 조회할 수 있다 — Trino 참고.
TPC Benchmark DS Standard Specification v4.0.0 — 2026-09-20 확인. https://www.tpc.org/tpc_documents_current_versions/pdf/tpc-ds_v4.0.0.pdf ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
최신 버전 규격 · 도구 4.0.0 — 2026-09-20 확인. https://www.tpc.org/tpc_documents_current_versions/current_specifications5.asp ↩︎
TPC Tools Download Request (TPC-DS 4.0.0). https://www.tpc.org/tpc_documents_current_versions/download_programs/tools-download-request5.asp?bm_type=TPC-DS&bm_vers=4.0.0&mode=CURRENT-ONLY ↩︎
gregrahn/tpcds-kit README — dsdgen · dsqgen 사용 예. https://github.com/gregrahn/tpcds-kit ↩︎ ↩︎ ↩︎