Statement_ID and events_statements_テーブル

statement_id

MySQLを運用する中で、SYS Schemaを利用してインスタンスの状態を確認する事が増えていますが、Performance Schemaを直接見てSQL処理を確認するケースも相変わら多いか思います。まだ具体的にどの様に活用していくかは目途が付いていませんが、MySQL8.0.14のリリースノートに以下の様にSTATEMENT_IDが付与される様になったとの記載があったので念の為に概要だけ確認しておきます。

SYS Schema

The Performance Schema statement event tables (events_statements_current, events_statements_history, and events_statements_history_long) now have a STATEMENT_ID column that indicates the query ID maintained by the server at the SQL level. Column values are unique for the server instance because they are generated using a global counter that is incremented atomically.

Changes in MySQL 8.0.14 (2019-01-21, General Availability)

WORKLOG

「STATEMENT_IDは、SQL レベルでサーバーによって保持されるクエリー IDで、これらの ID はアトミックに増分されるグローバルカウンタを使用して生成されるため、この値はサーバーインスタンスに対して一意です。 このカラムは、MySQL 8.0.14 で追加されました。」

WL#12165: PERFORMANCE_SCHEMA, CAPTURE QUERY_ID

events_statements_current各スレッド (スレッドごとに 1 行) の現在の監視対象イベントが格納されます。

現在のステートメントイベントが含まれます。 テーブルには、スレッドごとに最新のモニター対象ステートメントイベントの現在のステータスを示す 1 行が格納されるため、テーブルサイズを構成するためのシステム変数はありません。
TRUNCATE TABLE は テーブルに対して許可されていて行が削除されます。
events_statements_historyスレッドごとに終了した最新イベントが格納されます (スレッド当たりの最大行数まで)

events_statements_history テーブルと events_statements_history_long テーブルは、終了した最新のステートメントイベントのコレクションで、スレッド当たりの最大行数まで、およびすべてのスレッドにわたってグローバルに終了します。
events_statements_history テーブルには、スレッドごとに終了した N の最新のステートメントイベントが含まれます。 ステートメントイベントは終了するまでテーブルに追加されません。 テーブルに特定のスレッドの最大行数が含まれている場合、そのスレッドの新しい行が追加されると、最も古いスレッド行は破棄されます。 スレッドが終了すると、そのすべての行が破棄されます。
≒ スレッドが終了すると、そのすべての行は_history テーブルから破棄されますが、_history_long テーブルからは破棄されません。
パフォーマンススキーマは、サーバーの起動時に N の値を自動サイズ調整します。 スレッドごとの行数を明示的に設定するには、サーバーの起動時に performance_schema_events_statements_history_size システム変数を設定します。TRUNCATE TABLE は テーブルに対して許可されていて行が削除されます。
events_statements_history_longグローバルに終了した最新イベントが格納されます (全てのスレッドで、テーブル当たりの最大行数まで)。

events_statements_history テーブルと events_statements_history_long テーブルは、終了した最新のステートメントイベントのコレクションで、スレッド当たりの最大行数まで、およびすべてのスレッドにわたってグローバルに終了します。
events_statements_history_long テーブルには、すべてのスレッドでグローバルに終了した N の最新のステートメントイベントが含まれます。 ステートメントイベントは終了するまでテーブルに追加されません。 テーブルがいっぱいになると、どちらのスレッドがどちらの行を生成したかに関係なく、新しい行が追加されたときにもっとも古い行が破棄されます。
N の値はサーバー起動時に自動サイズ設定されます。 テーブルサイズを明示的に設定するには、サーバー起動時に performance_schema_events_statements_history_long_size システム変数を設定します。
events_statements_history_long テーブルには、events_statements_current と同じカラムがあります。
TRUNCATE TABLE は テーブルに対して許可されていて行が削除されます。
27.12.6.1 events_statements_current テーブル

STATEMENT_IDが追加されている。

MySQL8.0.27
MySQL5.7.20

Default設定HISTORY SIZE

mysql> show global variables like 'performance_schema_events_statements_history_size';
+---------------------------------------------------+-------+
| Variable_name                                     | Value |
+---------------------------------------------------+-------+
| performance_schema_events_statements_history_size | 10    |
+---------------------------------------------------+-------+
1 row in set (0.00 sec)

mysql> show global variables like 'performance_schema_events_statements_history_long_size';
+--------------------------------------------------------+-------+
| Variable_name                                          | Value |
+--------------------------------------------------------+-------+
| performance_schema_events_statements_history_long_size | 10000 |
+--------------------------------------------------------+-------+
1 row in set (0.00 sec)

例:event_statements_*のデータ

SQL_TEXT: Default(performance_schema_max_sql_text_length )で1024byteに設定されていますが、実行されたSQLをもう少し全体的に確認したい場合は、以下の値を変更する事で確認する事が可能です。値を減らすとメモリー使用量は減少しますが、末尾のみが異なる場合は、より多くのステートメントを区別出来なくなり、 値を大きくするとメモリー使用量が増加しますが、長いステートメントを区別する事が可能です。

mysql> show global variables like 'performance_schema_max_sql_text_length';
+----------------------------------------+-------+
| Variable_name                          | Value |
+----------------------------------------+-------+
| performance_schema_max_sql_text_length | 1024  |
+----------------------------------------+-------+
1 row in set (0.01 sec)

その他:Digest値をベースにサマリを格納している、events_statements_summary_by_digestに関しては「events_statements_summary_by_digestテーブルのパラメータ」こちらの記事が参考になるかと思います。また。少し古いですが、「MySQL Performance Schema Statement Digests」も参考になります。

mysql> show variables like 'max_digest_length';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| max_digest_length | 1024  |
+-------------------+-------+
1 row in set (0.01 sec)

mysql> show variables like 'performance_schema_max_digest_length';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| performance_schema_max_digest_length | 1024  |
+--------------------------------------+-------+
1 row in set (0.00 sec)

参考:27.10 パフォーマンススキーマのステートメントダイジェストとサンプリング

mysql> SET @stmt = 'SELECT * FROM mytable WHERE cola = 10 AND colb = 20';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT STATEMENT_DIGEST(@stmt);
+------------------------------------------------------------------+
| STATEMENT_DIGEST(@stmt)                                          |
+------------------------------------------------------------------+
| 3bb95eeade896657c4526e74ff2a2862039d0a0fe8a9e7155b5fe492cbd78387 |
+------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT STATEMENT_DIGEST_TEXT(@stmt);
+---------------------------------------------------------+
| STATEMENT_DIGEST_TEXT(@stmt)                            |
+---------------------------------------------------------+
| SELECT * FROM `mytable` WHERE `cola` = ? AND `colb` = ? |
+---------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

メモリー:Performance_Schemaにおけるメモリー利用量の確認

mysql> pager grep performance_schema.memory
PAGER set to 'grep performance_schema.memory'
mysql> SHOW ENGINE PERFORMANCE_SCHEMA STATUS;select sleep(30); SHOW ENGINE PERFORMANCE_SCHEMA STATUS;
| performance_schema | performance_schema.memory                                   | 231066760 |
248 rows in set (0.01 sec)

1 row in set (30.00 sec)

| performance_schema | performance_schema.memory                                   | 231066760 |
248 rows in set (0.00 sec)

mysql> nopager
PAGER set to stdout
mysql>

PROCESSLISTとの紐付: SHOW PROCESSLISTのID, THEAD_ID, STATEMENT_IDの紐付け

mysql> select * from performance_schema.events_statements_history limit 1\G
*************************** 1. row ***************************
              THREAD_ID: 359
               EVENT_ID: 84
           END_EVENT_ID: 84
             EVENT_NAME: statement/sql/select
                 SOURCE: init_net_server_extension.cc:95
            TIMER_START: 56368659182900000
              TIMER_END: 56368659426700000
             TIMER_WAIT: 243800000
              LOCK_TIME: 0
               SQL_TEXT: select mysql.slave_relay_log_info
                 DIGEST: b12a5ae9794c9916a91d125eb5cff183b3985623e16553ecf3ccb8ee0b3f3228
            DIGEST_TEXT: SELECT `mysql` . `slave_relay_log_info`
         CURRENT_SCHEMA: POC
            OBJECT_TYPE: NULL
          OBJECT_SCHEMA: NULL
            OBJECT_NAME: NULL
  OBJECT_INSTANCE_BEGIN: NULL
            MYSQL_ERRNO: 1109
      RETURNED_SQLSTATE: 42S02
           MESSAGE_TEXT: Unknown table 'mysql' in field list
                 ERRORS: 1
               WARNINGS: 0
          ROWS_AFFECTED: 0
              ROWS_SENT: 0
          ROWS_EXAMINED: 0
CREATED_TMP_DISK_TABLES: 0
     CREATED_TMP_TABLES: 0
       SELECT_FULL_JOIN: 0
 SELECT_FULL_RANGE_JOIN: 0
           SELECT_RANGE: 0
     SELECT_RANGE_CHECK: 0
            SELECT_SCAN: 0
      SORT_MERGE_PASSES: 0
             SORT_RANGE: 0
              SORT_ROWS: 0
              SORT_SCAN: 0
          NO_INDEX_USED: 0
     NO_GOOD_INDEX_USED: 0
       NESTING_EVENT_ID: NULL
     NESTING_EVENT_TYPE: NULL
    NESTING_EVENT_LEVEL: 0
           STATEMENT_ID: 1515
               CPU_TIME: 0
  MAX_CONTROLLED_MEMORY: 1067088
       MAX_TOTAL_MEMORY: 1633935
       EXECUTION_ENGINE: PRIMARY
1 row in set (0.00 sec)

mysql> show processlist;
+----+-----------------+------------------+------+---------+-------+------------------------+------------------+
| Id | User            | Host             | db   | Command | Time  | State                  | Info             |
+----+-----------------+------------------+------+---------+-------+------------------------+------------------+
|  7 | event_scheduler | localhost        | NULL | Daemon  | 67177 | Waiting on empty queue | NULL             |
| 26 | root            | 172.18.0.1:51586 | POC  | Sleep   |  8618 |                        | NULL             |
| 35 | root            | 172.18.0.1:51622 | POC  | Query   |     0 | init                   | show processlist |
+----+-----------------+------------------+------+---------+-------+------------------------+------------------+
3 rows in set (0.00 sec)


mysql> SELECT sys.ps_thread_id(26);
+----------------------+
| sys.ps_thread_id(26) |
+----------------------+
|                  359 |
+----------------------+
1 row in set (0.00 sec)

mysql>  select * from performance_schema.threads where processlist_id = 26\G
*************************** 1. row ***************************
            THREAD_ID: 359
                 NAME: thread/sql/one_connection
                 TYPE: FOREGROUND
       PROCESSLIST_ID: 26
     PROCESSLIST_USER: root
     PROCESSLIST_HOST: 172.18.0.1
       PROCESSLIST_DB: POC
  PROCESSLIST_COMMAND: Sleep
     PROCESSLIST_TIME: 8788
    PROCESSLIST_STATE: NULL
     PROCESSLIST_INFO: NULL
     PARENT_THREAD_ID: NULL
                 ROLE: NULL
         INSTRUMENTED: YES
              HISTORY: YES
      CONNECTION_TYPE: SSL/TLS
         THREAD_OS_ID: 395
       RESOURCE_GROUP: USR_default
     EXECUTION_ENGINE: PRIMARY
    CONTROLLED_MEMORY: 1048608
MAX_CONTROLLED_MEMORY: 1662512
         TOTAL_MEMORY: 1625391
     MAX_TOTAL_MEMORY: 2003298
1 row in set (0.00 sec)

4年前なので情報は古いですが、過去にSYS Schemaの概要をまとめた資料があるので参考迄に。

SYS Scheama

カテゴリー:

最近のコメント

表示できるコメントはありません。