### 27.12.6 性能模式语句事件表

[27.12.6.1 事件\_陈述\_当前表](performance-schema-events-statements-current-table.html)
[27.12.6.2 事件\_陈述\_历史表](performance-schema-events-statements-history-table.html)
[27.12.6.3 事件\_陈述\_历史\_长桌](performance-schema-events-statements-history-long-table.html)
[27.12.6.4 准备好的\_陈述\_实例表](performance-schema-prepared-statements-instances-table.html)

性能模式仪器语句执行。语句事件发生在事件层次结构的较高级别。在事件层次结构中，等待事件嵌套在阶段事件中，阶段事件嵌套在语句事件中，而语句事件嵌套在事务事件中。

这些表存储语句事件：

-   [`events_statements_current`](performance-schema-events-statements-current-table.html)：每个线程的当前语句事件。

-   [`events_statements_history`](performance-schema-events-statements-history-table.html)：每个线程结束的最新语句事件。

-   [`events_statements_history_long`](performance-schema-events-statements-history-long-table.html)：已在全球范围内结束的最新语句事件（跨所有线程）。

-   [`prepared_statements_instances`](performance-schema-prepared-statements-instances-table.html): 准备好的语句实例和统计

    以下部分描述语句事件表。还有汇总表，汇总有关语句事件的信息；看[第 27.12.20.3 节，“报表汇总表”](performance-schema-statement-summary-tables.html).

    欲了解更多关于三者之间关系的信息`events_statements_*`xxx`*`事件表，见[第 27.9 节，“当前和历史事件的性能模式表”](performance-schema-event-tables.html).

-   [配置语句事件收集](performance-schema-statement-tables.html#performance-schema-statement-tables-configuration)

-   [报表监控](performance-schema-statement-tables.html#performance-schema-statement-tables-monitoring)

#### 配置语句事件收集

要控制是否收集语句事件，请设置相关工具和消费者的状态：

-   这[`setup_instruments`](performance-schema-setup-instruments-table.html)表包含名称以开头的仪器`陈述`.使用这些工具来启用或禁用单个语句事件类的收集。

-   这[`setup_consumers`](performance-schema-setup-consumers-table.html)表包含名称对应于当前和历史语句事件表名称的消费者值，以及语句摘要消费者。使用这些消费者来过滤语句事件和语句摘要的集合。

    声明工具默认启用，并且`events_statements_current`,`events_statements_history`， 和`statements_digest`声明消费者默认启用：


```
mysql> SELECT NAME, ENABLED, TIMED
       FROM performance_schema.setup_instruments
       WHERE NAME LIKE 'statement/%';
+---------------------------------------------+---------+-------+
| NAME                                        | ENABLED | TIMED |
+---------------------------------------------+---------+-------+
| statement/sql/select                        | YES     | YES   |
| statement/sql/create_table                  | YES     | YES   |
| statement/sql/create_index                  | YES     | YES   |
...
| statement/sp/stmt                           | YES     | YES   |
| statement/sp/set                            | YES     | YES   |
| statement/sp/set_trigger_field              | YES     | YES   |
| statement/scheduler/event                   | YES     | YES   |
| statement/com/Sleep                         | YES     | YES   |
| statement/com/Quit                          | YES     | YES   |
| statement/com/Init DB                       | YES     | YES   |
...
| statement/abstract/Query                    | YES     | YES   |
| statement/abstract/new_packet               | YES     | YES   |
| statement/abstract/relay_log                | YES     | YES   |
+---------------------------------------------+---------+-------+
```

```
mysql> SELECT *
       FROM performance_schema.setup_consumers
       WHERE NAME LIKE '%statements%';
+--------------------------------+---------+
| NAME                           | ENABLED |
+--------------------------------+---------+
| events_statements_current      | YES     |
| events_statements_history      | YES     |
| events_statements_history_long | NO      |
| statements_digest              | YES     |
+--------------------------------+---------+
```

要在服务器启动时控制语句事件收集，请在您的`我的.cnf`文件：

-   使能够：

    ```
    [mysqld]
    performance-schema-instrument='statement/%=ON'
    performance-schema-consumer-events-statements-current=ON
    performance-schema-consumer-events-statements-history=ON
    performance-schema-consumer-events-statements-history-long=ON
    performance-schema-consumer-statements-digest=ON
    ```

-   禁用：

    ```
    [mysqld]
    performance-schema-instrument='statement/%=OFF'
    performance-schema-consumer-events-statements-current=OFF
    performance-schema-consumer-events-statements-history=OFF
    performance-schema-consumer-events-statements-history-long=OFF
    performance-schema-consumer-statements-digest=OFF
    ```

    要在运行时控制语句事件收集，请更新[`setup_instruments`](performance-schema-setup-instruments-table.html)和[`setup_consumers`](performance-schema-setup-consumers-table.html)表：

-   使能够：

    ```
    UPDATE performance_schema.setup_instruments
    SET ENABLED = 'YES', TIMED = 'YES'
    WHERE NAME LIKE 'statement/%';

    UPDATE performance_schema.setup_consumers
    SET ENABLED = 'YES'
    WHERE NAME LIKE '%statements%';
    ```

-   禁用：

    ```
    UPDATE performance_schema.setup_instruments
    SET ENABLED = 'NO', TIMED = 'NO'
    WHERE NAME LIKE 'statement/%';

    UPDATE performance_schema.setup_consumers
    SET ENABLED = 'NO'
    WHERE NAME LIKE '%statements%';
    ```

    要仅收集特定语句事件，请仅启用相应的语句工具。要仅收集特定语句事件表的语句事件，请启用语句工具，但仅启用与所需表对应的语句使用者。

    有关配置事件收集的更多信息，请参阅[第 27.3 节，“性能模式启动配置”](performance-schema-startup-configuration.html)， 和[第 27.4 节，“性能模式运行时配置”](performance-schema-runtime-configuration.html).

#### 报表监控

语句监视从服务器看到线程上请求活动的那一刻开始，到所有活动都停止的那一刻。通常，这意味着从服务器从客户端获取第一个数据包到服务器完成发送响应的时间。存储程序中的语句与其他语句一样受到监视。

当性能模式检测请求（服务器命令或 SQL 语句）时，它使用从更一般（或“抽象”）到更具体的阶段进行的仪器名称，直到它到达最终的仪器名称。

最终的仪器名称对应于服务器命令和 SQL 语句：

-   服务器命令对应于`COM_*`xxx`* 代码`中定义的`mysql_com.h`头文件并在`sql/sql_parse.cc`.例子是`COM_PING`和`COM_QUIT`.命令工具的名称以`声明/com`， 如`声明/com/Ping`和`声明/com/退出`.

-   SQL 语句表示为文本，例如`从 t1 中删除`要么`选择 * 从 t2`.SQL 语句的工具名称以`语句/sql`， 如`语句/sql/删除`和`语句/sql/选择`.

    一些最终的仪器名称特定于错误处理：

-   `声明/com/错误`服务器收到的带外消息的帐户。它可用于检测客户端发送的服务器不理解的命令。这对于识别配置错误的客户端或使用比服务器版本更新的 MySQL 版本或试图攻击服务器的客户端等目的可能会有所帮助。

-   `语句/sql/错误`说明无法解析的 SQL 语句。它可用于检测客户端发送的格式错误的查询。解析失败的查询不同于解析但由于执行期间的错误而失败的查询。例如，`选择 * 从`格式不正确，并且`语句/sql/错误`仪器使用。相比之下，`选择 *`解析但失败`没有使用表`错误。在这种情况下，`语句/sql/选择`被使用并且语句事件包含指示错误性质的信息。

    可以从以下任何来源获得请求：

-   作为来自客户端的命令或语句请求，它将请求作为数据包发送

-   作为从副本上的中继日志读取的语句字符串

-   作为来自 Event Scheduler 的事件

    请求的详细信息最初是未知的，并且性能模式按照依赖于请求源的顺序从抽象到特定的仪器名称进行。

    对于从客户端收到的请求：

1.  当服务器在套接字级别检测到新数据包时，将启动一条新语句，其抽象仪器名称为`声明/摘要/new_packet`.

2.  当服务器读取数据包号时，它会更多地了解接收到的请求类型，并且 Performance Schema 会细化仪器名称。例如，如果请求是`COM_PING`数据包，仪器名称变为`声明/com/Ping`这就是最终的名字。如果请求是`COM_QUERY`数据包，已知它对应于一条 SQL 语句，但不对应于特定类型的语句。在这种情况下，仪器从一个抽象名称变为一个更具体但仍然抽象的名称，`语句/摘要/查询`，并且该请求需要进一步分类。

3.  如果请求是语句，则读取语句文本并将其提供给解析器。解析后，确切的语句类型是已知的。例如，如果请求是[`插入`](insert.html)声明，性能模式从`语句/摘要/查询`到`语句/sql/插入`，这是最终名称。

    对于从副本上的中继日志中读取为语句的请求：

4.  中继日志中的语句存储为文本并按原样读取。没有网络协议，所以`声明/摘要/new_packet`仪器未使用。相反，初始工具是`声明/摘要/relay_log`.

5.  当语句被解析时，确切的语句类型是已知的。例如，如果请求是[`插入`](insert.html)声明，性能模式从`语句/摘要/查询`到`语句/sql/插入`，这是最终名称。

    上述描述仅适用于基于语句的复制。对于基于行的复制，可以检测在副本处理行更改时在副本上完成的表 I/O，但中继日志中的行事件不会显示为离散语句。

    对于从 Event Scheduler 收到的请求：

    事件执行使用名称进行检测`语句/调度程序/事件`.这是最后的名字。

    在事件主体中执行的语句使用`语句/sql/*`名称，而不使用任何先前的抽象工具。事件是一个存储的程序，存储的程序在执行前会在内存中预编译。因此，在运行时没有解析，并且每条语句的类型在它执行时就知道了。

    在事件主体内执行的语句是子语句。例如，如果一个事件执行一个[`插入`](insert.html)语句，事件本身的执行是父级，使用`语句/调度程序/事件`, 和[`插入`](insert.html)是孩子，使用`语句/sql/插入`.父/子关系成立*之间*单独的仪表化操作。这与发生的细化顺序不同*之内*单个仪器操作，从抽象到最终仪器名称。

    对于要为语句收集的统计信息，仅启用最终结果是不够的`语句/sql/*`用于单个语句类型的工具。摘要`声明/摘要/*`仪器也必须启用。这通常不会成为问题，因为默认情况下会启用所有语句工具。但是，选择性地启用或禁用语句工具的应用程序必须考虑到禁用抽象工具也会禁用单个语句工具的统计信息收集。例如，要收集统计信息[`插入`](insert.html)陈述，`语句/sql/插入`必须启用，但也`声明/摘要/new_packet`和`语句/摘要/查询`.同样，对于要检测的复制语句，`声明/摘要/relay_log`必须启用。

    没有汇总抽象工具的统计数据，例如`语句/摘要/查询`因为没有任何语句被抽象工具分类为最终语句名称。
