TPC-H 是 TPC 組織提供的決策支援系統(DSS)基準測試套件,包含 22 個商業導向的 Ad-hoc 查詢與並發資料修改,專門評估資料庫、平台與 I/O 在 OLAP 場景下的查詢能力。官網:https://www.tpc.org/tpch,原始碼下載:tpch_2_14_3.tgz 或 .zip。
cp makefile.suite makefile # 修改 makefile CC = gcc DATABASE = MYSQL MACHINE = LINUX WORKLOAD = TPCH
修改 tpcd.h 新增 MySQL 專用巨集定義:
#ifdef MYSQL #define GEN_QUERY_PLAN "" #define START_TRAN "START TRANSACTION" #define END_TRAN "COMMIT" #define SET_OUTPUT "" #define SET_ROWCOUNT "limit %d;\n" #define SET_DBASE "use %s;\n" #endif
執行 make 產生 dbgen(資料生成)與 qgen(SQL 生成)兩個執行檔。
./dbgen -s 50 # -s 指定倉庫規模,建議 ≥100,生產環境常用 1000
產生 8 張 .tbl 資料檔(如 lineitem.tbl 1.4G 等)。
dss.ddl:補上 drop/create/use tpch;dss.ri:修正 CONNECT TO TPCD → use tpch;,註釋符 -- 後加空格,外鍵引用補全欄位名(如 references TPCD.REGION(R_REGIONKEY)),最後將表名改為小寫。qgen 產出的 SQL 需做全域取代:;\nlimit → limit、limit -1 → limit 1、移除 interval '106' day (3) 尾部 (3)、修正 count(o_orderkey) → count(o_orderkey) as c_count、drop view revenue0 limit 1 → drop view revenue0; 等,並拆分為 23 個獨立 tpch_01.sql ~ tpch_23.sql。匯入前建議關閉 Binlog 或切分檔案,避免 max_binlog_cache_size 錯誤:
mysql -e "LOAD DATA INFILE 'path/dbgen/lineitem.tbl' INTO TABLE lineitem FIELDS TERMINATED BY '|';" # 其餘 7 張表同理
自動化測試腳本範例(每次查詢前重啟 MySQL 確保 Buffer Pool 冷啟動):
#!/bin/sh
export PATH=$PATH:/usr/local/bin
. ~/.bash_profile >/dev/null 2>&1
exec 3>&1 4>&2 1>>tpch-benchmark-olap-`date +'%Y%m%d%H%M%S'`.log 2>&1
for I in 1 2 3; do
for N in $(seq -w 1 22); do
echo "query $N starting"
/etc/init.d/mysql restart
time mysql -f tpch < ./queries/tpch_${N}.sql
echo "query $N ended!"
done
done
附件提供完整初始化與自動化測試腳本壓縮包。