26.4.4.25 statement_performance_analyzer()过程

创建服务器上运行的语句的报告。这些视图是基于总体和/或增量活动来计算的。

此过程通过操纵sql_log_bin系统变量的会话值来在执行过程中禁用二进制日志记录。那是一个受限的操作,因此该过程需要足以设置受限会话变量的特权。参见第 5.1.8.1 节“系统变量特权”

Parameters
  • in_action ENUM('snapshot', 'overall', 'delta', 'create_tmp', 'create_table', 'save', 'cleanup'):要采取的行动。这些值是允许的:

  • snapshot:存储快照。默认设置是为“性能模式events_statements_summary_by_digest”table 的当前内容制作快照。通过设置in_table,它可以被覆盖以复制指定 table 的内容。快照存储在sys模式tmp_digests临时 table 中。

    • overall:根据in_table指定的 table 的内容生成分析。对于整体分析,in_table可以是NOW()以使用新快照。这将覆盖现有快照。对于in_table使用NULL来使用现有快照。如果in_tableNULL并且不存在快照,则会创建一个新的快照。 in_views参数和statement_performance_analyzer.limit配置选项影响此过程的操作。

    • delta:生成增量分析。增量是在in_table指定的参考 table 和必须存在的快照之间进行计算的。此操作使用sys模式tmp_digests_delta临时 table。 in_views参数和statement_performance_analyzer.limit配置选项影响此过程的操作。

    • create_table:创建一个常规 table,该 table 适合存储快照供以后使用(例如,用于计算增量)。

    • create_tmp:创建一个临时 table,该 table 适合于存储快照以供以后使用(例如,用于计算增量)。

    • save:将快照保存在in_table指定的 table 中。该 table 必须存在并且具有正确的结构。如果不存在快照,则会创建一个新的快照。

    • cleanup:删除用于快照和增量的临时 table。

  • in_table VARCHAR(129):table 参数用于in_action参数指定的某些操作。使用格式* db_name.tbl_name tbl_name *而不使用任何反引号(```'')标识符引用字符。数据库和 table 名称中不包含句点(.)。

每个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视图。

Configuration Options

可以使用以下配置选项或其相应的用户定义变量(请参见第 26.4.2.1 节“ sys_configtable”)来修改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

要使用的定制查询或视图。如果选项值包含空格,则将其解释为查询。否则,它必须是查询“性能模式events_statements_summary_by_digest”table 的现有视图的名称。如果statement_performance_analyzer.limit配置选项大于 0,则查询或视图定义中不能包含任何LIMIT子句。如果指定视图,请使用与in_table参数相同的格式。默认值为NULL(未定义自定义视图)。

Example

要创建自events_statements_summary_by_digest的最后一次截断以来第 95 个百分位数的查询并以一分钟为间隔的增量生成报告:

  • 创建一个临时 table 来存储初始快照。

  • 创建初始快照。

  • 将初始快照保存在临时 table 中。

  • 等一分钟。

  • 创建一个新的快照。

  • 根据新快照执行分析。

  • 根据初始快照和新快照之间的增量执行分析。

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)

...

使用全 table 扫描创建第 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                           |
+-------------------+-------+------------+---------------+-------------+---------------+-------------------+-------------------+----------------------------------+
...