3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[OCI] MySQLデータベースサービス(MDS) HeatWaveの性能比較テストをやってみた

Posted at

はじめに

前回の投稿でTPC-Hデータを実際にインストールして、HeatWave専用のMySQLデータベースサービス(MDS)へインポートするところまでを実施しました。HeatWave専用MDSへTPC-Hデータも格納出来てHeatWaveをテストする準備が整いました。

[OCI] MySQLデータベースサービス(MDS) へオブジェクトストレージからTPC-Hデータをインポートしてみる

HeatWave

HeatWaveは、MySQL Database Service(MDS)専用のクエリ・アクセラレーターで、インメモリ&超並列処理により読取り処理を超高速化する分析エンジンです。ETLを使わずにOLTPエンジンのMySQLと分析エンジンHeatWaveが連携して高速なデータウェアハウスを構築することが可能です。
image-20211217103803121.png

今回はOLTPエンジンのMySQLと、HeatWaveで同じクエリを発行して性能の違いを確認してみます。

お試し環境

image-20211220094657304.png

前提

  • テスト用データ(TPC-H 10GB) は既にMySQLへインポートし動作確認済み

  • チューニング等は実施していません(デフォルトのまま)

HeatWaveクラスタの追加

HeatWave Quickstart ドキュメントにそって、HeatWave用MDSにHeatWaveクラスタを追加します。
image-20211217105723785.png

[DBシステムの詳細]に記載がありますがMySQLのシステム構成は以下のとおりです。

  • シェイプ: MySQL.HeatWave.VM.Standard.E3 シェイプ

  • OCPU数: 16

  • メモリー: 512 GB

  • ストレージ・サイズ: 1TB

  • MySQLバージョン: 8.0.27

HeatWaveクラスタを追加します。左下の[リソース]から[HeatWave]を選択し、HeatWaveクラスタの追加をクリックします。
image-20211216142042231.png
続いて、クラスタの構成を指定します。特に変更はせず、MySQLと同じシステム構成とし、ノードは最小の2台構成とします。
image-20211216142114370.png

  • シェイプ: MySQL.HeatWave.VM.Standard.E3 シェイプ
  • OCPU数: 16
  • メモリー: 512 GB
  • ストレージ・サイズ: 1TB

HeatWaveクラスタの追加をクリックすると、約1分でHeatWaveノードが2つ追加されました。
image-20211216142918564.png

HeatWaveクラスタへのTPC-Hデータのロード

HeatWave Quickstart ドキュメントにそってHeatWaveクラスタへTPC-Hデータをロードします。

踏み台サーバへ接続

踏み台サーバーへ接続します。

ssh -i ~/.ssh/id_rsa opc@168.138.44.xxx

MySQLシェルからMDSへ接続

踏み台サーバーでMDSのエンドポイントに接続します。

mysqlsh --mysql admin@192.168.100.86

TPC-HデータをHeatWaveクラスタへロードする

MySQLシェルを、JavaScript実行モードからSQL実行モードへ切り替えて以下のコマンドを実行します。以下にはSECONDARY_LOAD操作の実行が含まれおり、HeatWaveへのデータロードが行われます。

USE tpch;

ALTER TABLE nation modify `N_NAME` CHAR(25) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
ALTER TABLE nation modify `N_COMMENT` VARCHAR(152) COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
ALTER TABLE nation SECONDARY_ENGINE=RAPID;
ALTER TABLE nation SECONDARY_LOAD;

ALTER TABLE region modify `R_NAME` CHAR(25) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
ALTER TABLE region modify `R_COMMENT` VARCHAR(152) COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
ALTER TABLE region SECONDARY_ENGINE=RAPID;
ALTER TABLE region SECONDARY_LOAD;

ALTER TABLE part modify `P_MFGR` CHAR(25) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
ALTER TABLE part modify `P_BRAND` CHAR(10) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
ALTER TABLE part modify `P_CONTAINER` CHAR(10) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
ALTER TABLE part modify `P_COMMENT` VARCHAR(23) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
ALTER TABLE part SECONDARY_ENGINE=RAPID;
ALTER TABLE part SECONDARY_LOAD;

ALTER TABLE supplier modify `S_NAME` CHAR(25) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
ALTER TABLE supplier modify `S_ADDRESS` VARCHAR(40) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
ALTER TABLE supplier modify `S_PHONE` CHAR(15) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
ALTER TABLE supplier SECONDARY_ENGINE=RAPID;
ALTER TABLE supplier SECONDARY_LOAD;

ALTER TABLE partsupp modify `PS_COMMENT` VARCHAR(199) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
ALTER TABLE partsupp SECONDARY_ENGINE=RAPID;
ALTER TABLE partsupp SECONDARY_LOAD;

ALTER TABLE customer modify `C_NAME` VARCHAR(25) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
ALTER TABLE customer modify `C_ADDRESS` VARCHAR(40) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
ALTER TABLE customer modify `C_MKTSEGMENT` CHAR(10) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
ALTER TABLE customer modify `C_COMMENT` VARCHAR(117) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
ALTER TABLE customer SECONDARY_ENGINE=RAPID;
ALTER TABLE customer SECONDARY_LOAD;

ALTER TABLE orders modify `O_ORDERSTATUS` CHAR(1) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
ALTER TABLE orders modify `O_ORDERPRIORITY` CHAR(15) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
ALTER TABLE orders modify `O_CLERK` CHAR(15) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
ALTER TABLE orders SECONDARY_ENGINE=RAPID;
ALTER TABLE orders SECONDARY_LOAD;

ALTER TABLE lineitem modify `L_RETURNFLAG` CHAR(1) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
ALTER TABLE lineitem modify `L_LINESTATUS` CHAR(1) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
ALTER TABLE lineitem modify `L_SHIPINSTRUCT` CHAR(25) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
ALTER TABLE lineitem modify `L_SHIPMODE` CHAR(10) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
ALTER TABLE lineitem modify `L_COMMENT` VARCHAR(44) NOT NULL COMMENT 'RAPID_COLUMN=ENCODING=SORTED';
ALTER TABLE lineitem SECONDARY_ENGINE=RAPID;
ALTER TABLE lineitem SECONDARY_LOAD;

最後の一番データ量の多い lineitem は 約54秒ほどかかりました。
image-20211216143654242.png
以上で、8つのデータテーブルすべてのHeatWaveクラスタへのデータロードが完了しました。

HeatWaveクラスタへロードされたことを確認

次のSQLクエリを発行して、TPC-HサンプルデータベースがHeatWaveクラスタにロードされているかを確認します。

MySQL SQL > USE performance_schema;
MySQL SQL > SELECT NAME, LOAD_STATUS FROM rpd_tables,rpd_table_id WHERE rpd_tables.ID = rpd_table_id.ID;
+---------------+---------------------+
| NAME          | LOAD_STATUS         |
+---------------+---------------------+
| tpch.supplier | AVAIL_RPDGSTABSTATE |
| tpch.partsupp | AVAIL_RPDGSTABSTATE |
| tpch.orders   | AVAIL_RPDGSTABSTATE |
| tpch.lineitem | AVAIL_RPDGSTABSTATE |
| tpch.customer | AVAIL_RPDGSTABSTATE |
| tpch.nation   | AVAIL_RPDGSTABSTATE |
| tpch.region   | AVAIL_RPDGSTABSTATE |
| tpch.part     | AVAIL_RPDGSTABSTATE |
+---------------+---------------------+

LOAD_STATUS が、AVAIL_RPDGSTABSTATE となっており、テーブルのステータスはロードされていることが確認できました。

TPC-Hクエリ実行

TPC-Hサンプルデータ(10GB)がHeatWaveクラスタにロードされ準備が整ったので、TPC-Hクエリの実行へと進みます。

HeatWaveクラスタの実行結果

tpchデータベースに変更します。

MySQL SQL > USE tpch;
Default schema set to `tpch`.
Fetching table and column names from `tpch` for auto-completion... Press ^C to stop.

クエリを実行する前に、クエリがHeatWaveにオフロードされるかを EXPLAIN を使って確認します。

MySQL tpch  SQL > EXPLAIN SELECT SUM(l_extendedprice * l_discount) AS revenue FROM lineitem WHERE l_shipdate >= date '1994-01-01'\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: lineitem
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 56716432
     filtered: 33.33
        Extra: Using where; Using secondary engine RAPID

最終行の Extra: で ”Using secondary engine RAPID" とあり、オフロードされることが確認できました。

クエリを実行します。

MySQL tpch  SQL > SELECT SUM(l_extendedprice * l_discount) AS revenue FROM lineitem WHERE l_shipdate >= date '1994-01-01';
+------------------+
| revenue          |
+------------------+
| 82752893131.7460 |
+------------------+
1 row in set (0.0560 sec)

lineitem から revenue を算出するクエリの実行時間は、初回は 0.0560秒 でした。
続けて3回ほどクエリを実行して、合計4回のクエリ実行で次の結果が得られました。

実行回数 1回目 2回目 3回目 4回目
クエリ実行結果(秒) 0.0560 0.0229 0.0191 0.0197

MySQLの実行結果

use_secondary_engine=OFF にすることで、HeatWaveは使われずMySQLサーバーノードのみでの処理となります。OFFにセットした後に、同じクエリを実行します。

MySQL tpch SQL > SET SESSION use_secondary_engine=OFF;
MySQL tpch SQL > SELECT SUM(l_extendedprice * l_discount) AS revenue FROM lineitem WHERE l_shipdate >= date '1994-01-01';
+------------------+
| revenue          |
+------------------+
| 82752893131.7460 |
+------------------+
1 row in set (17.1917 sec)

実行時間は、17.1917秒 でした。
続けて3回ほどクエリを実行して、合計4回のクエリ実行で次の結果が得られました。

実行回数 1回目 2回目 3回目 4回目
クエリ実行結果(秒) 17.1917 17.2790 17.2934 17.3086

結果サマリ

MySQL と HeatWave のクエリ結果を並べてみます。

1回目 2回目 3回目 4回目
HeatWave (use_secondary_engine) 0.0560 0.0229 0.0191 0.0197
MySQL (use_secondary_engine=OFF) 17.1917 17.279 17.2934 17.3086

傾向

  • HeatWaveは初回のクエリ結果に比べると、2回目以降の結果がさらに高速化されてました。ウォームアップすることでさらに高速化が最適化されたのかも(憶測レベル)しれません。

  • MySQLの結果は、ほぼ同等のクエリ結果でした。

結果サマリ

  • HeatWave の初回結果(最も遅い結果:0.0560秒)とMySQLの平均値(17.2682秒)の比較
    • HeatWaveは約300倍(308.36)高速にクエリを実行しました。
  • 4回計測の平均値での単純比較
    • HeatWaveは約580倍(586.85)高速にクエリを実行しました。
  • 4回計測での最速結果値の比較
    • HeatWaveは約900倍(900.09)高速にクエリを実行しました。

※上記の結果はあくまで個人の環境で実際に計測した結果に基づきます。公式のものではありませんのご注意ください。

  • TPC-H サンプルデータ 10GB を使用

  • 性能テスト手順は、HeatWave Quickstart の手順をそのまま実行

  • テスト環境は、前述 ”HeatWaveクラスタの追加” 章に記載のシェイプ、及びスペックを使用

まとめ

MySQL Database Service(MDS)専用のクエリ・アクセラレーターであるHeatWaveにより、MySQLのクエリ処理を数百倍のレベルで処理時間を短縮できることが確認できました。HeatWaveが非常に強力なクエリ分析エンジンであることが実感できました!

参考URL

HeatWave Quickstart

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?