#### 28.4.4.25 声明\_表现\_Analyzer() 过程

[](<>)[](<>)

创建服务器上运行的语句的报告。视图是根据整体和/或增量活动计算的。

此过程在执行期间通过操纵会话值来禁用二进制日志记录[`sql_log_bin`](replication-options-binary-log.html#sysvar_sql_log_bin)系统变量。这是一个受限操作，因此该过程需要足够的权限来设置受限会话变量。看[第 5.1.9.1 节，“系统变量权限”](system-variable-privileges.html).

##### 参数

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

    -   `快照`：存储快照。默认是对 Performance Schema 的当前内容进行快照[`events_statements_summary_by_digest`](performance-schema-statement-summary-tables.html)桌子。通过设置`in_table`, 这可以被覆盖以复制指定表的内容。快照存储在[`系统`](sys-schema.html)图式`tmp_digests`临时表。

    -   `全面的`：根据指定的表的内容生成分析`in_table`.对于整体分析，`in_table`可[`现在（）`](date-and-time-functions.html#function_now)使用新快照。这会覆盖现有快照。采用`空值`为了`in_table`使用现有快照。如果`in_table`是`空值`并且不存在快照，则创建一个新快照。这`in_views`参数和`statement_performance_analyzer.limit`配置选项影响此程序的运行。

    -   `三角洲`：生成增量分析。delta 是在指定的参考表之间计算的`in_table`以及必须存在的快照。此操作使用[`系统`](sys-schema.html)图式`tmp_digests_delta`临时表。这`in_views`参数和`statement_performance_analyzer.limit`配置选项影响此程序的运行。

    -   `创建表`：创建一个适合存储快照供以后使用的常规表（例如，用于计算增量）。

    -   `create_tmp`：创建一个适合存储快照以供以后使用的临时表（例如，用于计算增量）。

    -   `保存`：将快照保存在指定的表中`in_table`.该表必须存在并且具有正确的结构。如果不存在快照，则会创建一个新快照。

    -   `清理`：删除用于快照和增量的临时表。

-   `in_table VARCHAR(129)`：表参数用于指定的一些动作`in_action`范围。使用格式*`db_name.tbl_name`*要么*`tbl_name`*不使用任何反引号（\```) 标识符引用字符。期间（`.`) 在数据库和表名中不受支持。

    的意义`in_table`每个人的价值`in_action`值在个人中有详细说明`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'）`: 要包括哪些视图。这个参数是一个`放`value，因此它可以包含多个视图名称，以逗号分隔。默认是包括所有视图，除了`风俗`.允许使用以下值：

    -   `with_runtimes_in_95th_percentile`： 使用[`statements_with_runtimes_in_95th_percentile`](sys-statements-with-runtimes-in-95th-percentile.html)看法。

    -   `分析`： 使用[`语句分析`](sys-statement-analysis.html)看法。

    -   `with_errors_or_warnings`： 使用[`statements_with_errors_or_warnings`](sys-statements-with-errors-or-warnings.html)看法。

    -   `with_full_table_scans`： 使用[`statements_with_full_table_scans`](sys-statements-with-full-table-scans.html)看法。

    -   `with_sorting`： 使用[`statements_with_sorting`](sys-statements-with-sorting.html)看法。

    -   `with_temp_tables`： 使用[`statements_with_temp_tables`](sys-statements-with-temp-tables.html)看法。

    -   `风俗`：使用自定义视图。此视图必须使用`statement_performance_analyzer.view`用于命名查询或现有视图的配置选项。

##### 配置选项

[`statement_performance_analyzer()`](sys-statement-performance-analyzer.html)可以使用以下配置选项或其相应的用户定义变量修改操作（请参阅[第 28.4.2.1 节，“系统\_配置表”](sys-sys-config.html)):

-   `调试`,`@sys.debug`

    如果这个选项是`在`，产生调试输出。默认是`离开`.

-   `statement_performance_analyzer.limit`,`@sys.statement_performance_analyzer.limit`

    为没有内置限制的视图返回的最大行数。默认值为 100。

-   `statement_performance_analyzer.view`,`@sys.statement_performance_analyzer.view`

    要使用的自定义查询或视图。如果选项值包含空格，则将其解释为查询。否则，它必须是查询性能模式的现有视图的名称[`事件、声明、总结、摘要`](performance-schema-statement-summary-tables.html)桌子不可能有`限度`如果`声明_性能_分析仪。限度`配置选项大于0。如果指定视图，请使用与视图相同的格式`餐桌上`参数默认值是`无效的`（未定义自定义视图）。

##### 实例

创建一个报告，其中包含自上次截断后第95个百分位的查询[`事件、声明、总结、摘要`](performance-schema-statement-summary-tables.html)一分钟的delta周期：

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中的命令：

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