#### 27.12.6.4 准备好的\_陈述\_实例表

Performance Schema 为prepared statements 提供了工具，有两个协议：

-   二进制协议。这通过 MySQL C API 访问并映射到底层服务器命令，如下表所示。

    | C API 函数 | 对应的服务器命令 |
    | -------- | -------- |
    | [`mysql_stmt_prepare()`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-stmt-prepare.html) | `COM_STMT_PREPARE` |
    | [`mysql_stmt_execute()`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-stmt-execute.html) | `COM_STMT_EXECUTE` |
    | [`mysql_stmt_close()`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-stmt-close.html) | `COM_STMT_CLOSE` |

-   文本协议。这是使用 SQL 语句访问的，并映射到底层服务器命令，如下表所示。

    | SQL 语句 | 对应的服务器命令 |
    | ------ | -------- |
    | [`准备`](prepare.html) | `SQLCOM_PREPARE` |
    | [`执行`](execute.html) | `SQLCOM_EXECUTE` |
    | [`解除分配准备`](deallocate-prepare.html),[`放下准备`](deallocate-prepare.html) | `SQLCOM_DEALLOCATE 准备` |

    Performance Schema 准备好的语句检测涵盖了这两种协议。以下讨论涉及服务器命令，而不是 C API 函数或 SQL 语句。

    有关准备好的语句的信息可在[`prepared_statements_instances`](performance-schema-prepared-statements-instances-table.html)桌子。该表可以检查服务器中使用的准备好的语句，并提供有关它们的汇总统计信息。要控制此表的大小，请设置[`performance_schema_max_prepared_statements_instances`](performance-schema-system-variables.html#sysvar_performance_schema_max_prepared_statements_instances)服务器启动时的系统变量。

    准备好的语句信息的收集取决于下表中显示的语句工具。这些仪器默认启用。要修改它们，请更新[`setup_instruments`](performance-schema-setup-instruments-table.html)桌子。

| 仪器 | 服务器命令 |
| --- | ----- |
| `声明/com/准备` | `COM_STMT_PREPARE` |
| `声明/com/执行` | `COM_STMT_EXECUTE` |
| `语句/sql/prepare_sql` | `SQLCOM_PREPARE` |
| `语句/sql/execute_sql` | `SQLCOM_EXECUTE` |

性能模式管理[`prepared_statements_instances`](performance-schema-prepared-statements-instances-table.html)表如下：

-   报表准备

    一种`COM_STMT_PREPARE`要么`SQLCOM_PREPARE`命令在服务器中创建一个准备好的语句。如果语句被成功检测，则将新行添加到[`prepared_statements_instances`](performance-schema-prepared-statements-instances-table.html)桌子。如果语句不能被检测，[`Performance_schema_prepared_statements_lost`](performance-schema-status-variables.html#statvar_Performance_schema_prepared_statements_lost)状态变量递增。

-   准备好的语句执行

    执行一个`COM_STMT_EXECUTE`要么`SQLCOM_PREPARE`检测准备好的语句实例的命令更新相应的[`prepared_statements_instances`](performance-schema-prepared-statements-instances-table.html)表行。

-   准备好的语句解除分配

    执行一个`COM_STMT_CLOSE`要么`SQLCOM_DEALLOCATE_PREPARE`用于检测的准备好的语句实例的命令会删除相应的[`prepared_statements_instances`](performance-schema-prepared-statements-instances-table.html)表行。为了避免资源泄漏，即使前面描述的准备好的语句工具被禁用，也会发生删除。

    这[`prepared_statements_instances`](performance-schema-prepared-statements-instances-table.html)表有这些列：

-   `OBJECT_INSTANCE_BEGIN`

    已检测的预准备语句在内存中的地址。

-   `STATEMENT_ID`

    服务器分配的内部语句 ID。文本和二进制协议都使用语句 ID。

-   `STATEMENT_NAME`

    对于二进制协议，此列是`空值`.对于文本协议，此列是用户分配的外部语句名称。例如，对于下面的 SQL 语句，准备好的语句的名称是`stmt`：

    ```
    PREPARE stmt FROM 'SELECT 1';
    ```

-   `SQL_TEXT`

    准备好的声明文本，带有`?`占位符标记。

-   `OWNER_THREAD_ID`,`OWNER_EVENT_ID`

    这些列指示创建预准备语句的事件。

-   `OWNER_OBJECT_TYPE`,`OWNER_OBJECT_SCHEMA`,`OWNER_OBJECT_NAME`

    对于客户端会话创建的准备好的语句，这些列是`空值`.对于存储程序创建的准备好的语句，这些列指向存储程序。一个典型的用户错误是忘记释放准备好的语句。这些列可用于查找泄漏准备好的语句的存储程序：

    ```
    SELECT
      OWNER_OBJECT_TYPE, OWNER_OBJECT_SCHEMA, OWNER_OBJECT_NAME,
      STATEMENT_NAME, SQL_TEXT
    FROM performance_schema.prepared_statements_instances
    WHERE OWNER_OBJECT_TYPE IS NOT NULL;
    ```

-   `TIMER_PREPARE`

    执行语句准备本身所花费的时间。

-   `COUNT_REPREPARE`

    内部重新准备语句的次数（请参阅[第 8.10.3 节，“准备语句和存储程序的缓存”](statement-caching.html)）。重新准备的时间统计信息不可用，因为它被计为语句执行的一部分，而不是单独的操作。

-   `COUNT_EXECUTE`,`SUM_TIMER_EXECUTE`,`MIN_TIMER_EXECUTE`,`AVG_TIMER_EXECUTE`,`MAX_TIMER_EXECUTE`

    准备好的语句执行的聚合统计信息。

-   `和_*`xxx`*`

    剩余的`和_*`xxx`*`列与语句汇总表的列相同（请参阅[第 27.12.20.3 节，“报表汇总表”](performance-schema-statement-summary-tables.html)）。

    这[`prepared_statements_instances`](performance-schema-prepared-statements-instances-table.html)表有这些索引：

-   主键打开 (`OBJECT_INSTANCE_BEGIN`)

-   索引 (`STATEMENT_ID`)

-   索引 (`STATEMENT_NAME`)

-   索引 (`OWNER_THREAD_ID`, `OWNER_EVENT_ID`)

-   索引 (`OWNER_OBJECT_TYPE`, `OWNER_OBJECT_SCHEMA`, `OWNER_OBJECT_NAME`)

[`截断表`](truncate-table.html)重置统计信息列[`prepared_statements_instances`](performance-schema-prepared-statements-instances-table.html)桌子。
