EXPLAIN 语句

EXPLAIN 语句捕获有关为提供的可解释语句选择的存取方案的信息,并将此信息放入说明表中。

可解释语句 可以是有效 XQuery 语句或下列其中一个 SQL 语句 :CALL ,复合 SQL (动态) , DELETE , INSERT , MERGE , REFRESH , SELECT , SELECT INTO , SET INTEGRITY , UPDATE , VALUES 或 VALUES INTO。

调用

此语句可嵌入应用程序中或者以交互方式发出。 它是可动态准备的可执行语句。

未执行要说明的语句。

授权

语句的授权标识必须至少具有下列其中一个权限:
  • DATAACCESS 权限,允许 INSERT , UPDATE , DELETE 或 SELECT 语句。
  • 包含说明表的模式上的 DATAACCESS 权限
  • 对说明表的 INSERT 特权以及至少下列其中一个权限:
    • 执行 EXPLAIN 语句中指定的可说明语句所必需的所有特权 (例如,如果使用 DELETE 语句作为可说明语句,那么在说明 DELETE 语句时将应用 DELETE 语句的授权规则)
    • EXPLAIN 权限
    • SQLADM 权限
    • DBADM 权限

语法

Read syntax diagramSkip visual syntax diagramEXPLAIN PLAN SELECTIONALLPLAN1 FORWITHSNAPSHOTWITH REOPT ONCESET QUERYNO = integerSET QUERYTAG = string-constantFOR explainable-sql-statementXQUERY'explainable-xquery-statement'
Notes:
  • 1 The PLAN option is supported only for syntax toleration of existing Db2 for z/OS EXPLAIN statements. There is no PLAN table. Specifying PLAN is equivalent to specifying PLAN SELECTION.

描述

PLAN SELECTION
指示要将来自查询编译的计划选择阶段的信息插入说明表中。
全部
指定 ALL 等同于指定 PLAN SELECTION。
PLAN
PLAN 选项为来自其他系统的现有数据库应用程序提供语法容错。 指定 PLAN 等同于指定 PLAN SELECTION。
针对快照
此子句指示仅获取说明快照并将其放入 EXPLAIN_STATEMENT 表的 SNAPSHOT 列中。 除了 EXPLAIN_INSTANCE 和 EXPLAIN_STATEMENT 表中提供的说明信息以外,不会捕获其他说明信息。
使用快照
此子句指示除了常规说明信息外,还将生成说明快照。

EXPLAIN 语句的缺省行为是仅收集常规说明信息,而不是收集说明快照。

缺省值 (既未指定 FOR SNAPSHOT ,也未指定 WITH SNAPSHOT)
将说明信息放入说明表中。
具有 REOPT ONCE
此子句指示将使用先前用于通过 REOPT ONCE 重新优化此语句的主变量,参数标记,专用寄存器或全局变量 的值来重新优化指定的 可解释语句 。 将使用新的存取方案填充说明表。 如果用户具有 DBADM 权限,或者数据库注册表变量 DB2_VIEW_REOPT_VALUES 设置为 YES ,那么如果使用EXPLAIN_谓词表来重新优化语句,那么还将使用这些值填充EXPLAIN_谓词表。
设置 QUERYNO = 整数
通过 EXPLAIN_STATEMENT 表中的 QUERYNO 列将 integer可说明语句相关联。 提供的整数值必须是正值。

如果没有为动态 EXPLAIN 语句指定此子句,那么将指定缺省值 1 (1)。 对于静态 EXPLAIN 语句,指定的缺省值是预编译器指定的语句号。

SET QUERYTAG = 字符串常量
通过 EXPLAIN_STATEMENT 表中的 QUERYTAG 列将 string-constant可解释语句相关联。 string-constant 可以是长度最多为 20 个字节的任何字符串。 如果提供的值长度小于 20 个字节,那么将在右边用空格填充该值以达到所需的长度。

如果未对 EXPLAIN 语句指定此子句,那么将使用空格作为缺省值。

FOR 可说明-sql-statement
指定要说明的 SQL 语句。 此语句可以是任何有效的 CALL ,复合 SQL (动态) , DELETE , INSERT , MERGE , REFRESH , SELECT , SELECT INTO , SET INTEGRITY , UPDATE , VALUES 或 VALUES INTO SQL 语句。 如果 EXPLAIN 语句嵌入在程序中,那么 explainable-sql-statement 可以包含对主变量的引用 (必须在程序中定义这些变量)。 同样,如果正在动态准备 EXPLAIN ,那么 explainable-sql-statement 可以包含参数标记。

explainable-sql-statement 必须是可以独立于 EXPLAIN 语句进行准备和执行的有效 SQL 语句。 它不能是语句名或主变量。 引用通过 CLP 定义的游标的 SQL 语句对于与此语句配合使用无效。

要在应用程序中解释动态 SQL ,必须动态准备整个 EXPLAIN 语句。

FOR XQUERY "explainable-xquery-statement"
指定要说明的 XQUERY 语句。 此语句可以是任何有效的 XQUERY 语句。

如果 EXPLAIN 语句嵌入在程序中,那么 "explainable-xquery-statement" 可以包含对主变量的引用,前提是主变量未在顶级 XQUERY 语句中使用,而是通过 XMLQUERY 函数, XMLEXISTS 谓词或 XMLTABLE 函数传入。 必须在程序中定义主变量。

同样,如果正在动态准备 EXPLAIN ,那么 "explainable-xquery-statement" 可以包含参数标记,前提是遵循与传递主变量相同的限制。

另外,还可以使用 Db2® XQUERY 函数 db2-fn:sqlquery 可用于嵌入带有主机变量引用和参数标记的 SQL 语句。

"explain-xquery-statement" 必须是可独立于 EXPLAIN 语句准备和执行的有效 XQUERY 语句。 引用通过 CLP 定义的游标的查询语句对于与此语句一起使用无效。

注意

  • 在限定要填充的说明表时,说明工具使用以下标识作为模式:
    • 动态 SQL 的会话授权标识
    • 静态 SQL 的语句授权标识
    该模式可以与一组说明表相关联,也可以与指向另一模式下的一组说明表的别名相关联。 如果在该模式下找不到任何说明表,那么 Explain 设施将检查 SYSTOOLS 模式下的说明表,并尝试使用这些表。
  • 下表显示了快照关键字和说明信息的交互。
    指定的关键字 捕获说明信息?
    针对快照 False
    使用快照
    如果既未指定 FOR SNAPSHOT ,也未指定 WITH SNAPSHOT 子句,那么将不会生成说明快照。
  • 在调用 EXPLAIN 语句之前,用户必须创建说明表。 此语句生成的信息存储在说明表中,在编译语句时指定的模式中。
  • 如果在编译提供的 可解释语句 期间发生任何错误,那么说明表中不会存储任何信息。
  • 不会保存为 可说明语句 生成的存取方案,因此以后无法调用该存取方案。 编译 EXPLAIN 语句本身时,将插入 可解释语句 的说明信息。
  • 对于静态 EXPLAIN 查询语句,将在绑定时和显式重新绑定期间将信息插入说明表中。 在预编译期间,静态 EXPLAIN 语句将在修改后的应用程序源文件中注释掉。 在绑定时, EXPLAIN 语句存储在 SYSCAT.STATEMENTS 目录中。 运行程序包时,不会执行 EXPLAIN 语句。 请注意,应用程序中所有语句的节号将是连续的,并且将包括 EXPLAIN 语句。 使用静态 EXPLAIN 语句的替代方法是使用 EXPLAIN 和 EXPLSNAP BIND 或 PREP 选项的组合。 静态 EXPLAIN 语句可用于使说明表填充一个特定静态查询语句 (许多语句中的一个); 只需使用相应的 EXPLAIN 语句语法作为目标语句的前缀,并在不使用说明 BIND 或 PREP 选项的情况下绑定应用程序。 如果在实际说明调用时设置 QUERYNO 或 QUERYTAG 字段是有利的,那么也可以使用 EXPLAIN 语句。
  • 编译 SQL 过程时,将对该过程中的静态 EXPLAIN 语句进行求值。
  • 对于增量绑定 EXPLAIN 查询语句,将在提交 EXPLAIN 语句以进行编译时填充说明表。 当运行程序包时, EXPLAIN 语句不执行任何处理 (尽管该语句将成功)。 填充说明表时,在填充期间使用的说明表限定符和授权标识将是程序包所有者的说明表限定符和授权标识。 如果在实际说明调用时设置 QUERYNO 或 QUERYTAG 字段是有利的,那么也可以使用 EXPLAIN 语句。
  • 对于动态 EXPLAIN 语句,将在提交 EXPLAIN 语句以进行编译时填充说明表。 可以使用 PREPARE 语句来准备 EXPLAIN 语句,但如果执行该语句,那么将不执行任何处理 (尽管该语句将成功)。 发出动态 EXPLAIN 语句的替代方法是使用 CURRENT EXPLAIN MODE 和 CURRENT EXPLAIN SNAPSHOT 专用寄存器的组合来解释动态查询语句。 当在实际 EXPLAIN 调用时设置 QUERYNO 或 QUERYTAG 字段有利时,应使用 EXPLAIN 语句。
  • 如果 REOPT 绑定选项设置为 ONCE ,并且 CURRENT EXPLAIN MODE 或 CURRENT EXPLAIN SNAPSHOT 专用寄存器设置为 REOPT ,那么仅当重新优化语句时,执行包含主变量,专用寄存器,参数标记或全局变量 的静态和动态查询语句将导致捕获语句的说明信息。 或者,如果 REOPT 绑定选项设置为 ALWAYS ,那么每次执行这些语句时都将捕获说明信息。

示例

  • 示例 1: 说明带有 QUERYNO = 13 的简单 SELECT 语句和标记。
       EXPLAIN PLAN SET QUERYNO = 13
         FOR SELECT C1
         FROM T1
  • 示例 2: 使用 QUERYTAG = 'TEST13' 来解释简单 SELECT 语句和标记。
       EXPLAIN PLAN SELECTION SET QUERYTAG = 'TEST13'
         FOR SELECT C1
         FROM T1
  • 示例 3: 说明带有 QUERYNO = 13 和 QUERYTAG = 'TEST13' 的简单 SELECT 语句和标记。
       EXPLAIN PLAN SELECTION SET QUERYNO = 13 SET QUERYTAG = 'TEST13'
         FOR SELECT C1
         FROM T1
  • 示例 4: 尝试在说明表不存在时获取说明信息。
       EXPLAIN ALL FOR SELECT C1
         FROM T1
    此语句将失败,因为尚未定义说明表 (SQLSTATE 42704)。
  • 示例 5: 如果在程序包高速缓存中找到以下语句并且已使用 REOPT ONCE 进行编译,那么该语句将成功。
       EXPLAIN ALL WITH REOPT ONCE FOR SELECT C1
         FROM T1
         WHERE C1 = :<host variable>
  • 示例 6: 以下示例使用 db2-fn:xmlcolumn 函数,该函数将 XML 列的区分大小写的名称作为自变量,并返回 XML 序列,即 XML 列值的并置。
    请考虑名为 BUSINESS.CUSTOMER 。 从 INFO 列返回所有文档的简单 XQuery 为:
       EXPLAIN PLAN SELECTION 
          FOR XQUERY 'db2-fn:xmlcolumn ("BUSINESS.CUSTOMER.INFO")'

    如果列值为空,那么为该行生成的返回序列将为空。