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

# はじめに

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

[[OCI] MySQLデータベースサービス(MDS) へオブジェクトストレージからTPC-Hデータをインポートしてみる](https://qiita.com/cocotaro0202/items/63195c90975916b8fa9e)



## HeatWave

HeatWaveは、MySQL Database Service(MDS)専用のクエリ・アクセラレーターで、インメモリ＆超並列処理により読取り処理を超高速化する分析エンジンです。ETLを使わずにOLTPエンジンのMySQLと分析エンジンHeatWaveが連携して高速なデータウェアハウスを構築することが可能です。
![image-20211217103803121.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/b1b7417e-5ceb-77f1-26c8-021820824a0b.png)

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

# お試し環境
![image-20211220094657304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/0481b2f8-4d5c-98d3-e9ec-848da2a08a52.png)

## 前提

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

- チューニング等は実施していません（デフォルトのまま）

  

# HeatWaveクラスタの追加

[HeatWave Quickstart](https://docs.oracle.com/en-us/iaas/mysql-database/doc/heatwave1.html#MYAAS-GUID-AD2F350D-E2AE-4AFF-BD12-54449D403F85)  ドキュメントにそって、HeatWave用MDSにHeatWaveクラスタを追加します。
![image-20211217105723785.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/bd2d2a53-b138-4fc6-b4df-a52329c0cc19.png)


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

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

- OCPU数: 16

- メモリー: 512 GB

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

- MySQLバージョン: 8.0.27

  

HeatWaveクラスタを追加します。左下の[リソース]から[HeatWave]を選択し、**HeatWaveクラスタの追加**をクリックします。
![image-20211216142042231.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/9cb6685f-917c-4308-651e-d9cd00cf7dde.png)
続いて、クラスタの構成を指定します。特に変更はせず、MySQLと同じシステム構成とし、ノードは最小の２台構成とします。
![image-20211216142114370.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/dcdffe04-7748-0cdf-311f-04ad1260c67d.png)

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

**HeatWaveクラスタの追加**をクリックすると、約１分でHeatWaveノードが２つ追加されました。
![image-20211216142918564.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/ff412af1-701f-c0fd-c451-5556d594bf69.png)
# HeatWaveクラスタへのTPC-Hデータのロード

[HeatWave Quickstart](https://docs.oracle.com/en-us/iaas/mysql-database/doc/heatwave1.html#MYAAS-GUID-AD2F350D-E2AE-4AFF-BD12-54449D403F85)  ドキュメントにそって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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/1476c33b-155b-aefe-4c3e-a99293dd32f1.png)
以上で、８つのデータテーブルすべての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回ほどクエリを実行して、合計４回のクエリ実行で次の結果が得られました。

| 実行回数           | 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回ほどクエリを実行して、合計４回のクエリ実行で次の結果が得られました。

| 実行回数           | 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は初回のクエリ結果に比べると、２回目以降の結果がさらに高速化されてました。ウォームアップすることでさらに高速化が最適化されたのかも(憶測レベル)しれません。

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



### 結果サマリ

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



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

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

- 性能テスト手順は、[HeatWave Quickstart](https://docs.oracle.com/en-us/iaas/mysql-database/doc/heatwave1.html#MYAAS-GUID-AD2F350D-E2AE-4AFF-BD12-54449D403F85) の手順をそのまま実行
- テスト環境は、前述 ”HeatWaveクラスタの追加” 章に記載のシェイプ、及びスペックを使用



# まとめ

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



# 参考URL

[HeatWave Quickstart](https://docs.oracle.com/en-us/iaas/mysql-database/doc/heatwave1.html#MYAAS-GUID-AD2F350D-E2AE-4AFF-BD12-54449D403F85)