db2expln - SQL 和 XQuery 说明命令

db2expln 工具描述选择用于 SQL 和 XQuery 语句的访问方案。 未捕获到说明数据时,您可使用此工具获取所选访问方案的快速说明。对于静态 SQL 和 XQuery 语句,db2expln 会检查存储在系统目录表中的程序包。对于动态 SQL 和 XQuery 语句,db2expln 会检查查询高速缓存节。

权限

DBADM 或下列其中一项权限或特权:
  • 对于静态语句:对目录表的 SELECT 特权
  • 对于动态语句:对目录表的 SELECT 特权,外加下列其中一项权限或特权:
    • 足以编译语句的特权
    • EXPLAIN 权限
    • SQLADM 权限

命令语法

阅读语法图跳过直观语法图db2explnconnection-optionsoutput-optionspackage-optionsdynamic-optionsexplain-optionsevent-monitor-options-help
连接选项
阅读语法图跳过直观语法图-databasedatabase-name-useruser-idpassword
output-options
阅读语法图跳过直观语法图 -outputoutput-file -terminal
程序包选项
阅读语法图跳过直观语法图 -schemaschema-name-package package-name-versionversion-identifier-escapeescape-character-noupper-sectionsection-number
动态选项
阅读语法图跳过直观语法图-cacheanchIDstmtUIDenvIDvarID-statementquery-statement-stmtfilequery-statement-file-terminatortermination-character-noenv
explain-options
阅读语法图跳过直观语法图-graph-opids-setupsetup-file
event-monitor-options
阅读语法图跳过直观语法图-actevmevent-monitor-name -appidapplication_id-uowiduow_id-actidactivity_id-actid20-actid2activity_secondary_id

命令参数

这些选项可以按任意顺序指定。

connection-options:

这些选项指定所要连接的数据库,以及建立连接所需的任何选项。除非指定 -help 选项,否则连接选项为必需。

-database database-name
要说明的包所在数据库的名称。

为实现向后兼容,可以使用 -d 代替 -database

-user user-id password
建立数据库连接时要使用的授权标识和密码。user-idpassword 都必须符合 Db2® 命名约定,并且必须可以由数据库识别。

为实现向后兼容,可以使用 -u 代替 -user

output-options:

这些选项指定 db2expln 输出所应定向到的位置。除非指定 -help 选项,否则必须至少指定一个输出选项。如果同时指定这两个选项,那么输出会发送至文件以及终端。

-output output-file
db2expln 输出会写入您指定的文件。

为实现向后兼容,可以使用 -o 代替 -output

-terminal
db2expln 输出会定向到终端。

为实现向后兼容,可以使用 -t 代替 -terminal

package-options:

这些选项指定所要说明的一个或多个包和节。将会仅说明这些包和节中的静态查询。

如同在 LIKE 谓词中,您可使用模式匹配字符(即,百分号 (%) 和下划线(_))来指定 schema-namepackage-nameversion-identifier

-schema schema-name
所要说明的一个或多个包的 SQL 模式。

为实现向后兼容,可以使用 -c 代替 -schema

-package package-name
所要说明的一个或多个包的名称。

为实现向后兼容,可以使用 -p 代替 -package

-version version-identifier
所要说明的一个或多个包的版本标识。缺省版本为空字符串。
-escape escape-character
字符 escape-character 将会用作转义字符,以便在 schema-namepackage-nameversion-identifier 中进行模式匹配。
例如,对 TESTID.CALC% 包进行说明的 db2expln 命令如下所示:
db2expln -schema TESTID -package CALC% .... 
但是,此命令还会说明任何其他以 CALC 开头的方案。要仅说明 TESTID.CALC% 包,必须使用转义字符。如果指定惊叹号 (!) 作为转义字符,那么可以将该命令更改为:db2expln -schema TESTID -escape ! -package CALC!% ... 。如此一来,! 字符用作转义字符,因此 !% 将解释为 % 字符,而非解释为“匹配任何内容”模式。没有缺省转义字符。

为实现向后兼容,可以使用 -e 代替 -escape

为避免发生问题,请勿将操作系统转义字符指定为 db2expln 转义字符。

-noupper
指定在搜索匹配的包之前,不应将 schema-namepackage-nameversion-identifier 转换为大写。

缺省情况下,系统先将这些变量转换为大写,再搜索包。此选项指出这些值应完全按输入的原样使用。

为实现向后兼容,可以使用 -l(小写 L,而非数字 1)代替 -noupper

-section section-number
在选定的一个或多个包中,所要说明的节号。

要说明每个包中所有的节,请使用数字零 (0)。这是缺省行为。如果未指定此选项,或者 schema-name package-nameversion-identifier 包含模式匹配字符,那么将显示所有的节。

要查找节号,请查询系统目录视图 SYSCAT.STATEMENTS。请参阅《SQL 参考》,以获取有关系统目录视图的描述。

为实现向后兼容,可以使用 -s 代替 -section

dynamic-options:

这些选项指定所要说明的一个或多个动态查询语句。

-cache anchID, stmtUID, envID, varID
指定要从中检索语句(由给定的标识指示)的动态 SQL 高速缓存。您可使用带有 -dynamic 选项的 db2pd 命令获取标识。
-statement query-statement
要动态准备并说明的 SQL 或 XQuery 查询语句。要说明多个语句,请使用 -stmtfile 选项提供一个文件(其中包含所要说明的查询语句),或使用 -terminator 选项来定义可用来分隔 -statement 选项中的语句的终止字符。
-stmtfile query-statement-file
指定一个文件,其中包含一个或多个要动态准备并说明的查询语句。缺省情况下,假定该文件中的每一行都是不同的查询语句。如果语句必须跨行,请使用 -terminator 选项指定标记查询语句结束的字符。
-terminator termination-character
指定用于指示动态查询语句结束的字符。缺省情况下,-statement 选项提供单一查询语句,并且 -stmtfile 所指定文件的每一行都被视为单独的查询语句。指定终止字符后,您就可以通过 -statement 提供多个查询语句,或者让 -stmtfile 文件中的语句跨行。
-noenv
指定变更编译环境的动态语句在说明后不应执行。
缺省情况下,db2expln 在说明下列任何语句之后,随即予以执行:
	  SET CURRENT DEFAULT TRANSFORM GROUP
	  SET CURRENT DEGREE
	  SET CURRENT MAINTAINED TABLE TYPES FOR OPTIMIZATION
	  SET CURRENT QUERY OPTIMIZATION
	  SET CURRENT REFRESH AGE
	  SET PATH
	  SET SCHEMA
这些语句使您能够变更您为 db2expln 所处理的后续动态查询语句选择的方案。

如果指定 -noenv,那么将会说明这些语句,但不会予以执行。

必须指定 -statement-stmtfile 才能说明动态查询。可以在 db2expln 的单一调用中同时指定这两个选项。

explain-options:

这些选项确定在说明的方案中提供的其他信息。

-graph
显示优化器方案图。将会检查每一节,然后构造原始优化器方案图。根据节方案中包含的信息不同,优化器图可能会显示一些间隙。

为实现向后兼容,可以指定 -g 代替 -graph

-opids
显示所说明方案中的运算符标识号。

运算符标识号可用来将 db2expln 的输出与说明工具的输出比对。并非所有运算符都有标识号,而且有些出现在说明工具输出中的标识号不会出现在 db2expln 输出中。

为实现向后兼容,可以指定 -i 代替 -opids

-help
显示 db2expln 的帮助文本。如果指定此选项,那么不会说明任何包。
命令行的大部分内容在 db2exsrv 存储过程中处理。要获取有关所有可用选项的帮助,必须随 -help 一起提供 connection-options。例如,使用:
    db2expln -help -database SAMPLE
    

为实现向后兼容,可以指定 -h-?

-setup setup-file
指定一个文件,其中包含一个或多个语句,用于为动态语句或需要重新编译的静态语句(例如,引用已声明临时表的静态语句)设置环境。将会执行该文件中的每个语句,并且会报告所有错误或警告。不会说明该文件中的语句。
event-monitor-options:

这些选项指定在活动事件监视器中,所要说明的一个或多个节环境。

-actevm event-monitor-name
指定活动事件监视器的名称,其 activitystmt 逻辑分组包含所要说明的节环境(在 section_env 监视元素中)。
-appid application-id
指定应用程序标识(appl_id 监视元素),用于唯一识别发出节环境待说明的活动的应用程序。如果指定了 -appid,那么必须指定 -actevm
-uowid uow-id
指定节环境待说明的工作单元标识(uow_id 监视元素)。工作单元标识仅在指定的应用程序中是唯一的。如果指定了 -uowid,那么必须指定 -actevm
-actid activity-id
指定节环境待说明的活动标识(activity_id 监视元素)。活动标识仅在指定的工作单元中是唯一的。如果指定了 -actid,那么必须指定 -actevm
-actid2 activity-secondary-id
指定节环境待说明的活动辅助标识(activity_secondary_id 监视元素)。如果未指定,那么缺省为零。如果指定了 -actid2,那么必须指定 -actevm

用法说明

除非指定 -help 选项,否则必须指定 package-options 或 dynamic-options。可以通过 db2expln 的单一调用同时说明包和动态 SQL。

上文列出的某些选项标志对于操作系统可能有特殊意义,因此,在 db2expln 命令行中可能无法正确解释。但是,可以加上操作系统转义字符作为前缀,以此输入这些字符。有关更多信息,请参阅操作系统文档。请确保您不会无意中将操作系统转义字符指定为 db2expln 转义字符。

db2expln 所生成的帮助和初始状态消息会写至标准输出。说明工具所生成的所有提示和其他状态消息都会写至标准错误。根据选择的输出选项,说明文本会写至标准输出或文件。

db2expln 可以返回以下消息:
  • No packages found for database package pattern: "<creator>".<package> with version "<version>"

    在数据库中找不到与指定模式匹配的程序包时,此消息会出现在输出中。

  • Bind messages can be found in db2expln.msg

    db2expln.bnd 的绑定未成功时,此消息会出现在输出中。有关所发生问题的进一步信息可在当前目录中的 db2expln.msg 文件中找到。

  • Section number overridden to 0 (all sections) for potential multiple packages.

    db2expln 可能遇到多个程序包时,此消息会出现在输出中。在程序包或创建者输入自变量中使用了其中一个模式匹配字符时,就会执行此操作。

  • Bind messages for <bind file> can be found in <message file>

    所指定绑定文件的绑定未成功时,将会出现此消息。有关所发生问题的进一步信息可在数据库服务器上的指定消息文件中找到。

  • No static sections qualify from package.

    如果指定的程序包仅包含动态查询语句(这意味着没有静态节),那么此消息会出现在输出中。

  • Package "<creator>"."<package>", "<version>", is not valid. Rebind the package and then rerun db2expln.

    指定的程序包当前无效时,此消息会出现在输出中。请针对该方案重新发出 BIND 或 REBIND 命令,以在数据库中重新创建有效的程序包,然后重新运行 db2expln

不会说明下列语句:

  • BEGIN/END COMPOUND
  • BEGIN/END DECLARE SECTION
  • CLOSE cursor
  • COMMIT 和 ROLLBACK
  • CONNECT
  • DESCRIBE
  • Dynamic DECLARE CURSOR
  • EXECUTE
  • EXECUTE IMMEDIATE
  • FETCH
  • INCLUDE
  • OPEN cursor
  • PREPARE
  • SQL 控制语句
  • WHENEVER

复合 SQL 语句中的每个子语句可能有自己的节,该节可以由 db2expln 说明。

注: db2expln 命令不会排除任何 XQuery 语句。

示例

要通过 db2expln 的单一调用来说明多个方案,请使用 -package-schema-version 选项,并使用 LIKE 模式对程序包和创建者指定字符串常量。即,可以使用下划线 (_) 来表示单个字符,使用百分号 (%) 来表示出现零个或零个以上字符。

要说明名为 SAMPLE 的数据库中所有程序包的所有节,并将结果写入文件 my.exp,请输入:
  db2expln -database SAMPLE -schema % -package %  -output my.exp
作为另一个示例,假定用户有名为“statements.db2”的 CLP 脚本文件,并想说明该文件中的语句。该文件包含下列语句:
  SET PATH=SYSIBM, SYSFUN, DEPT01, DEPT93@
  SELECT EMPNO, TITLE(JOBID) FROM EMPLOYEE@
要说明这些语句,请输入以下命令:
  db2expln -database DEPTDATA -stmtfile statements.db2 -terminator @ -terminal
说明以下语句:
  SELECT e.lastname, e.job, d.deptname, d.location, p.projname
    FROM employee AS e, department AS d, project AS p
    WHERE e.workdept = d.deptno AND e.workdept = p.deptno
以下命令:
  db2expln -database SAMPLE
    -statement "SELECT e.lastname, e.job,
      d.deptname, d.location, p.projname
      FROM employee AS e, department AS d, project AS p
      WHERE e.workdept = d.deptno AND e.workdept = p.deptno"
    -terminal
返回:
Db2 Enterprise Server Edition n.n, nnnn-nnn (c) Copyright IBM Corp. 1991, yyyy
Licensed Material - Program Property of IBM
IBM Db2 Database SQL and XQUERY Explain Tool

******************** DYNAMIC ***************************************

==================== STATEMENT ==========================================

        Isolation Level          = Cursor Stability
        Blocking                 = Block Unambiguous Cursors
        Query Optimization Class = 5

        Partition Parallel       = No
        Intra-Partition Parallel = No

        SQL Path                 = "SYSIBM", "SYSFUN", "SYSPROC", "SYSIBMADM",
                                   "SDINIRO"


Statement:

  SELECT e.lastname, e.job, d.deptname, d.location, p.projname
  FROM employee AS e, department AS d, project AS p
  WHERE e.workdept =d.deptno AND e.workdept =p.deptno


Section Code Page = 1208

Estimated Cost = 22.802252
Estimated Cardinality = 105.000000

Access Table Name = SDINIRO.PROJECT  ID = 2,10
|  #Columns = 2
|  Skip Inserted Rows
|  Avoid Locking Committed Data
|  Currently Committed for Cursor Stability
|  Relation Scan
|  |  Prefetch: Eligible
|  Lock Intents
|  |  Table: Intent Share
|  |  Row  : Next Key Share
|  Sargable Predicate(s)
|  |  Process Build Table for Hash Join
Hash Join
|  Estimated Build Size: 4000
|  Estimated Probe Size: 4000
|  Access Table Name = SDINIRO.DEPARTMENT  ID = 2,6
|  |  #Columns = 3
|  |  Skip Inserted Rows
|  |  Avoid Locking Committed Data
|  |  Currently Committed for Cursor Stability
|  |  Relation Scan
|  |  |  Prefetch: Eligible
|  |  Lock Intents
|  |  |  Table: Intent Share
|  |  |  Row  : Next Key Share
|  |  Sargable Predicate(s)
|  |  |  Process Probe Table for Hash Join
Hash Join
|  Estimated Build Size: 4000
|  Estimated Probe Size: 4000
|  Access Table Name = SDINIRO.EMPLOYEE  ID = 2,7
|  |  #Columns = 3
|  |  Skip Inserted Rows
|  |  Avoid Locking Committed Data
|  |  Currently Committed for Cursor Stability
|  |  Relation Scan
|  |  |  Prefetch: Eligible
|  |  Lock Intents
|  |  |  Table: Intent Share
|  |  |  Row  : Next Key Share
|  |  Sargable Predicate(s)
|  |  |  Process Probe Table for Hash Join
Return Data to Application
|  #Columns = 5

End of section