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

PolarDB:並列クエリのパフォーマンステスト

最終更新日:May 31, 2024

このトピックでは、TPC Benchmark-H (TPC-H) を使用して、cluster EditionPolarDB 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をインストールするには、次の手順を実行します。

  1. TPC-Hパッケージを登録してダウンロードします。 次に、TPC-HパッケージをECSインスタンスにアップロードします。 詳細については、「オンプレミスファイルのECSインスタンスへのアップロード」をご参照ください。

  2. 次のコマンドを実行して、アップロードされたTPC-Hパッケージを解凍します。コマンドでは、dbgen.zipパッケージを例として指定します。 実際のパッケージファイル名に置き換えます。

    dbgen.zip
    を解凍する
  3. 解凍されたファイルがあるディレクトリに移動します。 次のコマンドでは、例としてdbgenディレクトリを指定します。 実際のディレクトリ名に置き換えます。

    cd dbgen
  4. 次のコマンドを実行して、makefileファイルをコピーします。

    cp makefile.suite makefile
  5. 次のコマンドを実行してGCCをインストールします。

    • CentOSオペレーティングシステムを使用している場合は、次のコマンドを実行してGCCをインストールします。

      sudo yumインストールgcc
    • Ubuntuオペレーティングシステムを使用している場合は、次のコマンドを実行してGCCをインストールします。

      sudo aptインストールgcc
  6. パラメーターの変更makefileのようなファイルCC,データベース,マシン、およびWORKLOAD.

    1. を開きます。Open themakefileファイルを作成します。

      vim makefile
    2. を押してください。私はキーを押し、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 
    3. Escキーを押して、: wq!Enterキーを押して変更を保存し、編集モードを終了します。

  7. 変更します。Modify thetpcd.hファイルを追加し、新しいマクロ定義を追加します。

    1. を開きます。Open thetpcd.hファイルを作成します。

      vim tpcd.h
    2. 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 
    3. Escキーを押して、: wqEnterキーを押して変更を保存し、編集モードを終了します。

  8. ファイルをコンパイルします。

    作る

    ファイルがコンパイルされると、次の実行可能ファイルがディレクトリに生成されます。

    • dbgen: データの生成に使用されるツール。 InfiniDBテストスクリプトを使用する場合は、このツールを使用してTPC-H用のデータを生成する必要があります。

    • qgen: SQL文の生成に使用されるツール。 このツールは、テストの初期ステートメントを生成します。 異なるシードを使用して生成されたクエリは、互いに異なる。 テスト結果の再現性を確保するには、TPC-Hの22の複雑なSQL文を使用します。 こちらをクリックして22文をダウンロードできます。

  9. dbgenを使用してテストデータを生成します。

    . /dbgen -s 100

    -sパラメーターは、データの生成に使用されるリポジトリの数を指定します。

  10. qgenを使用してクエリを生成します。

    説明

    テスト結果を再現できるようにするには、この手順をスキップして、TPC-Hの22の複雑なSQL文を使用します。 こちらをクリックして22文をダウンロードできます。

    1. コピーqgendists.dssクエリディレクトリに移動します。

      cp qgenクエリ
      cp dists.dssクエリ 
    2. 次のスクリプトを使用してクエリを生成します。

      #!/usr/bin/bash
      {1 .. 22} のiのために
      行う  
        . /qgen -d $i -s 100 > db "$i".sql
      完了 

テストの実行手順

  1. ECSインスタンスからPolarDBクラスターに接続します。 詳細については、「クラスターへの接続」をご参照ください。

  2. データベースを作成します。

    データベースtpch100gの作成
  3. テーブルを作成します。

    ソース /dss.ddl
    説明

    dss.ddlは、TPC-Hツールパッケージのdbgenディレクトリにあります。

  4. データを読み込みます。

    1. という名前のファイルを作成します。load.ddlECSインスタンスの

      Touch load.ddl
    2. を開きます。Open theload.ddlファイルを作成します。

      vim load.ddl
    3. 次のスクリプトを追加して保存します。

      ロードデータローカル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 '|'; 
    4. に接続します。Connect to thePolarDBクラスターからデータをロードします。load.ddlファイルを作成します。

      ソース /load.ddl
  5. 主キーと外部キーを作成します。

    ソース /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の仕事; 
  6. (オプション) インデックスの作成

    #!/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"
    完了 
  7. クエリを実行します。

    #!/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

テスト結果

並列クエリのパフォーマンステストの結果の詳細については、「並列クエリシナリオでのパフォーマンステストの結果」をご参照ください。