こちらの記事の続きです。
現状、MySQL HeatWave on AWS のシェイプサイズや HeatWave Cluster 構成を変えるには、(1) に記したとおりバックアップからのリストアかダンプデータのインポートが必要です。
今回、実際にバックアップからのリストアにあわせてシェイプサイズや HeatWave Cluster 構成を変更し、(2) と同じクエリの所要時間を比較してみました。
2023/7/25 時点の情報です。
今後、画面構成や手順、結果などが変わる可能性があります。
2023/9/9 追記:
2023/8/8 のリリースで MySQL DB のストレージサイズをオンライン拡張できるようになりました。
https://dev.mysql.com/doc/heatwave-aws/en/heatwave-aws-increase-dbsystem-storage.html#GUID-F2BF290C-1F9C-4B66-A730-44F7B46FDCC0
バックアップをリストアする
マネージドサービスですので手順は簡単です。
一覧から対象バックアップを選択
「State」 が Active なバックアップを選択して 「Restore Backup」 をクリックします。
リストア先の MySQL DB を設定
画面右側に設定項目が表示されるので入力・選択していきます。
新規の MySQL DB を作成する場合と同じです。
既存の MySQL DB・HeatWave Cluster とは別に作成されます。
HeatWave Cluster を設定
こちらも新規作成と同様です。
「Restore」 でリストア開始です。
しばらく待って 「State」 と 「HeatWave State」 が Active になったら作成完了です。
リストアしたデータでクエリを実行する
HeatWave 無効状態で実行
まずはSET SESSION use_secondary_engine=OFF;
で HeatWave を無効にして試します。
mysql> USE tpch;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> SET SESSION use_secondary_engine=OFF;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT
-> l_returnflag,
-> l_linestatus,
-> SUM(l_quantity) AS sum_qty,
-> SUM(l_extendedprice) AS sum_base_price,
-> SUM(l_extendedprice * (1 - l_discount)) AS sum_disc_price,
-> SUM(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge,
-> AVG(l_quantity) AS avg_qty,
-> AVG(l_extendedprice) AS avg_price,
-> AVG(l_discount) AS avg_disc,
-> COUNT(*) AS count_order
-> FROM
-> lineitem
-> WHERE
-> l_shipdate <= DATE '1998-12-01' - INTERVAL '90' DAY
-> GROUP BY l_returnflag , l_linestatus
-> ORDER BY l_returnflag , l_linestatus;
+--------------+--------------+-------------+-----------------+-------------------+---------------------+-----------+--------------+----------+-------------+
| l_returnflag | l_linestatus | sum_qty | sum_base_price | sum_disc_price | sum_charge | avg_qty | avg_price | avg_disc | count_order |
+--------------+--------------+-------------+-----------------+-------------------+---------------------+-----------+--------------+----------+-------------+
| A | F | 37734107.00 | 56586554400.73 | 53758257134.8700 | 55909065222.827692 | 25.522006 | 38273.129735 | 0.049985 | 1478493 |
| N | F | 991417.00 | 1487504710.38 | 1413082168.0541 | 1469649223.194375 | 25.516472 | 38284.467761 | 0.050093 | 38854 |
| N | O | 74476040.00 | 111701729697.74 | 106118230307.6056 | 110367043872.497010 | 25.502227 | 38249.117989 | 0.049997 | 2920374 |
| R | F | 37719753.00 | 56568041380.90 | 53741292684.6040 | 55889619119.831932 | 25.505794 | 38250.854626 | 0.050009 | 1478870 |
+--------------+--------------+-------------+-----------------+-------------------+---------------------+-----------+--------------+----------+-------------+
4 rows in set (14.91 sec)
リストア後 1 回目はバッファプールに載っていない状態なので結果を無視し、その後の 5 回中最大値・最小値を除く 3 回分を平均して結果を出してみます(結果は後ほどまとめて記載)。
HeatWave 有効状態で実行
続いてSET SESSION use_secondary_engine=ON;
で HeatWave を有効にして試します。
mysql> SET SESSION use_secondary_engine=ON;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT
-> l_returnflag,
-> l_linestatus,
-> SUM(l_quantity) AS sum_qty,
-> SUM(l_extendedprice) AS sum_base_price,
-> SUM(l_extendedprice * (1 - l_discount)) AS sum_disc_price,
-> SUM(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge,
-> AVG(l_quantity) AS avg_qty,
-> AVG(l_extendedprice) AS avg_price,
-> AVG(l_discount) AS avg_disc,
-> COUNT(*) AS count_order
-> FROM
-> lineitem
-> WHERE
-> l_shipdate <= DATE '1998-12-01' - INTERVAL '90' DAY
-> GROUP BY l_returnflag , l_linestatus
-> ORDER BY l_returnflag , l_linestatus;
+--------------+--------------+-------------+-----------------+-------------------+---------------------+-----------+--------------+----------+-------------+
| l_returnflag | l_linestatus | sum_qty | sum_base_price | sum_disc_price | sum_charge | avg_qty | avg_price | avg_disc | count_order |
+--------------+--------------+-------------+-----------------+-------------------+---------------------+-----------+--------------+----------+-------------+
| A | F | 37734107.00 | 56586554400.73 | 53758257134.8700 | 55909065222.827692 | 25.522006 | 38273.129735 | 0.049985 | 1478493 |
| N | F | 991417.00 | 1487504710.38 | 1413082168.0541 | 1469649223.194375 | 25.516472 | 38284.467761 | 0.050093 | 38854 |
| N | O | 74476040.00 | 111701729697.74 | 106118230307.6056 | 110367043872.497010 | 25.502227 | 38249.117989 | 0.049997 | 2920374 |
| R | F | 37719753.00 | 56568041380.90 | 53741292684.6040 | 55889619119.831932 | 25.505794 | 38250.854626 | 0.050009 | 1478870 |
+--------------+--------------+-------------+-----------------+-------------------+---------------------+-----------+--------------+----------+-------------+
4 rows in set (12.74 sec)
あれ?速くなりませんね?
念のため、テーブルにセカンダリエンジンを指定してみます。
mysql> ALTER TABLE tpch.customer SECONDARY_ENGINE=RAPID;
ERROR 3889 (HY000): Secondary engine operation failed. Table already has a secondary engine defined.
mysql> ALTER TABLE tpch.lineitem SECONDARY_ENGINE=RAPID;
ERROR 3889 (HY000): Secondary engine operation failed. Table already has a secondary engine defined.
mysql> ALTER TABLE tpch.nation SECONDARY_ENGINE=RAPID;
ERROR 3889 (HY000): Secondary engine operation failed. Table already has a secondary engine defined.
mysql> ALTER TABLE tpch.orders SECONDARY_ENGINE=RAPID;
ERROR 3889 (HY000): Secondary engine operation failed. Table already has a secondary engine defined.
mysql> ALTER TABLE tpch.part SECONDARY_ENGINE=RAPID;
ERROR 3889 (HY000): Secondary engine operation failed. Table already has a secondary engine defined.
mysql> ALTER TABLE tpch.partsupp SECONDARY_ENGINE=RAPID;
ERROR 3889 (HY000): Secondary engine operation failed. Table already has a secondary engine defined.
mysql> ALTER TABLE tpch.region SECONDARY_ENGINE=RAPID;
ERROR 3889 (HY000): Secondary engine operation failed. Table already has a secondary engine defined.
mysql> ALTER TABLE tpch.supplier SECONDARY_ENGINE=RAPID;
ERROR 3889 (HY000): Secondary engine operation failed. Table already has a secondary engine defined.
全てのテーブルで実行するまでもありませんでしたが、こちらは「すでに指定されている」状態でした。
HeatWave へのデータロードは…?
mysql> ALTER TABLE tpch.customer SECONDARY_LOAD;
Query OK, 0 rows affected (2.02 sec)
mysql> ALTER TABLE tpch.lineitem SECONDARY_LOAD;
Query OK, 0 rows affected (38.47 sec)
mysql> ALTER TABLE tpch.nation SECONDARY_LOAD;
Query OK, 0 rows affected (0.50 sec)
mysql> ALTER TABLE tpch.orders SECONDARY_LOAD;
Query OK, 0 rows affected (10.44 sec)
mysql> ALTER TABLE tpch.part SECONDARY_LOAD;
Query OK, 0 rows affected (2.19 sec)
mysql> ALTER TABLE tpch.partsupp SECONDARY_LOAD;
Query OK, 0 rows affected (6.93 sec)
mysql> ALTER TABLE tpch.region SECONDARY_LOAD;
Query OK, 0 rows affected (0.99 sec)
mysql> ALTER TABLE tpch.supplier SECONDARY_LOAD;
Query OK, 0 rows affected (0.44 sec)
バックアップからのリストアの場合、HeatWave へのデータロードを明示的に実行しないといけない ようですね。
実行結果
いくつかシェイプサイズや HeatWave Cluster 構成を変えて試してみました。
MySQL DB シェイプ | HeatWave Cluster 構成 | MySQL(秒) | HeatWave(秒) | MySQL / HeatWave(倍) |
---|---|---|---|---|
2vCPU・Mem16GB・Disk32GB | 16GBx1 | 13.07 | 0.75 | 17.4 |
4vCPU・Mem32GB・Disk64GB | 16GBx2 | 12.75 | 0.42 | 30.4 |
8vCPU・Mem64GB・Disk128GB | 16GBx4 | 12.66 | 0.25 | 50.6 |
32vCPU・Mem256GB・Disk512GB | 256GBx1 | 12.64 | 0.08 | 158.0 |
MySQL DB のみでの処理時間はシェイプサイズに関わらずほぼ同じですが、これは MySQL では(テーブル全行のSELECT COUNT(*)
など一部の例外を除き)パラレルクエリに対応していないからでしょうね。
それに対して、 HeatWave Cluster 構成については、全ノードの合計メモリ容量(と vCPU 数)を増やせば増やすほど高速化 しました。
サンプルデータそのものは 1GB に満たない容量ですが、それでも合計メモリ容量増加の効果が出るのがポイントです。
2023/7/29 追記:
続きを書きました。