すべてのプロダクト
Search
ドキュメントセンター

PolarDB:TPC-H テスト

最終更新日:Mar 05, 2025

このトピックでは、PolarDB-X インスタンスの TPC-H テスト設計、手順、および結果について説明します。

背景情報

TPC-H は、データベースの分析クエリ機能を評価するために広く使用されているベンチマークです。これは、Transaction Processing Performance Council(TPC)によって開発およびリリースされています。TPC-H ベンチマークでは、8 つのテーブルに対して 22 の複雑な SQL クエリが実行されます。ほとんどのクエリには、複数のテーブルの結合、サブクエリ、および GROUP BY 句が含まれています。

説明

このトピックで説明されている TPC-H パフォーマンステストは、TPC-H ベンチマークテストに基づいて実装されていますが、TPC-H ベンチマークテストのすべての要件を満たしているわけではありません。したがって、このトピックで説明されているテスト結果は、公開されている TPC-H ベンチマークテストの結果と比較することはできません。

テスト設計

  • テストデータの量

    テストには 100 GB のデータが使用されます。これは、スケールファクターが 100 であることを示しています。次のリストは、各主要テーブルのデータ量を示しています。

    • LINEITEM テーブルには 6億行のデータが含まれています。

    • ORDERS テーブルには 1億5000万行のデータが含まれています。

    • PART_SUPP テーブルには 8000万行のデータが含まれています。

  • TPC-H テストのインスタンス仕様

    ノード仕様

    ノード数

    データセットのサイズ

    8C64G

    6

    100 GB

  • ストレステスト用の ECS インスタンスタイプ

    ecs.g7.4xlarge(16 vCPU、64 GB メモリ、200 GB を超えるディスクサイズ)

手順

  1. ストレステスト用の Elastic Compute Service (ECS) インスタンスを作成します。

    データの準備とストレステストの実行に使用する ECS インスタンスを作成します。ECS インスタンスのディスクサイズは 200 GB 以上である必要があります。ツールによって生成された CSV 形式のデータセットは、ECS インスタンスのディスクに保存されます。

    説明

    ECS インスタンスは、仮想プライベートクラウド (VPC) にデプロイする必要があります。後で使用するために、VPC の名前と ID を記録しておきます。後続の手順で説明されているすべてのデータベースインスタンスを VPC にデプロイする必要があります。

  2. ストレステスト用の PolarDB-X インスタンスを作成します。

    1. ストレステスト用の PolarDB-X インスタンスを作成します。PolarDB-X インスタンスの作成方法については、「PolarDB-X インスタンスの作成」をご参照ください。

      説明

      ECS インスタンスと PolarDB-X インスタンスが同じ VPC 内にあることを確認してください。

    2. PolarDB-X インスタンスでテストするデータベースを作成します。この例では、tpch_100g という名前のデータベースが作成されます。詳細については、「データベースの作成」をご参照ください。

      CREATE DATABASE tpch_100g;
    3. 次のステートメントを実行して、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 dbpartition by hash(`c_custkey`) tbpartition by hash(`c_custkey`) tbpartitions 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` 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_SUPPKEY` (`l_suppkey`),
        KEY `IDX_LINEITEM_PARTKEY` (`l_partkey`),
        KEY `IDX_LINEITEM_SHIPDATE` (`l_shipdate`),
        PRIMARY KEY (`l_orderkey`,`l_linenumber`)
      ) ENGINE=InnoDB DEFAULT CHARSET=latin1 dbpartition by RIGHT_SHIFT(`l_orderkey`,6) tbpartition by RIGHT_SHIFT(`l_orderkey`,6) tbpartitions 4;
      
      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 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` decimal(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`) tbpartitions 4;
      
      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 dbpartition by hash(`ps_partkey`) tbpartition by hash(`ps_partkey`) tbpartitions 4;
      
      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 dbpartition by hash(`s_suppkey`) tbpartition by hash(`s_suppkey`) tbpartitions 4;
      
      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;
  3. インスタンスパラメーターを調整します。

    説明

    ストレステストを最適化するには、PolarDB-X インスタンスの計算ノードの特定のパラメーターを調整します。

    1. XPROTO_MAX_DN_CONCURRENT パラメーターと XPROTO_MAX_DN_WAIT_CONNECTION パラメーターを 4000 に設定します。詳細については、「パラメーター設定」をご参照ください。

    2. コマンドラインクライアントを使用して 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;
  4. ストレステストのデータを準備します。

    1. 次のコマンドを実行して、tpchData.tar.gz パッケージをダウンロードして解凍します。

      tar xzvf tpchData.tar.gz
      cd tpchData/
      vi params.conf

      params.conf 構成ファイルで PolarDB-X インスタンスの接続情報を指定します。

      #!/bin/bash
      
      ### remote generating directory
      export remoteGenDir=./
      
      ### target path
      export targetPath=../tpch/tpchRaw
      
      ### cores per worker, default value is 1
      export coresPerWorker=`cat /proc/cpuinfo| grep "processor"| wc -l`
      
      ### threads per worker, default value is 1
      export threadsPerWorker=`cat /proc/cpuinfo| grep "processor"| wc -l`
      #export threadsPerWorker=1
      
      export hint=""
      
      
      export insertMysql="mysql -h{HOST} -P{PORT} -u{USER} -p{PASSWORD} -Ac --local-infile tpch_100g -e"

      構成ファイルには、次のパラメーターを指定する必要があります。

      • {HOST}: PolarDB-X インスタンスのホスト名。

      • {PORT}: PolarDB-X インスタンスへのアクセスに使用するポート番号。

      • {USER}: PolarDB-X インスタンスにログインするためのユーザー名。

      • {PASSWORD}: PolarDB-X インスタンスにログインするためのパスワード。

      データを効率的に生成するには、スクリプトの threadsPerWorker パラメーターを、ストレステストに使用する ECS インスタンスの vCPU 数などの大きい値に設定します。

    2. tpchData/workloads ディレクトリにある tpch.workload.<scaleFactor>.lst ファイルをテストデータサイズに基づいて準備します。

      • デフォルトでは、tpch.workload.100.lst ファイルが提供されています。実際のテストデータサイズに基づいてファイルの名前を変更できます。この例のテストデータサイズは 100 GB です。したがって、scaleFactor は 100 に設定されます。

      • 3 番目の列は、データ生成プロセスが分割されるセグメントの数を示します。リソースが不足している場合は、値を増やすことができます。

    3. スクリプトを実行して、複数プロセスを使用して 100 GB のデータを生成します。

      cd datagen
      sh generateTPCH.sh 100

      生成されたデータは、tpch/tpchRaw/SF100/ ディレクトリで確認できます。

      ls ../tpch/tpchRaw/SF100/
      customer  lineitem  nation  orders  part  partsupp  region  supplier
    4. PolarDB-X インスタンスにデータをインポートします。

      cd ../loadTpch
      sh loadTpch.sh 100
    5. データ整合性を検証します。

      コマンドラインクライアントを使用して PolarDB-X インスタンスに接続し、各テーブルに保存されているデータ量が想定どおりであることを確認します。

      MySQL [tpch_100g]> 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 |
      +--------------+--------------+------------+-----------+----------+--------------+------------+--------------+
    6. 統計を収集します。

      コマンドラインクライアントを使用して 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;
  5. ストレステストを実行します。

    1. tpch-queries.tar.gz テストスクリプトパッケージをダウンロードして解凍します。

      tar xzvf tpch-queries.tar.gz
    2. スクリプトを実行してクエリを実行し、各クエリの実行時間を記録します。

      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

38.93

02.sql

1.57

03.sql

11.83

04.sql

2.63

05.sql

7.07

06.sql

7.49

07.sql

24.43

08.sql

9.22

09.sql

38.88

10.sql

6.78

11.sql

2.93

12.sql

10.2

13.sql

3.02

14.sql

1.67

15.sql

5.1

16.sql

1.59

17.sql

1.71

18.sql

13.78

19.sql

2.82

20.sql

9.29

21.sql

14.54

22.sql

2.41

合計

217.89

image

MySQL 8.0

説明
  • バージョン: polardb-2.4.0_5.4.19-20240718_xcluster8.4.19-20240630。詳細については、「リリースノート」をご参照ください。

  • テーブルの SQL 列には、tpch-queries.tar.gz パッケージの SQL ファイルが表示されます。

SQL

実行時間(秒)

01.sql

35.34

02.sql

1.92

03.sql

12.82

04.sql

17.11

05.sql

15.6

06.sql

9.07

07.sql

22.04

08.sql

10.92

09.sql

28.65

10.sql

12.14

11.sql

3.14

12.sql

9.62

13.sql

2.87

14.sql

1.57

15.sql

4.77

16.sql

3.7

17.sql

1.54

18.sql

22.1

19.sql

3.11

20.sql

11.07

21.sql

13.76

22.sql

2.09

合計

244.95

image