建立在伺服器上執行的陳述式報表。檢視是根據整體和/或差異活動計算的。
此程序在執行期間透過操作系統變數 sql_log_bin
的工作階段值來停用二進位記錄。這是一個受限制的操作,因此該程序需要足夠的權限來設定受限制的工作階段變數。請參閱第 7.1.9.1 節,「系統變數權限」。
in_action ENUM('snapshot', 'overall', 'delta', 'create_tmp', 'create_table', 'save', 'cleanup')
:要採取的動作。允許的值如下snapshot
:儲存快照。預設是建立 Performance Schemaevents_statements_summary_by_digest
表格的目前內容快照。透過設定in_table
,可以覆寫此設定以複製指定表格的內容。快照儲存在sys
schema 的tmp_digests
暫存表格中。overall
:根據in_table
指定的表格內容產生分析。對於整體分析,in_table
可以是NOW()
以使用新的快照。這會覆寫現有的快照。使用NULL
作為in_table
以使用現有的快照。如果in_table
為NULL
且不存在快照,則會建立新的快照。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_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()
操作(請參閱第 30.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
要使用的自訂查詢或檢視。如果選項值包含空格,則會解譯為查詢。否則,必須是現有檢視的名稱,該檢視會查詢 Performance Schema
events_statements_summary_by_digest
表格。如果statement_performance_analyzer.limit
組態選項大於 0,則查詢或檢視定義中不能有任何LIMIT
子句。如果指定檢視,請使用與in_table
參數相同的格式。預設值為NULL
(未定義自訂檢視)。
若要建立一份報告,其中包含自上次截斷 events_statements_summary_by_digest
以來處於第 95 百分位數的查詢,以及一分鐘的差異期間
建立暫存表格以儲存初始快照。
建立初始快照。
將初始快照儲存到暫存表格中。
等待一分鐘。
建立新的快照。
根據新的快照執行分析。
根據初始快照和新的快照之間的差異執行分析。
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 |
+-------------------+-------+------------+---------------+-------------+---------------+-------------------+-------------------+----------------------------------+
...