MySQL Database Service – 情報を見つける: パート 5 – HeatWave (2023/03/30)

MySQL Database Service – 情報を見つける: パート 5 – HeatWave (2023/03/30)

https://blogs.oracle.com/mysql/post/mysql-database-service---find-the-info-part-4---heatwave

投稿者: Frederic Descamps | MySQL Community Manager


Oracle Cloud InfrastructureでMySQL Database Serviceを使用するときに情報を見つける方法に関するこの新しい記事では、クエリアクセラレータであるHeatWaveについて学習します。


HeatWave を使用すると、MySQL クエリのパフォーマンスを向上させ、アプリケーションに高速で信頼性が高く、費用対効果の高いデータ アクセスを提供できます。


HeatWave は、Oracle Cloud Infrastructure 上の MySQL Database Service 用の高性能インメモリ クエリアクセラレータです。分析ワークロード (OLAP) を高速化し、MySQL データベースのパフォーマンスを桁違いに向上させるように設計されています。これは、メモリ内処理、高度なアルゴリズム、機械学習技術を使用してクエリのパフォーマンスを最適化することで実現されます。オプティマイザによって識別された場合、OLTP リクエストも HeatWave を使用して高速化できます。


この記事では、次の質問に答えようとします。


  1. HeatWaveは使えますか?
  2. HeatWaveが有効になっていますか?
  3. 私のデータは HeatWave の恩恵を受ける準備ができていますか?
  4. 私のクエリは高速化されていますか?
  5. クエリが高速化されないのはなぜですか?
  6. 機械学習は、データが HeatWave にロードされる方法を改善できますか?

上記の質問は、OCI で MDS を使用する MySQL DBA が定期的に回答する必要があるものです。



HeatWaveは使えますか?

OCI で MySQL Database Serviceに HeatWave を使用できるようにするには、MySQL シェイプ が HeatWave と互換性がある必要があります。


新しいDBシステムを作成する場合、スタンドアロン、高可用性またはHeatWaveシステムを選択できます:



HeatWave を選択すると、テナンシーで利用可能なすべての HeatWave 互換シェイプを選択できます。



ただし、HeatWave 互換のシェイプを選択したとしても、HeatWave クラスタが既に有効になっているわけではありません。


たとえば、以前の記事で使用した DB システムを確認すると、HeatWave 互換のシェイプであっても、HeatWave クラスタがまだ有効になっていないことがわかります。



はい、HeatWave はこのシステムで使用できますが、HeatWave クラスタが作成されるのは一度だけです。



HeatWaveが有効になっていますか?

HeatWave 互換のシェイプを使用しても、HeatWave はデフォルトでは有効になっていないことがわかりました。


上の図のHeatWave クラスタ: 無効の横にある[編集]をクリックするか、左側のメニューで[HeatWave]を選択します。



HeatWave クラスタを作成する前に、HeatWave サービスの準備ができているかどうかを SQL インターフェイスで確認することもできます。


show global status like 'rapid_service_status';
+----------------------+---------+
| Variable_name        | Value   |
+----------------------+---------+
| rapid_service_status | OFFLINE |
+----------------------+---------+
1 row in set (0.0011 sec)


OFFLINE は準備ができていないことを意味します。HeatWave のストレージエンジンの名前はRAPIDです。


クラスタが作成されると、HeatWave が有効になっていることがわかります。





そしてSQLでは:


select * from performance_schema.global_status 
         where variable_name in ('rapid_resize_status',
               'rapid_service_status','rapid_cluster_ready_number');
+----------------------------+--------------------+
| VARIABLE_NAME              | VARIABLE_VALUE     |
+----------------------------+--------------------+
| rapid_cluster_ready_number | 1                  |
| rapid_resize_status        | RESIZE_UNSUPPORTED |
| rapid_service_status       | ONLINE             |
+----------------------------+--------------------+
3 rows in set (0.0009 sec)



私のデータは HeatWave の恩恵を受ける準備ができていますか?

HeatWave を活用するには、データを HeatWave クラスタにロードする必要があります。


この操作を実行する最良の方法は、HeatWave クラスタを有効にするときに推定ノード操作を使用することです。





ロードするデータベースを選択します。



したがって、そのスキーマ (airportdb) からすべてのテーブルをロードする場合は、そのプロシージャを呼び出すことができます。


Visual Studio Code に MySQL Shell を使用している場合は、スキーマを HeatWave に簡単にロードすることもできます。





次のクエリを使用して、HeatWave にロードされているテーブルを確認することもできます。


select name, load_progress, load_status, query_count
       from performance_schema.rpd_tables
       join performance_schema.rpd_table_id using(id);
+-----------------------------+---------------+---------------------+-------------+
| name                        | load_progress | load_status         | query_count |
+-----------------------------+---------------+---------------------+-------------+
| airportdb.flight_log        |           100 | AVAIL_RPDGSTABSTATE |           0 |
| airportdb.airport_geo       |           100 | AVAIL_RPDGSTABSTATE |           0 |
| airportdb.flight            |           100 | AVAIL_RPDGSTABSTATE |           0 |
| airportdb.passengerdetails  |           100 | AVAIL_RPDGSTABSTATE |           0 |
| airportdb.passenger         |           100 | AVAIL_RPDGSTABSTATE |           0 |
| airportdb.airplane          |           100 | AVAIL_RPDGSTABSTATE |           0 |
| airportdb.weatherdata       |           100 | AVAIL_RPDGSTABSTATE |           0 |
| airportdb.flightschedule    |           100 | AVAIL_RPDGSTABSTATE |           0 |
| airportdb.booking           |           100 | AVAIL_RPDGSTABSTATE |           0 |
| airportdb.employee          |           100 | AVAIL_RPDGSTABSTATE |           0 |
| airportdb.airplane_type     |           100 | AVAIL_RPDGSTABSTATE |           0 |
| airportdb.seat_sold         |           100 | AVAIL_RPDGSTABSTATE |           0 |
| airportdb.airport           |           100 | AVAIL_RPDGSTABSTATE |           0 |
| airportdb.airline           |           100 | AVAIL_RPDGSTABSTATE |           0 |
| airportdb.airport_reachable |           100 | AVAIL_RPDGSTABSTATE |           0 |
+-----------------------------+---------------+---------------------+-------------+
15 rows in set (0.0008 sec)


テーブルがHeatWave に正常にロードされると、そのステータスはAVAIL_RPDGSTABSTATEになります。


OCI MDS Web コンソールには、HeatWave で使用できるいくつかのメトリックもあります。これは負荷の例です。





私のクエリは高速化されていますか?

クエリ実行計画 (QEP) は、クエリが HeatWave にオフロードされているかどうかを判断するための適切な情報を提供します。


QEP はEXPLAINキーワードを使用して生成されます。



セカンダリ エンジンの RAPID に表示される場合、クエリが実際に HeatWave を使用して高速化されていることを意味します。


HeatWave を使用してクエリを高速化するとインクリメントされるステータス変数もあります。


show  status like 'rapid_query_offload_count';
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| rapid_query_offload_count | 2     |
+---------------------------+-------+
1 row in set (0.0011 sec)


また、以前に使用したperformance_schemaテーブルで再度確認することもできます。


select name, load_progress, load_status, query_count
  from performance_schema.rpd_tables         
  join performance_schema.rpd_table_id using(id) where query_count > 0;
+--------------------+---------------+---------------------+-------------+
| name               | load_progress | load_status         | query_count |
+--------------------+---------------+---------------------+-------------+
| airportdb.flight   |           100 | AVAIL_RPDGSTABSTATE |           2 |
| airportdb.airplane |           100 | AVAIL_RPDGSTABSTATE |           2 |
| airportdb.booking  |           100 | AVAIL_RPDGSTABSTATE |           2 |
| airportdb.airline  |           100 | AVAIL_RPDGSTABSTATE |           2 |
+--------------------+---------------+---------------------+-------------+
4 rows in set (0.0008 sec)


HeatWave クラスタによって処理されたステートメントの数を収集するメトリックもあります。


クエリのクエリ実行プランのセカンダリエンジン RAPID に次の文が表示されない場合は、クエリが HeatWave にオフロードされないことを意味します。



HeatWave を使用してクエリによってスキャンされたデータの量を追跡する優れたステータス変数もあります。値はメガバイト単位です。


show global status like 'hw_data%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| hw_data_scanned | 444   |
+-----------------+-------+
1 row in set (0.0009 sec)



クエリが高速化されないのはなぜですか?

クエリで HeatWave を使用しない理由がいくつかある場合があります。制限事項を参照してください(OCI のすべてのリリースでいくつかの制限事項が削除されるため、定期的に確認してください)。


クエリが HeatWave クラスタにオフロードされない理由を調べるには、optimizer_trace を使用します。



この特定のクエリでは、HeatWave が使用されていないことがわかります。クエリのコストが、クエリが HeatWave にオフロードされるしきい値を下回っているためです。




機械学習は、データが HeatWave にロードされる方法を改善できますか?

短い答えはイエスです!MySQL HeatWave は、機械学習モデル、データ分析、および HeatWave クエリ履歴を使用して、ワークロードに基づいて推奨事項を提供できるMachine Learning Advisorを提供します。


そのため、HeatWave をしばらく使用した後、または新しいインポートのように大量のデータを変更した後は、オートパイロット レポートを作成するこれらの ML Advisor を使用することをお勧めします。


自動エンコード

Auto Encoding は、必要なメモリの量を減らしてパフォーマンスを向上させるために、文字列列を HeatWave でエンコードする方法を推奨しています。


CALL sys.heatwave_advisor(JSON_OBJECT("auto_enc",JSON_OBJECT("mode","recommend")));


出力は、提案をリストしたレポートです。


+-------------------------------+
| INITIALIZING HEATWAVE ADVISOR |
+-------------------------------+
| Version: 1.44                 |
|                               |
| Output Mode: normal           |
| Excluded Queries: 0           |
| Target Schemas: All           |
|                               |
+-------------------------------+
6 rows in set (0.0110 sec)

+---------------------------------------------------------+
| ANALYZING LOADED DATA                                   |
+---------------------------------------------------------+
| Total 15 tables loaded in HeatWave for 1 schemas        |
| Tables excluded by user: 0 (within target schemas)      |
|                                                         |
| SCHEMA                            TABLES        COLUMNS |
| NAME                              LOADED         LOADED |
| ------                            ------         ------ |
| `airportdb`                           15            107 |
|                                                         |
+---------------------------------------------------------+
8 rows in set (0.0110 sec)

+------------------------------------------------------------------------------------------------------+
| ENCODING SUGGESTIONS                                                                                 |
+------------------------------------------------------------------------------------------------------+
| Total Auto Encoding suggestions produced for 22 columns                                              |
| Queries executed: 9                                                                                  |
|   Total query execution time: 621.48 ms                                                              |
|   Most recent query executed on: Wednesday 22nd March 2023 19:48:25                                  |
|   Oldest query executed on: Wednesday 22nd March 2023 19:47:07                                       |
|                                                                                                      |
|                                                              CURRENT           SUGGESTED             |
| COLUMN                                                        COLUMN              COLUMN             |
| NAME                                                        ENCODING            ENCODING             |
| ------                                                      --------           ---------             |
| `airportdb`.`airline`.`airlinename`                           VARLEN          DICTIONARY             |
| `airportdb`.`airplane_type`.`description`                     VARLEN          DICTIONARY             |
| `airportdb`.`airplane_type`.`identifier`                      VARLEN          DICTIONARY             |
| `airportdb`.`airport`.`name`                                  VARLEN          DICTIONARY             |
| `airportdb`.`airport_geo`.`city`                              VARLEN          DICTIONARY             |
| `airportdb`.`airport_geo`.`country`                           VARLEN          DICTIONARY             |
| `airportdb`.`airport_geo`.`name`                              VARLEN          DICTIONARY             |
| `airportdb`.`employee`.`city`                                 VARLEN          DICTIONARY             |
| `airportdb`.`employee`.`country`                              VARLEN          DICTIONARY             |
| `airportdb`.`employee`.`emailaddress`                         VARLEN          DICTIONARY             |
| `airportdb`.`employee`.`lastname`                             VARLEN          DICTIONARY             |
| `airportdb`.`employee`.`password`                             VARLEN          DICTIONARY             |
| `airportdb`.`employee`.`street`                               VARLEN          DICTIONARY             |
| `airportdb`.`employee`.`telephoneno`                          VARLEN          DICTIONARY             |
| `airportdb`.`employee`.`username`                             VARLEN          DICTIONARY             |
| `airportdb`.`passenger`.`lastname`                            VARLEN          DICTIONARY             |
| `airportdb`.`passenger`.`passportno`                          VARLEN          DICTIONARY             |
| `airportdb`.`passengerdetails`.`city`                         VARLEN          DICTIONARY             |
| `airportdb`.`passengerdetails`.`country`                      VARLEN          DICTIONARY             |
| `airportdb`.`passengerdetails`.`emailaddress`                 VARLEN          DICTIONARY             |
| `airportdb`.`passengerdetails`.`street`                       VARLEN          DICTIONARY             |
| `airportdb`.`passengerdetails`.`telephoneno`                  VARLEN          DICTIONARY             |
|                                                                                                      |
| Applying the suggested encodings might improve cluster memory usage. Performance gains not expected. |
|   Estimated HeatWave cluster memory savings:    0 bytes                                              |
|                                                                                                      |
+------------------------------------------------------------------------------------------------------+
36 rows in set (0.0110 sec)

+----------------------------------------------------------------------------------------------------------------+
| SCRIPT GENERATION                                                                                              |
+----------------------------------------------------------------------------------------------------------------+
| Script generated for applying suggestions for 7 loaded tables                                                  |
|                                                                                                                |
| Applying changes will take approximately 5.00 s                                                                |
|                                                                                                                |
| Retrieve script containing 57 generated DDL commands using the query below:                                    |
| Deprecation Notice: "heatwave_advisor_report" will be deprecated, please switch to "heatwave_autopilot_report" |
|   SELECT log->>"$.sql" AS "SQL Script" FROM sys.heatwave_autopilot_report WHERE type = "sql" ORDER BY id;      |
|                                                                                                                |
| Caution: Executing the generated script will alter the column comment and secondary engine flags in the schema |
|                                                                                                                |
+----------------------------------------------------------------------------------------------------------------+


以下を使用して、カット アンド ペーストする単一の文字列を生成できます。


SET SESSION group_concat_max_len = 1000000;
SELECT GROUP_CONCAT(log->>"$.sql" SEPARATOR ' ')
       FROM sys.heatwave_autopilot_report
       WHERE type = "sql" ORDER BY id;


推奨されるすべての DDL を実行した後、アドバイザーを再度実行すると、エンコーディングの提案がこれ以上ないことがわかります。


CALL sys.heatwave_advisor(JSON_OBJECT("auto_enc",JSON_OBJECT("mode","recommend")));
+-------------------------------+
| INITIALIZING HEATWAVE ADVISOR |
+-------------------------------+
| Version: 1.44                 |
|                               |
| Output Mode: normal           |
| Excluded Queries: 0           |
| Target Schemas: All           |
|                               |
+-------------------------------+
6 rows in set (0.0087 sec)

+---------------------------------------------------------+
| ANALYZING LOADED DATA                                   |
+---------------------------------------------------------+
| Total 14 tables loaded in HeatWave for 1 schemas        |
| Tables excluded by user: 0 (within target schemas)      |
|                                                         |
| SCHEMA                            TABLES        COLUMNS |
| NAME                              LOADED         LOADED |
| ------                            ------         ------ |
| `airportdb`                           14             92 |
|                                                         |
+---------------------------------------------------------+
8 rows in set (0.0087 sec)

+------------------------------------------+
| ENCODING SUGGESTIONS                     |
+------------------------------------------+
| No encoding suggestions can be generated |
|   Current encodings found to be the best |
+------------------------------------------+
2 rows in set (0.0087 sec)

Query OK, 0 rows affected (0.0087 sec)


自動データ配置

このアドバイザーは、さまざまな HeatWave ノード間でテーブル データを分割するために使用されるデータ配置キーに関する推奨事項を生成します。


CALL sys.heatwave_advisor(JSON_OBJECT("target_schema",JSON_ARRAY("airportdb")));


もちろん、このアドバイザーを使用するには、少なくとも 2 ノードの MySQL HeatWave クラスタが必要です。



Query Insights

この最後のアドバイザは実際には推奨事項を提供しませんが、正常に実行されたクエリのランタイム データ、EXPLAIN クエリのランタイム見積もり、キャンセルされたクエリ (ctrl+c)、およびメモリ不足エラーによる失敗したクエリを返します。


Query Insights Advisor を呼び出す方法は次のとおりです。


CALL sys.heatwave_advisor(JSON_OBJECT("query_insights", TRUE))


これは出力例です:


+-------------------------------+
| INITIALIZING HEATWAVE ADVISOR |
+-------------------------------+
| Version: 1.44                 |
|                               |
| Output Mode: normal           |
| Excluded Queries: 0           |
| Target Schemas: All           |
|                               |
+-------------------------------+
6 rows in set (0.0086 sec)

+---------------------------------------------------------+
| ANALYZING LOADED DATA                                   |
+---------------------------------------------------------+
| Total 14 tables loaded in HeatWave for 1 schemas        |
| Tables excluded by user: 0 (within target schemas)      |
|                                                         |
| SCHEMA                            TABLES        COLUMNS |
| NAME                              LOADED         LOADED |
| ------                            ------         ------ |
| `airportdb`                           14             92 |
|                                                         |
+---------------------------------------------------------+
8 rows in set (0.0086 sec)

+--------------------------------------------------------------------------------------------------------------------+
| QUERY INSIGHTS                                                                                                     |
+--------------------------------------------------------------------------------------------------------------------+
| Queries executed on Heatwave: 9                                                                                    |
| Session IDs (as filter): None                                                                                      |
|                                                                                                                    |
| QUERY-ID  SESSION-ID  QUERY-STRING                                                     EXEC-RUNTIME (s)  COMMENT   |
| --------  ----------  ------------                                                     ----------------  -------   |
|        1         950  SELECT airlinename 'Airline Name',         SUM(sold_seat)/SU...      0.447                   |
|        2         950  SELECT airlinename 'Airline Name',         SUM(sold_seat)/SU...      0.024 (est.)  Explain.  |
|        3         950  SELECT airlinename 'Airline Name',         SUM(sold_seat)/SU...      0.024 (est.)  Explain.  |
|        4         950  SELECT airlinename 'Airline Name',         SUM(sold_seat)/SU...      0.024 (est.)  Explain.  |
|        5         950  SELECT airlinename 'Airline Name',         SUM(sold_seat)/SU...      0.175                   |
|        6         950  SELECT airlinename 'Airline Name',         SUM(sold_seat)/SU...      0.019 (est.)  Explain.  |
|        7         950  SELECT airlinename 'Airline Name',         SUM(sold_seat)/SU...      0.019 (est.)  Explain.  |
|        8         950  SELECT airlinename 'Airline Name',         SUM(sold_seat)/SU...      0.019 (est.)  Explain.  |
|        9         950  SELECT airlinename 'Airline Name',         SUM(sold_seat)/SU...      0.019 (est.)  Explain.  |
|                                                                                                                    |
| TOTAL ESTIMATED:   7   EXEC-RUNTIME:       0.150 sec                                                               |
| TOTAL EXECUTED:    2   EXEC-RUNTIME:       0.621 sec                                                               |
|                                                                                                                    |
|                                                                                                                    |
| Retrieve detailed query statistics using the query below:                                                          |
|     SELECT log FROM sys.heatwave_autopilot_report WHERE stage = "QUERY_INSIGHTS" AND type = "info";                |
|                                                                                                                    |
+--------------------------------------------------------------------------------------------------------------------+
22 rows in set (0.0086 sec)



まとめ

MySQL HeatWave は非常に強力です。これで、それを制御し、クエリがそれから恩恵を受けることを確認する方法を理解できました。


HeatWave の使用状況を監視する方法と、機械学習オートパイロット アドバイザーを使用して、HeatWave エクスペリエンスを向上させる方法を学びました。


HeatWave の監視方法の詳細については、マニュアルを参照してください。



コメント

このブログの人気の投稿

Oracle RACによるメンテナンスのためのドレインとアプリケーション・コンティニュイティの仕組み (2023/11/01)

Oracle Cloud Infrastructure Secure Desktopsを発表: デスクトップ仮想化のためのOracleのクラウドネイティブ・サービス (2023/06/28)

Oracle Cloudのデータベースをオブジェクト・ストレージにバックアップする3つの方法 (2021/12/13)