このトピックでは、PolarDB-X 1.0のTPCベンチマークH (TPC-H) テストの設計、手順、および結果について説明します。
TPC-H概要
TPC-Hは広く使用されている意思決定支援ベンチマークです。 これは、データベースのクエリ機能を評価するために、Transaction Processing Performance Council (TPC) によって開発およびリリースされています。 TPC-Hベンチマークでは、22の複雑なSQLクエリが8つのテーブルに対して実行されます。 ほとんどのクエリには、複数のテーブル、サブクエリ、およびGROUP BY句の結合が含まれます。
このTPC-Hの実装はTPC-Hベンチマークから派生しており、公開されているTPC-Hベンチマークの結果と比較できません。これは、この実装がTPC-Hベンチマークのすべての要件に準拠しているわけではないためです。
テストデザイン
Enterprise Editionインスタンスのテスト環境: 1つのPolarDB-X 1.0 Enterprise Editionインスタンスには、それぞれ16 CPUコアと64 GBのメモリを備えた2つのノードと、8 CPUコアと32 GBのメモリを備えた4つの専用ApsaraDB RDS for MySQL 5.7インスタンスが含まれます。
Standard Editionインスタンスのテスト環境: それぞれ8 CPUコアと32 GBのメモリを持つ2つのノードと、4 CPUコアと32 GBのメモリを持つ4つの専用ApsaraDB RDS for MySQL 5.7インスタンスを含む1つのPolarDB-X 1.0 Standard Editionインスタンス。
次のテスト結果は、50 GBデータに対して実行されたクエリに基づいて提供されます。 50 GBデータのスカラー係数は50です。 メインテーブルは、LINEITEMテーブル、ORDERSテーブル、およびPARSUPPテーブルです。 LINEITEMテーブルには約300万行があります。 ORDERSテーブルには7500万行があります。 PARSUPPテーブルには4000万行があります。
次の例では、Q18には、半結合を持つサブクエリを含め、数千万行から数億行の4つのテーブルの結合が含まれています。 さらに、Q18には、GROUP BY句で指定された列に基づく集計操作が含まれます。 PolarDB-X 1.0インスタンスがこのクエリを実行するのに約11秒かかります。
c_name、c_custkey、o_orderkey、o_orderdate、o_totalprice、sum(l_quantity) を選択します。顧客、注文、LINEITEMから
ここでo_orderkey in (
l_orderkeyを選択
LINEITEMから
groupによってl_orderkey
having sum(l_quantity) > 314
)
とc_custkey = o_custkey
とo_orderkey = l_orderkey
c_name、c_custkey、o_orderkey、o_orderdate、o_totalpriceによるグループ
o_totalprice descによる注文、o_orderdate
制限100;
テストの実行手順
次のテスト手順では、LoadData機能を使用してTPC-Hデータをインポートします。 この機能を使用する場合は、インスタンスのカーネルバージョンがV5.4.7-16000638以降である必要があります。
Electric Compute Service (ECS) インスタンスを作成し、ストレステストマシンとして使用します。 テストデータの準備やストレステストの実行など、次の操作がこのECSインスタンスで実行されます。
説明ECSインスタンスの作成時に仮想プライベートクラウド (VPC) を選択することを推奨します。 クラシックネットワークタイプを使用する場合、ApsaraDB RDS for MySQLインスタンスの一部の仕様が利用できない場合があります。 VPCのIDと名前を記録します。 後続の手順で説明するすべてのインスタンスをデプロイし、対応するすべてのデータをこのVPCに保存する必要があります。
最新のDebianまたはCentOSイメージを使用することを推奨します。 これにより、コンパイル中に必要なすべての依存関係ライブラリを使用できます。
PolarDB-X 1.0インスタンスとApsaraDB RDS for MySQLインスタンスを作成します。 これらのインスタンスが、前の手順で作成したECSインスタンスと同じVPCにデプロイされていることを確認します。
PolarDB-X 1.0インスタンスにデータベースとテーブルを作成します。 このステップでは、シャーディング方法を指定する必要があります。 次のコードに示すテーブルスキーマを使用することを推奨します。
CREATE TABLE 'customer' ( 'c_custkey' int(11) NOT NULL、 'c_name' varchar(25) NOT NULL、 'c_address' varchar(40) NOT NULL、 'c_nationkey' int(11) NOT NULL、 'c_phone' varchar (15) NOT NULL、 'c_acctbal' decimal(15,2) NOT NULL、 'c_mktsegment' varchar(10) NOT NULL、 'c_comment' varchar(117) NOT NULL、 主要なキー ('c_custkey') ) ENGINE=InnoDB DEFAULT CHARSET=latin1 dbpartition by hash('c_custkey ') tbpartition by hash('c_custkey') tbpartition 4; CREATE TABLE 'lineitem' ( 'L_orderkey' bigint(20) NOT NULL、 'l_partkey' int(11) NOT NULL、 'l_suppkey' int(11) NOT NULL、 'l_linenumber' bigint(20) NOT NULL、 'L_quantity' decimal(15,2) NOT NULL、 'L_extendedprice' 小数 (15,2) NOT NULL、 「l_discount' decimal(15,2) NOT NULL、 'L_tax' decimal(15,2) NOT NULL、 'l_returnflag' varchar(1) NOT NULL、 'L_linestatus' varchar (1) NOT NULL, 'L_shipdate' 日付NOT NULL, 'L_commitdate' 日付NOT NULL, 'L_receiptdate' 日付NOT NULL, 'l_shipinstruction 'varchar(25) NOT NULL、 'L_shipmode' varchar(10) NOT NULL、 'L_comment' varchar(44) NOT NULL、 キー 'IDX_LINEITEM_SUPPKEY' ('L_suppkey') 、 KEY 'IDX_LINEITEM_PARTKEY '('L_partkey') 、 PRIMARY KEY ('l_orderkey','l_linenumber') ) ENGINE=InnoDB DEFAULT CHARSET=latin1 RIGHT_SHIFTによるdbpartition ('1_orderkey', 6) tbpartition RIGHT_SHIFTによるtbpartition ('1_orderkey', 6) tbpartitions 4; テーブル「注文」の作成 ( 'o_orderkey' bigint(20) NOT NULL、 'o_custkey' int(11) NOT NULL、 'o_orderstatus' varchar (1) NOT NULL, 'o_totalprice' 小数 (15,2) NOT NULL、 'o_orderdate' 日付NOT NULL, 'o_orderpriority' varchar(15) NOT NULL、 'o_clerk' varchar(15) NOT NULL、 'o_shippriority' bigint(20) NOT NULL、 'o_comment' varchar(79) NOT NULL、 主要なキー ('O_ORDERKEY') ) ENGINE=InnoDB DEFAULT CHARSET=latin1 dbpartition by RIGHT_SHIFT('O_ORDERKEY',6) tbpartition by RIGHT_SHIFT('O_ORDERKEY',6) tbpartitions 4; CREATE TABLE 'part' ( 'p_partkey' int(11) NOT NULL、 'p_name' varchar (55) NOT NULL, 'p_mfgr' varchar (25) NOT NULL, 'p_brand' varchar (10) NOT NULL, 'p_type' varchar (25) NOT NULL、 'p_size' int(11) NOT NULL、 'p_container' varchar (10) NOT NULL, 'p_retailprice' 小数 (15,2) NOT NULL、 'p_comment' varchar(23) NOT NULL、 PRIMARY KEY ('p_partkey') ) ENGINE=InnoDB DEFAULT CHARSET=latin1 dbpartition by hash('p_partkey') tbpartition by hash('p_partkey') tbpartition4; テーブル 'partsupp' を作成する ( 'ps_partkey' int(11) NOT NULL、 'ps_suppkey' int(11) NOT NULL、 'ps_availqty' int(11) NOT NULL、 'ps_supplycost '10進数 (15,2) NOT NULL、 'ps_comment' varchar(199) NOT NULL、 キー 'IDX_PARTSUPP_SUPPKEY' ('PS_SUPPKEY') 、 基本キー ('ps_partkey','ps_suppkey') ) ENGINE=InnoDB DEFAULT CHARSET=latin1 dbpartition by hash('ps_partkey ') tbpartition by hash('ps_partkey') tbpartition4; CREATE TABLE 'supplier' ( の_suppkey' int (11) NOT NULL, の_name' varchar (25) NOT NULL, の_address' varchar(40) NOT NULL, の_nationkey' int(11) NOT NULL、 'sの_phone' varchar (15) NOT NULL, の_acctbal' decimal(15,2) NOT NULL、 's_comment' varchar(101) NOT NULL, プライマリーキー (_suppkey ') ) ENGINE=InnoDB DEFAULT CHARSET=latin1 dbpartition by hash('s_suppkey ') tbpartition by hash('s_suppkey') tbpartition 4; テーブル 'nation' を作成する ( 'n_nationkey' int(11) NOT NULL, 'n_name' varchar(25) NOT NULL、 'n_regionkey' int(11) NOT NULL、 'n_comment' varchar(152) DEFAULT NULL、 主要なキー ('n_nationkey ') ) エンジン=InnoDBデフォルト料金セット=latin1放送; テーブル 'region' を作成する ( 'r_regionkey' int(11) NOT NULL、 'r_name' varchar (25) NOT NULL, 'r_comment' varchar(152) DEFAULT NULL、 PRIMARY KEY ('r_regionkey') ) エンジン=InnoDBデフォルト料金セット=latin1放送;
PolarDB-X 1.0インスタンスにデータをインポートします。 tpchDataからECSインスタンスにスクリプトをダウンロードします。
# tpchData.zipファイルからスクリプトを抽出します。 unzip tpchData.zip cd tpchData-update-20210809 # confファイルを編集します。 vim params.conf
confファイルの最終行の接続情報を実際の接続情報に変更します。
#!/bin/bash ### リモート生成ディレクトリ export remoteGenDir=./ ### ターゲットパス export targetPath=../tpch/tpchRaw export sourcePath=../tpch/tpchRaw ### ワーカーあたりのコア、デフォルト値は1です export coresPerWorker=1 ### ワーカーあたりのスレッド、デフォルト値は1です export threadsPerWorker=1 export hint="" ### 異なるサイズのデータをテストする必要がある場合は、データベース名を変更します。 たとえば、100 GBのデータをテストする場合は、名前をtpch_100gに変更します。 export insertMysql="mysq l -hxxxxxxxxxx.drds.aliyuncs.com -P3306 -uxxx -pxxxxxx -Ac -- local-infile tpch_50g -e"
50 GBのデータを生成します。
cd datagen # データを生成します。 このステップは1回だけ実行する必要があります。 このテストで再度準備データが必要な場合は、生成されたデータを再利用できます。 sh generateTPCH.sh 50 # PolarDB-X 1.0インスタンスにデータをロードします。 cd. ./loadTpch sh loadTpch.sh 50
生成されたデータが正しいかどうかを確認します。
MySQL [tpch_5g]> select (顧客からカウント (*) を選択) customer_cntとして、 -> (lineitemからカウント (*) を選択) としてlineitem_cnt、 -> (国からカウント (*) を選択) nation_cntとして、 -> (注文からカウント (*) を選択) order_cntとして、 -> (パーツからカウント (*) を選択) part_cntとして、 -> (partsupppからcount(*) を選択) partsupp_cntとして、 -> (region_cntとしてregion_cntからカウント (*) を選択) -> (サプライヤーからカウント (*) を選択) supplier_cnt;
TPC-Hテストを実行する前に、
ANALYZE
ステートメントを実行して統計を収集します。分析テーブル顧客; 分析テーブルlineitem; テーブル国家を分析する。テーブル注文を分析する。テーブル部分を分析する。テーブルpartsuppを分析します。テーブル領域を分析する。分析テーブルサプライヤー;
TPC-Hテストを実行します。
cd tpchData cd runTpch sh runTpch.sh # テストの実行後、result_fixed_mgetディレクトリに移動し、各SQLクエリの結果を確認します。 cd result_fixed_mget
テスト結果
PolarDB-X 1.0 Starter Editionインスタンスは、並列クエリをサポートしていません。 これらのインスタンスを使用して分析クエリを実行しないことを推奨します。
クエリ | エンタープライズエディション (単位: 秒) | スタンダードエディション (単位: 秒) |
Q01 | 55.82 | 111.84 |
Q02 | 6.12 | 11.54 |
Q03 | 15.99 | 30 |
Q04 | 17.71 | 36.56 |
Q05 | 10.89 | 23.01 |
Q06 | 8.06 | 16.76 |
Q07 | 17.09 | 34.80 |
Q08 | 13.44 | 26.09 |
Q09 | 53.81 | 101.51 |
Q10 | 8.73 | 19.67 |
Q11 | 18.25 | 19.74 |
Q12 | 8.80 | 18.60 |
Q13 | 14.15 | 31.33 |
Q14 | 17.49 | 42.43 |
Q15 | 20.62 | 42.79 |
Q16 | 2.13 | 4.15 |
Q17 | 1.93 | 4.07 |
Q18 | 11.01 | 22.82 |
Q19 | 12.97 | 27.61 |
Q20 | 27.77 | 49.25 |
Q21 | 38.84 | 68.08 |
Q22 | 5.27 | 11.29 |
Total | 386.77 | 754.65 |