使用 SET EXPLAIN 语句来启用或禁用在当前的会话中查询的记录评估,包括查询优化器的计划、对返回行的数目的估计,以及该查询的相对成本。
语法
元素 | 描述 | 限制 | 语法 |
expression | 返回文件名称规范的表达式 | 必须返回满足文件名称限制的字符串 | 表达式 |
file_name | 说明输出文件名称。如果未包括文件的绝对路径,则会在默认的说明输出文件位置创建说明输出文件 | 必须符合操作系统规则。如果该文件已存在,则将说明输出追加在它后面。 | 引用字符串 |
file_name_var | 存储文件名称的主变量 | 必须为字符数据类型 | 特定于语言 |
用法
将来自 SET EXPLAIN ON 语句的输出指向适合的文件,直到您发出 SET EXPLAIN OFF 语句或直到程序结束为止。如果您未输入 SET EXPLAIN 语句,则缺省的行为是 OFF,且数据库服务器不生成查询的评估。
在数据库服务器优化阶段期间,执行 SET EXPLAIN 语句,当您初始化查询时会发生。对于与游标相关联的查询,如果准备该查询且没有主变量,则当您准备它时发生优化。否则,当您打开游标时,发生优化。
SET EXPLAIN 语句提供参与执行查询的工作的多种评估。
选项 作用
ON 为每一随后的查询生成评估并将结果写到当前目录中的输出文件。如果给文件已存在,则将新的输出追加到现有的文件之后。
AVOID_EXECUTE 防止 SELECT、INSERT、MERGE、UPDATE 或 DELETE 语句执行。数据库服务器将查询计划打印到输出文件
OFF 终止 SET EXPLAIN 语句的活动,以便于不再生成随后的查询的评估或写到输出文件
FILE TO 为每一随后的查询生成评估,并允许您指定说明输出文件的位置。
下列示例为当前会话中随后的查询将查询计划写到说明输出文件中:
SET EXPLAIN ON;
下列示例将查询计划追加写到当前会话中的文件:
SET EXPLAIN OFF;
AVOID_EXECUTE 关键字防止 DML 语句执行。相反,数据库服务器将查询计划打印到输出文件。
SET EXPLAIN ON AVOID_EXECUTE 语句为会话激活 Avoid Execute 选项,或直到下一不带 AVOID_EXECUTE 的 SET EXPLAIN OFF(或 ON)为止。如果您为包含远程表的查询激活 AVOID_EXECUTE,则该查询既不在本地也不在远程站点执行。
下列示例在指定的文件中存储输出。
SET EXPLAIN ON AVOID_EXECUTE;
SET EXPLAIN FILE TO '/tmp/explain.out';
当设置 AVOID_EXECUTE 时,数据库服务器发出警告消息。如果您正在使用 DB-Access,则它为任何选择、删除、更新或插入查询操作显示文本消息。
Warning! avoid_execute has been set
对于 ESQL,sqlwarn.sqlwarn7 字符设置为 'W'。
使用 SET EXPLAIN ON 或 SET EXPLAIN OFF 语句来关闭 AVOID_EXECUTE 选项。SET EXPLAIN ON 语句关闭 AVOID_EXECUTE 选项,但继续生成查询计划并将结果写到输出文件。
如果您在 SPL 例程中发出 SET EXPLAIN ON AVOID_EXECUTE 语句,则该 SPL 例程和任何 DDL 语句仍然执行,但在该 SPL 例程内部的 DML 语句不执行。数据库服务器将该 SPL 例程的查询计划打印到输出文件。要关闭此选项,您必须在该 SPL 例程的外部执行 SET EXPLAIN ON 或 SET EXPLAIN OFF 语句。如果您在执行 SPL 例程之前执行 SET EXPLAIN ON AVOID_EXECUTE 语句,则在该 SPL 例程内部的 DML 语句不执行,且数据库服务器不将该 SPL 例程的查询计划打印到输出文件。
当 AVOID_EXECUTE 生效时,仍然对查询中的恒定函数求值,因为数据库服务器在优化之前计算这些函数。
例如,即使不执行下列 SELECT 语句,也对 func( ) 函数求值:
SELECT * FROM orders WHERE func(10) > 5;
要了解 AVOID_EXECUTE 选项的其他性能影响,请参阅 GBase 8s 性能指南 。
如果您在 GBase 8s ESQL/C 程序中打开游标之前执行 SET EXPLAIN ON AVOID_EXECUTE 语句,则每一 FETCH 操作都返回找不到行的消息。然而,如果您在 GBase 8s ESQL/C 程序打开游标之后执行 SET EXPLAIN ON AVOID_EXECUTE,则此语句对游标不起作用,其继续返回行。