SET CURRENT EXPLAIN SNAPSHOT 语句
SET CURRENT EXPLAIN SNAPSHOT 语句更改 CURRENT EXPLAIN SNAPSHOT 专用寄存器的值。
此语句不受事务控制。
调用
此语句可嵌入应用程序中或者以交互方式发出。 它是可动态准备的可执行语句。
授权
不需要执行任何操作。
语法
描述
- 否
- 禁用 Explain snapshot 工具。 未生成快照。 NO 是专用寄存器的初始值。
- 是
- 启用 Explain 快照工具,为每个符合条件的动态 SQL 语句创建内部表示的快照。 此信息插入到 EXPLAIN_STATEMENT 表的 SNAPSHOT 列中。
- EXPLAIN
- 启用 Explain 快照工具,为预编译的每个符合条件的动态 SQL 语句创建内部表示的快照。 但是,不会执行动态语句。
- REOPT
- 启用 Explain 工具,并使执行时在语句重新优化期间捕获静态或动态 SQL 语句的 Explain 信息; 即,当主变量,专用寄存器, 全局变量 或参数标记的实际值可用时。 host-variable
- 主变量 必须是数据类型 CHAR 或 VARCHAR ,并且其内容长度不得超过 8。 如果提供了较长的字段,那么将返回错误 (SQLSTATE 42815)。 此寄存器中包含的值必须是 NO , YES 或 EXPLAIN。 如果提供的实际值大于指定的替换值,那么必须在右边用空格填充输入。 不允许前导空格 (SQLSTATE 42815)。 所有输入值都被视为不区分大小写。 如果 host-variable 具有关联的指示符变量,那么该指示符变量的值不得指示空值 (SQLSTATE 42815)。
注意
- 在限定要填充的 Explain 表时,说明工具使用以下标识作为模式:
- 动态 SQL 的会话授权标识
- 静态 SQL 的语句授权标识
- 可以使用 PREP 或 BIND 命令的 EXPLSNAP 选项来捕获静态 SQL 语句的说明快照。 如果指定了 EXPLSNAP 选项的 ALL 值,并且 CURRENT EXPLAIN SNAPSHOT 寄存器值为 NO ,那么将在运行时针对动态 SQL 语句捕获 Explain 快照。 如果 CURRENT EXPLAIN SNAPSHOT 寄存器的值不是 NO ,那么将忽略 EXPLSNAP 选项。
- 如果激活了 Explain 快照工具,那么当前授权标识必须具有对 Explain 表的 INSERT 特权,否则将产生错误 (SQLSTATE 42501)。
- 从例程中说明 SQL 语句时,必须使用 SQL 数据访问指示符 MODISQL DATA 来定义该例程 (SQLSTATE 42985)。
- 如果专用寄存器设置为 REOPT ,并且 SQL 语句在执行时不符合重新优化的条件 (即,如果语句没有输入变量,或者 REOPT 绑定选项设置为 NONE) ,那么不会捕获任何 Explain 信息。 如果 REOPT 绑定选项设置为 ONCE ,那么最初重新优化语句时,将仅捕获一次 Explain 快照信息。 对该语句进行高速缓存后,将不会获取有关后续执行的此语句的更多 Explain 信息。
- 如果启用了 Explain 工具,那么 REOPT 绑定选项将设置为 ONCE ,并且您尝试执行已高速缓存的可重新优化的 SQL 语句,该语句将使用输入变量的当前值进行编译和重新优化,并且将相应地捕获 Explain 快照。 将不会对此语句高速缓存或执行新生成的存取方案。 其他同时执行此高速缓存语句的应用程序将继续执行,执行此语句的新请求将选取已高速缓存的存取方案。
- 如果静态或动态 SQL 语句具有输入变量,并且 REOPT 绑定选项设置为 ONCE 或 ALWAYS ,那么 CURRENT EXPLAIN MODE 和 CURRENT EXPLAIN SNAPSHOT 专用寄存器的值 REOPT 将在绑定时覆盖 EXPLAIN 和 EXPLSNAP 绑定选项的值。
示例
- 示例 1: 以下语句设置 CURRENT EXPLAIN SNAPSHOT 专用寄存器,以便将针对任何后续符合条件的动态 SQL 语句生成 Explain 快照,并将执行该语句。
SET CURRENT EXPLAIN SNAPSHOT = YES - 示例 2: 以下示例将 CURRENT EXPLAIN SNAPSHOT 专用寄存器的当前值检索到名为 SNAP 的主变量中。
EXEC SQL VALUES (CURRENT EXPLAIN SNAPSHOT) INTO :SNAP;
