MySQL 8.0 リファレンスマニュアル


28.4.4.25 statement_performance_analyzer() プロシージャ

サーバーで実行されているステートメントのレポートを作成します。 ビューは、全体またはデルタ (あるいはその両方) のアクティビティに基づいて計算されます。

このプロシージャは、sql_log_bin システム変数のセッション値を操作して、実行中にバイナリロギングを無効にします。 これは制限付き操作であるため、このプロシージャには制限付きセッション変数を設定するのに十分な権限が必要です。 セクション5.1.9.1「システム変数権限」を参照してください。

パラメータ
  • in_action ENUM('snapshot', 'overall', 'delta', 'create_tmp', 'create_table', 'save', 'cleanup'): 実行するアクション。 次の値を使用できます:

    • snapshot: スナップショットを格納します。 デフォルトでは、パフォーマンススキーマ events_statements_summary_by_digest テーブルの現在の内容のスナップショットが作成されます。 in_table を設定すると、これを上書きして、指定したテーブルのコンテンツをコピーできます。 スナップショットは、sys スキーマの tmp_digests 一時テーブルに格納されます。

    • overall: in_table で指定されたテーブルの内容に基づいて分析を生成します。 全体的な分析では、in_tableNOW() にして新しいスナップショットを使用できます。 これにより、既存のスナップショットが上書きされます。 既存のスナップショットを使用するには、NULL for in_table を使用します。 in_tableNULL で、スナップショットが存在しない場合は、新しいスナップショットが作成されます。 in_views パラメータおよび statement_performance_analyzer.limit 構成オプションは、このプロシージャの操作に影響します。

    • delta: デルタ分析を生成します。 デルタは、in_table で指定された参照テーブルとスナップショット (存在する必要があります) の間で計算されます。 このアクションでは、sys スキーマの tmp_digests_delta 一時テーブルが使用されます。 in_views パラメータおよび statement_performance_analyzer.limit 構成オプションは、このプロシージャの操作に影響します。

    • create_table: 後で使用するためのスナップショットの格納に適した通常のテーブルを作成します (デルタの計算など)。

    • create_tmp: 後で使用するためのスナップショットの格納に適した一時テーブルを作成します (デルタの計算など)。

    • save: in_table で指定されたテーブルにスナップショットを保存します。 テーブルが存在し、正しい構造である必要があります。 スナップショットが存在しない場合は、新しいスナップショットが作成されます。

    • cleanup: スナップショットおよびデルタに使用されている一時テーブルを削除します。

  • in_table VARCHAR(129): in_action パラメータで指定される一部のアクションに使用されるテーブルパラメータ。 バックティック (`) 識別子引用符文字を使用せずに、db_name.tbl_name または tbl_name の形式を使用します。 ピリオド (.) は、データベース名およびテーブル名ではサポートされていません。

    in_action 値の in_table 値の意味の詳細は、個々の in_action 値の説明を参照してください。

  • in_views SET ('with_runtimes_in_95th_percentile', 'analysis', 'with_errors_or_warnings', 'with_full_table_scans', 'with_sorting', 'with_temp_tables', 'custom'): 含めるビュー。 このパラメータは SET 値であるため、複数のビュー名をカンマで区切って含めることができます。 デフォルトでは、custom を除くすべてのビューが含まれます。 次の値を使用できます:

    • with_runtimes_in_95th_percentile: statements_with_runtimes_in_95th_percentile ビューを使用します。

    • analysis: statement_analysis ビューを使用します。

    • with_errors_or_warnings: statements_with_errors_or_warnings ビューを使用します。

    • with_full_table_scans: statements_with_full_table_scans ビューを使用します。

    • with_sorting: statements_with_sorting ビューを使用します。

    • with_temp_tables: statements_with_temp_tables ビューを使用します。

    • custom: カスタムビューを使用します。 クエリーまたは既存のビューに名前を付けるには、statement_performance_analyzer.view 構成オプションを使用してこのビューを指定する必要があります。

構成オプション

statement_performance_analyzer() 操作は、次の構成オプションまたは対応するユーザー定義変数を使用して変更できます (セクション28.4.2.1「sys_config テーブル」 を参照):

  • debug, @sys.debug

    このオプションが ON の場合は、デバッグ出力を生成します。 デフォルトは OFF です。

  • statement_performance_analyzer.limit, @sys.statement_performance_analyzer.limit

    組込み制限のないビューに対して返す行の最大数。 デフォルトは 100 です。

  • statement_performance_analyzer.view, @sys.statement_performance_analyzer.view

    使用するカスタムクエリーまたはビュー。 オプション値に空白が含まれている場合は、クエリーとして解釈されます。 それ以外の場合は、パフォーマンススキーマ events_statements_summary_by_digest テーブルをクエリーする既存のビューの名前である必要があります。 statement_performance_analyzer.limit 構成オプションが 0 より大きい場合、クエリーまたはビュー定義に LIMIT 句を含めることはできません。 ビューを指定する場合は、in_table パラメータと同じ形式を使用します。 デフォルトは NULL です (カスタムビューが定義されていません)。

events_statements_summary_by_digest の最後の切捨て以降の 95 パーセンタイルのクエリーと 1 分間のデルタ期間を使用してレポートを作成するには:

  1. 初期スナップショットを格納する一時テーブルを作成します。

  2. 初期スナップショットを作成します。

  3. 初期スナップショットを一時テーブルに保存します。

  4. 1 分間待ちます。

  5. 新しいスナップショットを作成します。

  6. 新しいスナップショットに基づいて分析を実行します。

  7. 初期スナップショットと新規スナップショットの差分に基づいて分析を実行します。

mysql> CALL sys.statement_performance_analyzer('create_tmp', 'mydb.tmp_digests_ini', NULL);
Query OK, 0 rows affected (0.08 sec)

mysql> CALL sys.statement_performance_analyzer('snapshot', NULL, NULL);
Query OK, 0 rows affected (0.02 sec)

mysql> CALL sys.statement_performance_analyzer('save', 'mydb.tmp_digests_ini', NULL);
Query OK, 0 rows affected (0.00 sec)

mysql> DO SLEEP(60);
Query OK, 0 rows affected (1 min 0.00 sec)

mysql> CALL sys.statement_performance_analyzer('snapshot', NULL, NULL);
Query OK, 0 rows affected (0.02 sec)

mysql> CALL sys.statement_performance_analyzer('overall', NULL, 'with_runtimes_in_95th_percentile');
+-----------------------------------------+
| Next Output                             |
+-----------------------------------------+
| Queries with Runtime in 95th Percentile |
+-----------------------------------------+
1 row in set (0.05 sec)

...

mysql> CALL sys.statement_performance_analyzer('delta', 'mydb.tmp_digests_ini', 'with_runtimes_in_95th_percentile');
+-----------------------------------------+
| Next Output                             |
+-----------------------------------------+
| Queries with Runtime in 95th Percentile |
+-----------------------------------------+
1 row in set (0.03 sec)

...

95 パーセンタイルクエリーおよび全テーブルスキャンを使用した上位 10 クエリーの全体的なレポートを作成します:

mysql> CALL sys.statement_performance_analyzer('snapshot', NULL, NULL);
Query OK, 0 rows affected (0.01 sec)

mysql> SET @sys.statement_performance_analyzer.limit = 10;
Query OK, 0 rows affected (0.00 sec)

mysql> CALL sys.statement_performance_analyzer('overall', NULL, 'with_runtimes_in_95th_percentile,with_full_table_scans');
+-----------------------------------------+
| Next Output                             |
+-----------------------------------------+
| Queries with Runtime in 95th Percentile |
+-----------------------------------------+
1 row in set (0.01 sec)

...

+-------------------------------------+
| Next Output                         |
+-------------------------------------+
| Top 10 Queries with Full Table Scan |
+-------------------------------------+
1 row in set (0.09 sec)

...

合計実行時間でソートされた上位 10 のクエリーを示すカスタムビューを使用し、Linux の watch コマンドを使用してビューを毎分リフレッシュします:

mysql> CREATE OR REPLACE VIEW mydb.my_statements AS
       SELECT sys.format_statement(DIGEST_TEXT) AS query,
              SCHEMA_NAME AS db,
              COUNT_STAR AS exec_count,
              sys.format_time(SUM_TIMER_WAIT) AS total_latency,
              sys.format_time(AVG_TIMER_WAIT) AS avg_latency,
              ROUND(IFNULL(SUM_ROWS_SENT / NULLIF(COUNT_STAR, 0), 0)) AS rows_sent_avg,
              ROUND(IFNULL(SUM_ROWS_EXAMINED / NULLIF(COUNT_STAR, 0), 0)) AS rows_examined_avg,
              ROUND(IFNULL(SUM_ROWS_AFFECTED / NULLIF(COUNT_STAR, 0), 0)) AS rows_affected_avg,
              DIGEST AS digest
         FROM performance_schema.events_statements_summary_by_digest
       ORDER BY SUM_TIMER_WAIT DESC;
Query OK, 0 rows affected (0.10 sec)

mysql> CALL sys.statement_performance_analyzer('create_table', 'mydb.digests_prev', NULL);
Query OK, 0 rows affected (0.10 sec)

shell> watch -n 60 "mysql sys --table -e \"
> SET @sys.statement_performance_analyzer.view = 'mydb.my_statements';
> SET @sys.statement_performance_analyzer.limit = 10;
> CALL statement_performance_analyzer('snapshot', NULL, NULL);
> CALL statement_performance_analyzer('delta', 'mydb.digests_prev', 'custom');
> CALL statement_performance_analyzer('save', 'mydb.digests_prev', NULL);
> \""

Every 60.0s: mysql sys --table -e "        ...  Mon Dec 22 10:58:51 2014

+----------------------------------+
| Next Output                      |
+----------------------------------+
| Top 10 Queries Using Custom View |
+----------------------------------+
+-------------------+-------+------------+---------------+-------------+---------------+-------------------+-------------------+----------------------------------+
| query             | db    | exec_count | total_latency | avg_latency | rows_sent_avg | rows_examined_avg | rows_affected_avg | digest                           |
+-------------------+-------+------------+---------------+-------------+---------------+-------------------+-------------------+----------------------------------+
...

関連キーワード:  sys, プロシージャ, summary, performance, analyzer, latency, 関数, スナップショット, テーブル, statements