このトピックでは、PolarDB-XインスタンスのTPC-Hテストの設計、手順、および結果について説明します。
背景情報
TPC-Hは、データベースの分析クエリ機能を評価するために広く使用されているベンチマークです。 これは、Transaction Processing Performance Council (TPC) によって開発およびリリースされています。 TPC-Hベンチマークでは、22の複雑なSQLクエリが8つのテーブルに対して実行されます。 ほとんどのクエリには、複数のテーブル、サブクエリ、およびGROUP BY句の結合が含まれます。
このトピックで説明するTPC-Hのパフォーマンステストは、TPC-Hベンチマークテストに基づいて実装されていますが、TPC-Hベンチマークテストのすべての要件を満たしているわけではありません。 したがって、このトピックで説明されているテスト結果は、TPC-Hのベンチマークテストの公開結果と比較することはできません。
テストデザイン
量のテストデータ
テストは、100 GBのスカラー係数に基づいて実行されます。 次のリストは、各メジャーテーブルのデータ量を示しています。
lineitemテーブルは、600万行のデータを含みます。
注文テーブルには、150万行のデータが含まれます。
partsuppテーブルには、8000万行のデータが含まれます。
テストのインスタンス仕様
ノード仕様
ノード数
データセットサイズ
8C64G
6
100 GB
ストレステスト用ECSインスタンスタイプ
ecs.g7.4xlarge (16 vCPUと64 GBのメモリ)
手順
ストレステスト用のElastic Compute Service (ECS) インスタンスを作成します。
データの準備とストレステストの実行に使用されるECSインスタンスを作成します。
説明ECSインスタンスは、仮想プライベートクラウド (VPC) にデプロイする必要があります。 後で使用するために、VPCの名前とIDを記録します。 後続の手順で説明するすべてのデータベースインスタンスをVPCにデプロイする必要があります。
ストレステスト用のPolarDB-Xインスタンスを作成します。
PolarDB-Xインスタンスを作成します。 PolarDB-Xインスタンスの作成方法については、「PolarDB-Xインスタンスの作成」をご参照ください。
説明ECSインスタンスとPolarDB-Xインスタンスが同じVPCにあることを確認します。
PolarDB-Xインスタンスでテストするデータベースを作成します。 この例では、tpch_100gという名前のデータベースが作成されています。 詳細については、「データベースの作成」をご参照ください。
CREATE DATABASE tpch_100g MODE = 'auto';次のステートメントを実行して、tpch_100gデータベースにテーブルを作成します。
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, PRIMARY KEY (`c_custkey`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY KEY(`c_custkey`) PARTITIONS 192; 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` decimal(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` date NOT NULL, `l_commitdate` date NOT NULL, `l_receiptdate` date NOT NULL, `l_shipinstruct` varchar(25) NOT NULL, `l_shipmode` varchar(10) NOT NULL, `l_comment` varchar(44) NOT NULL, KEY `IDX_LINEITEM_PARTKEY` (`l_partkey`), KEY `IDX_SUPPKEY` (`l_suppkey`), KEY `IDX_LINEITEM_SHIPDATE` (`l_shipdate`), PRIMARY KEY (`l_orderkey`,`l_linenumber`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY KEY(`l_orderkey`) PARTITIONS 192; CREATE TABLE `orders` ( `o_orderkey` bigint(20) NOT NULL, `o_custkey` int(11) NOT NULL, `o_orderstatus` varchar(1) NOT NULL, `o_totalprice` decimal(15,2) NOT NULL, `o_orderdate` date 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, PRIMARY KEY (`O_ORDERKEY`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY KEY(`o_orderkey`) PARTITIONS 192; 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` decimal(15,2) NOT NULL, `p_comment` varchar(23) NOT NULL, PRIMARY KEY (`p_partkey`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY KEY(`p_partkey`) PARTITIONS 192; CREATE TABLE `partsupp` ( `ps_partkey` int(11) NOT NULL, `ps_suppkey` int(11) NOT NULL, `ps_availqty` int(11) NOT NULL, `ps_supplycost` decimal(15,2) NOT NULL, `ps_comment` varchar(199) NOT NULL, KEY `IDX_PARTSUPP_SUPPKEY` (`PS_SUPPKEY`), PRIMARY KEY (`ps_partkey`,`ps_suppkey`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY KEY(`ps_partkey`) PARTITIONS 192; CREATE TABLE `supplier` ( `s_suppkey` int(11) NOT NULL, `s_name` varchar(25) NOT NULL, `s_address` varchar(40) NOT NULL, `s_nationkey` int(11) NOT NULL, `s_phone` varchar(15) NOT NULL, `s_acctbal` decimal(15,2) NOT NULL, `s_comment` varchar(101) NOT NULL, PRIMARY KEY (`s_suppkey`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY KEY(`s_suppkey`) PARTITIONS 192; CREATE TABLE `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, PRIMARY KEY (`n_nationkey`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 broadcast; CREATE TABLE `region` ( `r_regionkey` int(11) NOT NULL, `r_name` varchar(25) NOT NULL, `r_comment` varchar(152) DEFAULT NULL, PRIMARY KEY (`r_regionkey`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 broadcast;
インスタンスパラメーターの変更
説明ストレステストを最適化するには、PolarDB-Xインスタンスの特定のコンピューティングレイヤーパラメーターを変更します。
XPROTO_MAX_DN_CONCURRENTおよびXPROTO_MAX_DN_WAIT_CONNECTIONパラメーターを4000に設定します。 詳細については、「パラメーター設定」をご参照ください。
コマンドラインクライアントを使用してPolarDB-Xインスタンスに接続します。 次に、同じセッションで次のSQL文を実行して、ロギングとCPU統計サンプリングを無効にします。
set GLOBAL RECORD_SQL = false; set GLOBAL ENABLE_HTAP=true; set GLOBAL ENABLE_MASTER_MPP=true; set GLOBAL MPP_METRIC_LEVEL = 0; set GLOBAL ENABLE_CPU_PROFILE = false; set GLOBAL ENABLE_SORT_AGG=false; set GLOBAL MPP_PARALLELISM=192; set GLOBAL GROUP_PARALLELISM=8;
ストレステスト用のデータを準備します。
ストレステストデータをインポートします。
データインポートツールBatch toolをダウンロードしてECSインスタンスにアップロードします。 ダウンロードリンク: https://github.com/polardb/polardbx-tools/releases 。 詳細については、「バッチツールを使用したデータのエクスポートとインポート」をご参照ください。
ECSインスタンスにJava環境をインストールします。 Alibaba Cloud Linux 3を実行するECSインスタンスのサンプルコマンド:
yum install -y java-11-openjdk.x86_64次のコマンドを実行して、100 GBのTPC-Hデータセットをインポートします。
java -Xmn8g -Xmx16g -jar batch-tool.jar -h ${HOST} -P${PORT} -u ${USER} -p ${PASSWORD} -D tpch_100g -o import -benchmark tpch -scale 100 -s , -pro 1 -con 80 -minConn 81 -maxConn 81 -batchSize 500説明次のリストにパラメーターを示します。 ${HOST} 、${PORT} 、${USER} 、および ${PASSWORD} を実際の値に置き換えます。
{HOST}: PolarDB-Xインスタンスのホスト。
{PORT}: PolarDB-Xインスタンスへの接続に使用されるポート番号。
{USER}: PolarDB-Xインスタンスへの接続に使用されるユーザー名。
{PASSWORD}: PolarDB-Xインスタンスへの接続に使用されるパスワード。
データの整合性を確認します。
コマンドラインクライアントを使用してPolarDB-Xインスタンスに接続し、各テーブルに格納されているデータ量が期待どおりかどうかを確認します。
select (select count(*) from customer) as customer_cnt, (select count(*) from lineitem) as lineitem_cnt, (select count(*) from nation) as nation_cnt, (select count(*) from orders) as order_cnt, (select count(*) from part) as part_cnt, (select count(*) from partsupp) as partsupp_cnt, (select count(*) from region) as region_cnt, (select count(*) from supplier) as supplier_cnt;+--------------+--------------+------------+-----------+----------+--------------+------------+--------------+ | customer_cnt | lineitem_cnt | nation_cnt | order_cnt | part_cnt | partsupp_cnt | region_cnt | supplier_cnt | +--------------+--------------+------------+-----------+----------+--------------+------------+--------------+ | 15000000 | 600037902 | 25 | 150000000 | 20000000 | 80000000 | 5 | 1000000 | +--------------+--------------+------------+-----------+----------+--------------+------------+--------------+統計を収集します。
コマンドラインクライアントを使用してPolarDB-Xインスタンスに接続し、ANALYZE TABLEステートメントを実行して各テーブルの統計を収集します。
analyze table customer; analyze table lineitem; analyze table nation; analyze table orders; analyze table part; analyze table partsupp; analyze table region; analyze table supplier;
ストレステストを実行します。
テストスクリプトパッケージtpch-queries.tar.gzをダウンロードして解凍します。
tar xzvf tpch-queries.tar.gzスクリプトを実行してクエリを実行し、各クエリの実行に必要な時間を記録します。
cd tpch-queries 'time' -f "%e" sh all_query.sh {HOST} {USER} {PASSWORD} {DB} {PORT}
テスト結果
MySQL 5.7
バージョン: polardb-2.4.0_5.4.19-20240718_xcluster5.4.19-20240630。 詳細については、「リリースノート」をご参照ください。
次の表のSQL列には、tpch-queries.tar.gzパッケージ内のSQLクエリファイルが表示されます。
SQL | 実行期間 |
01.sql | 41.44 |
02.sql | 1.66 |
03.sql | 12.35 |
04.sql | 2.84 |
05.sql | 6.95 |
06.sql | 7.71 |
07.sql | 27.13 |
08.sql | 9.44 |
09.sql | 37.43 |
10.sql | 4.92 |
11.sql | 3.02 |
12.sql | 9.7 |
13.sql | 2.88 |
14.sql | 1.72 |
15.sql | 5.46 |
16.sql | 1.63 |
17.sql | 1.74 |
18.sql | 11.28 |
19.sql | 2.78 |
20.sql | 9.77 |
21.sql | 15.01 |
22.sql | 2.39 |
all_query.sh | 219.25 |

MySQL 8.0
バージョン: polardb-2.4.0_5.4.19-20240718_xcluster8.4.19-20240630。 詳細については、「リリースノート」をご参照ください。
次の表のSQL列には、tpch-queries.tar.gzパッケージ内のSQLクエリファイルが表示されます。
SQL | 実行期間 |
01.sql | 33.19 |
02.sql | 1.96 |
03.sql | 11.87 |
04.sql | 2.6 |
05.sql | 5.92 |
06.sql | 8.83 |
07.sql | 27.26 |
08.sql | 10.34 |
09.sql | 33.32 |
10.sql | 4.89 |
11.sql | 3.26 |
12.sql | 8.67 |
13.sql | 2.78 |
14.sql | 1.62 |
15.sql | 5.29 |
16.sql | 1.79 |
17.sql | 1.68 |
18.sql | 11.19 |
19.sql | 3.1 |
20.sql | 11.14 |
21.sql | 14.84 |
22.sql | 2.13 |
all_query.sh | 207.67 |
