文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  statement_performance_analyzer() 程序

30.4.4.25 statement_performance_analyzer() 程序

建立伺服器上執行之陳述式的報告。檢視是以整體和/或差異活動為基礎計算的。

此程序會在執行期間透過操作 sql_log_bin 系統變數的會期值來停用二進位記錄。這是一項受限制的操作,因此程序需要足夠的權限來設定受限制的會期變數。請參閱第 7.1.9.1 節,「系統變數權限」

參數
  • in_action ENUM('snapshot', 'overall', 'delta', 'create_tmp', 'create_table', 'save', 'cleanup'):要執行的動作。允許使用下列值

    • snapshot:儲存快照。預設是建立 Performance Schema events_statements_summary_by_digest 表格的目前內容快照。透過設定 in_table,可以覆寫此設定,以複製指定表格的內容。快照會儲存在 sys schema tmp_digests 臨時表格中。

    • overall:根據 in_table 指定的表格內容產生分析。對於整體分析,in_table 可以是 NOW() 以使用新的快照。這會覆寫現有的快照。使用 NULL 作為 in_table 以使用現有的快照。如果 in_tableNULL 且沒有快照存在,則會建立新的快照。in_views 參數和 statement_performance_analyzer.limit 設定選項會影響此程序的運作。

    • delta:產生差異分析。差異是在 in_table 指定的參考表格和必須存在的快照之間計算的。此動作會使用 sys schema 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_nametbl_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 之外的所有檢視。允許以下值:

組態選項

可以使用以下組態選項或其對應的使用者定義變數(請參閱 第 30.4.2.1 節「sys_config 資料表」)來修改 statement_performance_analyzer() 操作:

  • debug@sys.debug

    如果此選項為 ON,則產生除錯輸出。預設值為 OFF

  • statement_performance_analyzer.limit@sys.statement_performance_analyzer.limit

    沒有內建限制的檢視要傳回的最大列數。預設值為 100。

  • statement_performance_analyzer.view@sys.statement_performance_analyzer.view

    要使用的自訂查詢或檢視。如果選項值包含空格,則會將其解讀為查詢。否則,它必須是現有檢視的名稱,該檢視查詢 Performance Schema events_statements_summary_by_digest 資料表。如果 statement_performance_analyzer.limit 組態選項大於 0,則查詢或檢視定義中不得有任何 LIMIT 子句。如果指定檢視,請使用與 in_table 參數相同的格式。預設值為 NULL(未定義自訂檢視)。

範例

若要建立一份報告,其中包含自上次截斷 events_statements_summary_by_digest 以來處於第 95 百分位數的查詢,且增量期間為一分鐘

  1. 建立一個臨時資料表以儲存初始快照。

  2. 建立初始快照。

  3. 將初始快照儲存到臨時資料表中。

  4. 等待一分鐘。

  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)

$> 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                           |
+-------------------+-------+------------+---------------+-------------+---------------+-------------------+-------------------+----------------------------------+
...