このトピックでは、TPC Benchmark-H (TPC-H) を使用して、cluster EditionのPolarDB for MySQL 8.0クラスターのオンライン分析処理 (OLAP) パフォーマンスをテストする方法について説明します。 データベースシステムのパフォーマンスを評価するには、このトピックで説明されている手順に従って、データベースの機能をテストおよび比較します。
使用上の注意
この例では、TPC-Hベンチマークに基づくテストが実装されていますが、TPC-Hベンチマークテストのすべての要件を満たしているわけではありません。 そのため、テスト結果は TPC-H のベンチマークテストの公開結果と一致しない可能性があります。
テスト環境
テストで使用されるElastic Compute Service (ECS) インスタンスとPolarDBクラスターは、同じリージョンの同じゾーンにデプロイされます。
ネットワークタイプはVirtual Private Cloud (VPC) です。
説明ECSインスタンスとPolarDBクラスターが同じVPCにあることを確認します。
次のリストに、テストで使用されるPolarDBクラスターの情報を示します。
仕様は32コアと256 GBのメモリ (polar.mysql.x8.4xlarge) です。
.バージョンはMySQL 8.0.1またはMySQL 8.0.2です。
エディションはClusterで、計算ノードタイプはDedicatedです。
クラスターは、プライマリノードと読み取り専用ノードで構成されます。
プライマリエンドポイントは、テストでクラスターに接続するために使用されます。 PolarDBクラスターのプライマリエンドポイントを表示する方法の詳細については、「クラスターのエンドポイントの管理」をご参照ください。
次のリストは、テストで使用されるECSインスタンスの情報を示しています。
インスタンスタイプは ecs.c5.4xlarge です。
1,000 GBのウルトラディスクがインスタンスに接続されています。
インスタンスのイメージは64ビットのCentOS 7.0です。
テストツール
TPC-Hは、データベースの分析クエリ機能を評価するために、Transaction Processing Performance Council (TPC) によって開発およびリリースされる一般的に使用されるベンチマークです。 TPC-Hベンチマークには、8つのテーブルと22の複雑なSQL文が含まれます。 ほとんどのクエリには、複数のテーブル、サブクエリ、およびGROUP BY句のJOIN句が含まれています。
TPC-Hツールのインストール
このトピックのコマンドは、root権限を持つユーザーが実行する必要があります。
このトピックで使用されるTPC-HはTPC-H_Tools_v2.18 0です。 TPC-Hをダウンロードする前に登録する必要があります。
ECSインスタンスにTPC-Hをインストールするには、次の手順を実行します。
TPC-Hパッケージを登録してダウンロードします。 次に、TPC-HパッケージをECSインスタンスにアップロードします。 詳細については、「オンプレミスファイルのECSインスタンスへのアップロード」をご参照ください。
次のコマンドを実行して、アップロードされたTPC-Hパッケージを解凍します。コマンドでは、
dbgen.zip
パッケージを例として指定します。 実際のパッケージファイル名に置き換えます。
を解凍するdbgen.zip
解凍されたファイルがあるディレクトリに移動します。 次のコマンドでは、例としてdbgenディレクトリを指定します。 実際のディレクトリ名に置き換えます。
cd dbgen
次のコマンドを実行して、
makefile
ファイルをコピーします。cp makefile.suite makefile
次のコマンドを実行してGCCをインストールします。
CentOSオペレーティングシステムを使用している場合は、次のコマンドを実行してGCCをインストールします。
sudo yumインストールgcc
Ubuntuオペレーティングシステムを使用している場合は、次のコマンドを実行してGCCをインストールします。
sudo aptインストールgcc
パラメーターの変更
makefile
のようなファイルCC
,データベース
,マシン
、およびWORKLOAD
.を開きます。Open the
makefile
ファイルを作成します。vim makefile
を押してください。
私は
キーを押し、CC、DATABASE、MACHINE、およびWORKLOADパラメータを変更します。################ ## CHANGE NAME OF ANSI COMPILER HERE ################ CC= gcc # Current values for DATABASE are: INFORMIX, DB2, ORACLE, # SQLSERVER, SYBASE, TDAT (Teradata) # Current values for MACHINE are: ATT, DOS, HP, IBM, ICL, MVS, # SGI, SUN, U2200, VMS, LINUX, WIN32 # Current values for WORKLOAD are: TPCH DATABASE= MYSQL MACHINE = LINUX WORKLOAD = TPCH
Escキーを押して、
: wq!
Enterキーを押して変更を保存し、編集モードを終了します。
変更します。Modify the
tpcd.h
ファイルを追加し、新しいマクロ定義を追加します。を開きます。Open the
tpcd.h
ファイルを作成します。vim tpcd.h
i
キーを押して、次のマクロ定義を追加します。#ifdef MYSQL # define GEN_QUERY_PLAN "EXPLAIN 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
Escキーを押して、
: wq
Enterキーを押して変更を保存し、編集モードを終了します。
ファイルをコンパイルします。
作る
ファイルがコンパイルされると、次の実行可能ファイルがディレクトリに生成されます。
dbgen
: データの生成に使用されるツール。 InfiniDBテストスクリプトを使用する場合は、このツールを使用してTPC-H用のデータを生成する必要があります。qgen
: SQL文の生成に使用されるツール。 このツールは、テストの初期ステートメントを生成します。 異なるシードを使用して生成されたクエリは、互いに異なる。 テスト結果の再現性を確保するには、TPC-Hの22の複雑なSQL文を使用します。 こちらをクリックして22文をダウンロードできます。
dbgenを使用してテストデータを生成します。
. /dbgen -s 100
-s
パラメーターは、データの生成に使用されるリポジトリの数を指定します。qgenを使用してクエリを生成します。
説明テスト結果を再現できるようにするには、この手順をスキップして、TPC-Hの22の複雑なSQL文を使用します。 こちらをクリックして22文をダウンロードできます。
コピー
qgen
とdists.dss
にクエリディレクトリに移動します。cp qgenクエリ cp dists.dssクエリ
次のスクリプトを使用してクエリを生成します。
#!/usr/bin/bash {1 .. 22} のiのために 行う . /qgen -d $i -s 100 > db "$i".sql 完了
テストの実行手順
ECSインスタンスからPolarDBクラスターに接続します。 詳細については、「クラスターへの接続」をご参照ください。
データベースを作成します。
データベースtpch100gの作成
テーブルを作成します。
ソース /dss.ddl
説明dss.ddl
は、TPC-Hツールパッケージのdbgenディレクトリにあります。データを読み込みます。
という名前のファイルを作成します。
load.ddl
ECSインスタンスのTouch load.ddl
を開きます。Open the
load.ddl
ファイルを作成します。vim load.ddl
次のスクリプトを追加して保存します。
ロードデータローカルINFILE 'customer.tbl' INTO TABLE customer FIELDS TERMINATED BY '|'; ロードデータローカルINFILE 'region.tbl' INTO TABLE region FIELDS TERMINATED BY '|'; ロードデータローカルINFILE 'nation.tbl' INTO TABLE nation FIELDS TERMINATED BY '|'; ロードデータローカルINFILE 'supplier.tbl' INTO TABLE supplier FIELDS TERMINATED BY '|'; データをローカルに読み込むINFILE 'part.tbl' INTO TABLE part FIELDS TERMINATED BY '|'; データをローカルに読み込むINFILE 'partsupp.tbl' INTO TABLE partsupp FIELDS TERMINATED BY '|'; ロードデータローカルINFILE 'orders.tbl' INTO TABLE orders FIELDS TERMINATED BY '|'; データをローカルに読み込むINFILE 'lineitem.tbl' INTO TABLE lineitem FIELDS TERMINATED BY '|';
に接続します。Connect to thePolarDBクラスターからデータをロードします。
load.ddl
ファイルを作成します。ソース /load.ddl
主キーと外部キーを作成します。
ソース /dss.ri
次の例では、
tpch100g
データベースが使用されています。 TPC-Hツールパッケージのdss.ri
ファイルの内容を次の内容に置き換えます。使用TPCH100G; -ALTER TABLE REGION DROPプライマリーキー; -ALTER TABLE NATION DROPプライマリーキー; -- ALTERのテーブルの部分のドロップの一次キー; -ALTER TABLE SUPPLIER DROP PRIMARYキー; -ALTER TABLE PARTSUPP DROP PRIMARYキー; -ALTERテーブル注文は一次キーをドロップします。-ALTER TABLE LINEITEM DROPプライマリーキー; -ALTERテーブルの顧客は一次キーを落とします; -- テーブルの地域のため ALTERテーブル地域 主要なキー (R_REGIONKEY) を追加します。-- テーブルNATIONのため ALTER TABLE NATION 主要なキー (N_NATIONKEY) を追加します。ALTER TABLE NATION 追加外国キーNATION_FK1 (N_REGIONKEY) 参照REGION(R_REGIONKEY); COMMITの仕事; -- テーブルの部分のため ALTERテーブルパート プライマリーキー (P_PARTKEY) を追加します。COMMITの仕事; -- テーブルのSUPPLIERのため ALTERテーブルサプライヤー PRIMARYキー (S_SUPPKEY) を追加します。ALTERテーブルサプライヤー 追加外国キーSUPPLIER_FK1 (S_NATIONKEY) 参照NATION(N_NATIONKEY); COMMITの仕事; -- テーブルPARTSUPPのため ALTERテーブルPARTSUPP プライマリーキー (PS_PARTKEY、PS_SUPPKEY) を追加します。COMMITの仕事; -- テーブルの顧客のため ALTERテーブルのお客様 主要なキー (C_CUSTKEY) を追加します。ALTERテーブルのお客様 追加外国キーCUSTOMER_FK1 (C_NATIONKEY) 参照NATION(N_NATIONKEY); COMMITの仕事; -- テーブルLINEITEMのため ALTER TABLE LINEITEM 主要なキー (L_ORDERKEY、L_LINENUMBER) を追加します。COMMITの仕事; -- テーブルの注文のため ALTERテーブルの注文 主要なキー (O_ORDERKEY) を追加します。COMMITの仕事; -- テーブルPARTSUPPのため ALTERテーブルPARTSUPP 外国キーPARTSUPP_FK1 (PS_SUPPKEY) 参照SUPPLIER(S_SUPPKEY) を追加します。COMMITの仕事; ALTERテーブルPARTSUPP FOREIGN KEY PARTSUPP_FK2 (PS_PARTKEY) 参照PART(P_PARTKEY) を追加します。COMMITの仕事; -- テーブルの注文のため ALTERテーブルの注文 FOREIGN KEY ORDERS_FK1 (O_CUSTKEY) 参照CUSTOMER(C_CUSTKEY) を追加します。COMMITの仕事; -- テーブルLINEITEMのため ALTER TABLE LINEITEM FOREIGN KEY LINEITEM_FK1 (L_ORDERKEY) 参照ORDERS(O_ORDERKEY) を追加します。COMMITの仕事; ALTER TABLE LINEITEM FOREIGN KEY LINEITEM_FK2 (L_PARTKEY、L_SUPPKEY) 参照の追加 PARTSUPP(PS_PARTKEY、PS_SUPPKEY); COMMITの仕事;
(オプション) インデックスの作成
#!/usr/bin/bash host=$1 port=$2 user=$3 password=$4 db=$5 sqls=("create index i_s_nationkey on supplier (s_nationkey);" "partsuppにインデックスi_ps_partkeyを作成する (ps_partkey);" "partsuppにインデックスi_ps_suppkeyを作成する (ps_suppkey);" "顧客にインデックスi_c_nationkeyを作成する (c_nationkey);" "注文にインデックスi_o_custkeyを作成する (o_custkey);" "注文にインデックスi_o_orderdateを作成する (o_orderdate);" "lineitem (l_orderkey) にインデックスi_l_orderkeyを作成する;" "lineitem (l_partkey) にインデックスi_l_partkeyを作成する;" "lineitem (l_suppkey) にインデックスi_l_suppkeyを作成する;" "lineitemにインデックスi_l_partkey_suppkeyを作成する (l_partkey, l_suppkey);" "lineitem (l_shipdate) にインデックスi_l_shipdateを作成する;" "lineitem (l_commitdate) にインデックスi_l_commitdateを作成する;" "lineitem (l_receiptdate) にインデックスi_l_receiptdateを作成する;" "国にインデックスi_n_regionkeyを作成する (n_regionkey);" 「テーブルサプライヤーの分析」 「テーブル部分の分析」 「テーブルpartsuppを分析する」 「テーブル顧客を分析する」 「テーブルオーダーの分析」 「テーブルのラインアイテムを分析する」 「テーブル国家を分析する」 「テーブル領域の分析」) "${sqls[@]}" のsqlの 行う mysql -h$host -P$port -u$user -p$password -D$db -e "$sql" 完了
説明並列クエリによってもたらされるパフォーマンスの改善を測定するには、次のクエリを実行してインデックスをメモリプールにプリロードします。
#!/bin/bash host=$1 port=$2 user=$3 password=$4 dbname=$5 MYSQL="mysql -h$host -P$port -u$user -p$password -D$dbname" if [ -z ${dbname} ]; then echo "dbname not defined." 出口1 fi table_indexes=( "supplier PRIMARY" "supplier i_s_nationkey" "part PRIMARY" "partsupp PRIMARY" "partsupp i_ps_partkey" "partsupp i_ps_suppkey" "customer PRIMARY" "customer i_c_nationkey" "orders PRIMARY" "orders i_o_custkey" "orders i_o_orderdate" "lineitem PRIMARY" "lineitem i_l_orderkey" "lineitem i_l_partkey" "lineitem i_l_suppkey" "lineitem i_l_partkey_suppkey" "lineitem i_l_shipdate" "lineitem i_l_commitdate" "lineitem i_l_receiptdate" "nation i_n_regionkey" "nation PRIMARY" 「地域プライマリー」 ) "${table_indexes[@]}" のtable_indexの 行う ti=($table_index) table=${ti[0]} index=${ti[1]} SQL="select count(*) from ${table} force index(${index})" echo "$MYSQL -e '$SQL'" $MYSQL -e "$SQL" 完了
クエリを実行します。
#!/usr/bin/env bash host=$1 port=$2 user=$3 password=$4 データベース=$5 resfile=$6 echo "start test run at" 'date "+ % Y-% m-% d % H:% M:% S" '| tee -a ${resfile}.out for ((( i=1; i<=22;i=i + 1 ))) 行う queryfile="Q"${i}".sql" start_time='date "+ % s.% N"' echo "run query ${i}" | tee -a ${resfile}.out mysql -h ${host} -P${port} -u${user} -p${password} $database -e "source $queryfile;" | tee -a ${resfile}.out end_time='date "+ % s.% N"' start_s =${ start_time %.*} start_nanos =${ start_time#*.} end_s =${ end_time %.*} end_nanos =${ end_time#*.} if [ " $end _nanos" -lt "$start_nanos" ]; その後 end_s=$(( 10#$end_s -1 )) end_nanos=$(( 10# $end _nanos + 10 **9)) fi time=$((10# $end _s - 10#$start_s )).'printf "% 03d\n" $(( (10# $end _nanos - 10#$start_nanos)/10 **6 ))' echo ${queryfile} "the"${j}"ランコスト"${time}"second start at" 'date -d @$start_time "+ % Y-% m-% d % H:% M:% S" '"stop at" 'date -d @ $end _time "+ % Y-% m-% d % H:% M:% m: % S"' >> ${resfile}.time done
テスト結果
並列クエリのパフォーマンステストの結果の詳細については、「並列クエリシナリオでのパフォーマンステストの結果」をご参照ください。