openGauss/MogDB的TPCH測試

T1YSL發表於2023-11-20

TPC-H是一個決策支援基準(Decision Support Benchmark),它由一套面向業務的特別查詢和併發資料修改組成。查詢和填充資料庫的資料具有廣泛的行業相關性。這個基準測試演示了檢查大量資料、執行高度複雜的查詢並回答關鍵業務問題的決策支援系統。TPC-H報告的效能指標稱為TPC-H每小時複合查詢效能指標(QphH@Size),反映了系統處理查詢能力的多個方面。這些方面包括執行查詢時所選擇的資料庫大小,由單個流提交查詢時的查詢處理能力,以及由多個併發使用者提交查詢時的查詢吞吐量。

TPC-H 測試標準模擬了一個零部件線上銷售的系統,共定義了8個表:

表名稱 說明
REGION 區域表
NATION 國家表
SUPPLIER 供應商表
PART 零部件表
PARTSUPP 零部件供應表
CUSTOMER 客戶表
ORDERS 訂單表
LINEITEM 訂單明細表

對應測試有22條SQL,涉及不同型別的業務。

查詢語句 說明 主要涉及業務
Q1 價格統計報告查詢 帶有分組、排序、聚集操作並存的單表查詢操作。這個查詢會導致表上的資料有95%到97%行被讀取到。
Q2 最小代價供貨商查詢 帶有排序、聚集操作、子查詢並存的多表查詢操作。查詢語句沒有從語法上限制返回多少條元組,但是TPC-H標準規定,查詢結果只返回前100行(通常依賴於應用程式實現)。
Q3 運送優先順序查詢 帶有分組、排序、聚集操作並存的三表查詢操作。查詢語句沒有從語法上限制返回多少條元組,但是TPC-H標準規定,查詢結果只返回前10行(通常依賴於應用程式實現)。
Q4 訂單優先順序查詢 帶有分組、排序、聚集操作、子查詢並存的單表查詢操作。子查詢是相關子查詢。
Q5 本地供應商收入量查詢 帶有分組、排序、聚集操作、子查詢並存的多表連線查詢操作。
Q6 預測收入變化查詢 帶有聚集操作的單表查詢操作。查詢語句使用了BETWEEN-AND運算子,有的資料庫可以對BETWEEN-AND進行最佳化。
Q7 批次出貨查詢 帶有分組、排序、聚集、子查詢操作並存的多表查詢操作。子查詢的父層查詢不存在其他查詢物件,是格式相對簡單的子查詢。
Q8 國家市場份額查詢 帶有分組、排序、聚集、子查詢操作並存的查詢操作。子查詢的父層查詢不存在其他查詢物件,是格式相對簡單的子查詢,但子查詢自身是多表連線的查詢。
Q9 產品型別利潤估量查詢 帶有分組、排序、聚集、子查詢操作並存的查詢操作。子查詢的父層查詢不存在其他查詢物件,是格式相對簡單的子查詢,但子查詢自身是多表連線的查詢。子查詢中使用了LIKE運算子,有的查詢最佳化器不支援對LIKE運算子進行最佳化。
Q10 貨運存在問題的查詢 帶有分組、排序、聚集操作並存的多表連線查詢操作。查詢語句沒有從語法上限制返回多少條元組,但是TPC-H標準規定,查詢結果只返回前10行(通常依賴於應用程式實現)。
Q11 庫存價值查詢 帶有分組、排序、聚集、子查詢操作並存的多表連線查詢操作。子查詢位於分組操作的HAVING條件中。
Q12 貨運模式和訂單優先順序查詢 帶有分組、排序、聚集操作並存的兩表連線查詢操作。
Q13 消費者訂單數量查詢 帶有分組、排序、聚集、子查詢、左外連線操作並存的查詢操作。
Q14 促銷效果查詢 帶有分組、排序、聚集、子查詢、左外連線操作並存的查詢操作。
Q15 頭等供貨商查詢 帶有分排序、聚集、聚集子查詢操作並存的普通表與檢視的連線操作。
Q16 零件/供貨商關係查詢 帶有分組、排序、聚集、去重、NOT IN子查詢操作並存的兩表連線操作。
Q17 小訂單收入查詢 帶有聚集、聚集子查詢操作並存的兩表連線操作。
Q18 大訂單顧客查詢 帶有分組、排序、聚集、IN子查詢操作並存的三表連線操作。查詢語句沒有從語法上限制返回多少條元組,但是TPC-H標準規定,查詢結果只返回前100行(通常依賴於應用程式實現)。
Q19 折扣收入查詢 帶有分組、排序、聚集、IN子查詢操作並存的三表連線操作。
Q20 供貨商競爭力查詢 帶有排序、聚集、IN子查詢、普通子查詢操作並存的兩表連線操作。
Q21 供應商留單等待查詢 帶有分組、排序、聚集、EXISTS子查詢、NOT EXISTS子查詢操作並存的四表連線操作。查詢語句沒有從語法上限制返回多少條元組,但是TPC-H標準規定,查詢結果只返回前100行(通常依賴於應用程式實現)。
Q22 全球銷售機會查詢 帶有分組、排序、聚集、EXISTS子查詢、NOT EXISTS子查詢操作並存的四表連線操作。

如下是openGaus/MogDB測試TPCH的流程。可供參考:

上傳TPCH的工具包

連結: 提取碼: qjbc

一、建立壓測的資料庫和使用者

MogDB=# create database tpch_db;
CREATE DATABASE
MogDB=# create user tpch with password 'Abcd@1234' sysadmin;
NOTICE:  The encrypted password contains MD5 ciphertext, which is not secure.
CREATE ROLE
MogDB=# alter database tpch_db owner to tpch ;
ALTER DATABASE
tpch_db=# alter schema public owner to tpch ;
ALTER SCHEMA

二、建測試表

gsql -p 23000 -d tpch_db -U tpch < createtab_og.sql

Pasted Graphic 2.png

image.png

三、編譯dbgen軟體

解壓TPCH的包,進入dbgen的目錄

1.修改makefile檔案

[om3@lmt0003 TPC-H_Tools_v3.0.0]$ pwd
/home/om3/TPCH-openGauss-TestTools/TPCH-openGauss-TestTools/TPC-H_Tools_v3.0.0
[om3@lmt0003 TPC-H_Tools_v3.0.0]$ cd dbgen/
[om3@lmt0003 dbgen]$ ls
answers     build.c          dists.dss  dsstypes.h      permute.h      queries    rnd.h         tests     tpch.vcproj
bcd2.c      check_answers    driver.c   HISTORY         PORTING.NOTES  README     rng64.c       text.c    update_release.sh
bcd2.h      column_split.sh  dss.ddl    load_stub.c     print.c        reference  rng64.h       tpcd.h    variants
bm_utils.c  config.h         dss.h      makefile.suite  qgen.c         release.h  shared.h      tpch.dsw  varsub.c
BUGS        dbgen.dsp        dss.ri     permute.c       qgen.vcproj    rnd.c      speed_seed.c  tpch.sln
[om3@lmt0003 dbgen]$ cp makefile.suite makefile
[om3@lmt0003 dbgen]$ vi makefile

Pasted Graphic 4.png

修改其中103到112行

image.png

2.修改tpcd.h

[om3@lmt0003 dbgen]$ vi tpcd.h

在檔案末尾加上

#ifdef POSTGRESQL
#define GEN_QUERY_PLAN  "EXPLAIN PLAN"
#define START_TRAN      "SET TRANSACTION"
#define END_TRAN        "COMMIT;"
#define SET_OUTPUT      ""
#define SET_ROWCOUNT    "LIMIT %d\n"
#define SET_DBASE      ""
#endif

修改完編譯配置檔案,可以編譯出程式
3.編譯dbgen

[om3@lmt0003 dbgen]$ make -f makefile

image.png
image.png

引數說明:
-v:詳細資訊
-f:覆蓋之前的檔案
-s:生成資料大小,單位GB
-C引數:表示把生成的資料分為幾份
-S引數:切分資料用,表示第幾個檔案,例如:“-S 1”表示第1個檔案,“-S 2”表示第2個檔案

四、生成資料

例:
1.生成1G資料

./dbgen vf -s 1

image.png

image.png

生成8個tbl檔案,對應8張表的資料。

也可以使用多個執行緒產生資料,加塊速率。例:8執行緒生成500G資料

#!/bin/sh
./dbgen -vf -s 500 -S 1 -C 8 &
./dbgen -vf -s 500 -S 2 -C 8 &
./dbgen -vf -s 500 -S 3 -C 8 &
./dbgen -vf -s 500 -S 4 -C 8 &
./dbgen -vf -s 500 -S 5 -C 8 &
./dbgen -vf -s 500 -S 6 -C 8 &
./dbgen -vf -s 500 -S 7 -C 8 &
./dbgen -vf -s 500 -S 8 -C 8 &

2.轉換資料(把tbl檔案轉換為csv檔案)

for i in `ls *.tbl`;do sed 's/|$//' $i > ${i/tbl/csv};echo $i;done;

image.png

五、匯入資料

建立指令碼,匯入資料

[om3@lmt0003 dbgen]$ vi copyin_tpch_db.sh

下面需要修改的部分為dir和opts部分,dir為上述csv的路徑。opts是gsql後需要加的引數,包含埠,資料庫名等,sch是指定schema。

dir=/home/om3/TPCH-openGauss-TestTools/TPCH-openGauss-TestTools/TPC-H_Tools_v3.0.0/dbgen
opts='-p 23000 -d tpch_db'
sch=public
gsql $opts -c "COPY $sch.region FROM '$dir/region.csv' WITH (FORMAT csv,DELIMITER '|')"
gsql $opts -c "COPY $sch.nation FROM '$dir/nation.csv' WITH (FORMAT csv,DELIMITER '|')"
gsql $opts -c "COPY $sch.part FROM '$dir/part.csv' WITH (FORMAT csv,DELIMITER '|')"
gsql $opts -c "COPY $sch.supplier FROM '$dir/supplier.csv' WITH (FORMAT csv,DELIMITER '|')"
gsql $opts -c "COPY $sch.customer FROM '$dir/customer.csv' WITH (FORMAT csv,DELIMITER '|')"
gsql $opts -c "COPY $sch.partsupp FROM '$dir/partsupp.csv' WITH (FORMAT csv,DELIMITER '|')"
gsql $opts -c "COPY $sch.orders FROM '$dir/orders.csv' WITH (FORMAT csv,DELIMITER '|')"
gsql $opts -c "COPY $sch.lineitem FROM '$dir/lineitem.csv' WITH (FORMAT csv,DELIMITER '|')"

image.png

六、建立所需函式

create or replace function NUMTOYMINTERVAL(float8, text) returns interval as $$ select ($1||' '||$2)::interval;  
$$ language sql strict immutable;
create or replace function NUMTODSINTERVAL(float8, text) returns interval as $$ select ($1||' '||$2)::interval;  
$$ language sql strict immutable;

image.png

七、執行SQL資料夾下SQL(共22種SQL)

image.png

如下是遍歷執行全部22種SQL的指令碼

#!/bin/bash
opts='-p 23000 -d tpch_db -U tpch -W 'Abcd@1234''
for i in `seq 1 22`
do
echo $i"'s  result"
gsql ${opts} -f ${i}.sql
done

image.png

可以將8張表的匯入耗時以及22種SQL的執行耗時記錄下來,並做相應對比(測表匯入耗時可以copy前開啟\timing)。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69990629/viewspace-2996081/,如需轉載,請註明出處,否則將追究法律責任。

相關文章