EXPLAIN 语句

EXPLAIN语句用于获取可解释语句的访问路径选择信息。 更改开始SELECT、MERGE、TRUNCATE、INSERT语句,以及UPDATE或DELETE语句的搜索形式,均可解释。更改结束 所获得的信息被放置在名为EXPLAIN表的一组预置用户表中。

开始特定程序编程接口信息。

计划表包含指定语句的访问路径信息。 报表表中可以填入执行可解释性报表的预计成本信息。 函数表中可以填入 Db2 如何解析可解释语句中引用的用户定义函数的相关信息。 其他EXPLAIN表可以填充可解释语句执行的附加信息。 EXPLAIN表的完整列表,请参阅EXPLAIN表

如果查询需要同时引用系统周期时间表和历史表才能满足查询条件,则使用EXPLAIN查询系统周期时间表,如果查询需要同时引用系统周期时间表和历史表才能满足查询条件,则EXPLAIN输出中会显示系统周期时间表和历史表。

调用 EXPLAIN

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

授权 EXPLAIN

授权规则是根据EXPLAIN语句中指定的SQL语句定义的。 例如,请参阅DELETE语句的描述,了解当DELETE语句捕获EXPLAIN记录时适用的授权规则。

如果EXPLAIN语句嵌入在应用程序中,则适用的授权规则是为在应用程序中嵌入指定的SQL语句而定义的规则。 此外,计划或套餐的所有者还必须具备以下特征之一:

  • 成为名为PLAN_TABLE的计划表的所有者
  • 名为owner.PLAN_TABLE的计划表中有一个别名,并拥有该表的SELECT和INSERT权限

如果EXPLAIN语句是动态准备的,则适用的授权规则是为动态准备指定的SQL语句而定义的。 此外,进程的SQL授权ID或与进程关联的角色(如果EXPLAIN语句在指定ROLE AS OBJECT OWNER AND QUALIFIER子句的可信环境中运行)也必须具有以下特征之一:

  • 创建名为PLAN_TABLE的计划表
  • 在名为 creator.PLAN_TABLE 的计划表上有一个别名,并拥有该表的 SELECT 和 INSERT 权限
对于包含关键字PLAN和ALL的EXPLAIN语句,下面定义的权限集必须至少包含以下内容之一:
  • EXPLAIN
  • SQLADM
  • 系统 DBADM
  • EXPLAIN语句中SQL语句的授权规则。 例如,当为DELETE语句捕获EXPLAIN记录时,适用的授权规则是DELETE语句的授权规则。

更改开始FL 500 如果指定了 STMTCACHE 或 STABILIZED DYNAMIC QUERY 关键字,授权规则会有所不同。 特权套装必须至少包含以下一项:更改结束

  • SQLADM 权限
  • SYSADM 权限
  • 共享缓存语句所需的权限。 如需了解使用动态语句缓存的权限详情,请参阅语句共享条件
  • 系统 DBADM 权限
对于包含STMTCACHE ALL子句的EXPLAIN语句,权限集必须至少包含以下一项:
  • SQLADM 权限
  • 系统 DBADM 权限
  • SYSADM 权限

如果权限集没有所需的权限,EXPLAIN记录将仅记录与权限集具有相同授权ID的语句。

对于“套餐”关键词,特权集必须至少包含以下一项:
  • SQLADM 权限
  • SYSADM 权限
  • 系统管理员权限
  • SYSCTRL 权限

权限设置:

权限集由进程的授权 ID 所持有的权限联合组成。 如果进程在可信环境中运行,且具有角色,则该角色将作为进程的授权 ID 包含在内。

语法 EXPLAIN

阅读语法图跳过可视化语法图 EXPLAIN PLANALLSET QUERYNO= 整数FOR可解释的SQL语句STMTCACHEALLSTMTIDid 主机变量常数STMTTOKEN令牌宿主变量常量字符串PACKAGE包范围说明STABILIZED DYNAMIC QUERY STMTIDid 主机变量常数COPY 'CURRENT'COPY 'INVALID'

包范围说明:

阅读语法图跳过可视化语法图 COLLECTION 收藏名称 PACKAGE 程序包名 VERSION版本名称COPY复制ID

描述 EXPLAIN

PLAN

指定为SQL语句捕获访问路径信息。 在此选项下, Db2 使用访问路径选择过程来生成语句的EXPLAIN记录。

在PLAN_TABLE中为执行可解释的SQL语句的每个步骤插入一行。 此处不包含实施参照约束的步骤。

如果存在语句表,则会在语句表中插入一行,提供可解释语句的处理成本估算。 如果可解释语句是 SELECT FROM data-change-statement ,则语句表中会插入两行。

如果函数表存在,则可解释语句引用的每个用户定义的函数都会在函数表中插入一行。

如果存在其他EXPLAIN表,则行也会插入到这些表中。

全部
与PLAN的效果相同。
SET QUERYNO = integer
整数可解释的SQL语句相关联。 在EXPLAIN语句插入计划表、语句表或函数表的每一行中,QUERYNO列的值均为整数。 如果未指定QUERYNO, Db2 会自动分配一个号码。 对于嵌入式EXPLAIN语句,该数字是预编译器分配并放入DBRM中的语句编号。
FOR 可解释的 SQL 语句
指定要捕获EXPLAIN记录的SQL语句文本。 可解释的SQL语句可以是任何可解释的SQL语句。 更改开始如果语句是 SELECT、MERGE、TRUNCATE 或 INSERT 语句,或者是 UPDATE 或 DELETE 语句的搜索形式,则该语句是可解释的。更改结束 如果 EXPLAIN 语句嵌入到程序中,该语句可以包含对主机变量的引用。 如果EXPLAIN是动态准备的,则语句可以包含参数标记。 语句中出现的宿主变量必须在语句的程序中定义。

该语句必须引用当前服务器上的对象。

可解释的 SQL 语句不能包含 QUERYNO 子句。 要指定QUERYNO列的值,请使用EXPLAIN语句的 SET QUERYNO = integer子句

可解释的 SQL 语句不能是语句名称或宿主变量。 要使用捕获EXPLAIN记录来动态生成SQL语句,必须动态准备整个EXPLAIN语句。

要获取有关引用已声明临时表的SQL语句的信息,必须在声明该表的同一应用程序进程中执行EXPLAIN语句。 对于静态EXPLAIN语句,信息不是在绑定时获取的,而是在运行时,当EXPLAIN语句被逐步绑定时获取的。

STMTCACHE
指定从动态语句缓存中提取指定动态 SQL 语句的 EXPLAIN 记录,并将其写入 EXPLAIN 表。 在此选项下,不会发生新的访问路径选择处理。 EXPLAIN记录是从现有的访问路径中提取的,这些路径是在准备动态SQL语句时选择的,并输入了语句缓存。 在数据共享环境中,EXPLAIN记录是从执行EXPLAIN STMTCACHE语句的数据共享成员的动态语句缓存中提取的。
全部
指定为所有缓存语句提取EXPLAIN记录。 STMTCACHE ALL 针对 DSN_STATEMENT_CACHE_TABLE 中的每个缓存语句返回一行。 这些行包含缓存中语句的识别信息,以及反映所有执行过该语句的进程执行情况的统计信息。 当指定STMTCACHE ALL时,记录不会返回到其他EXPLAIN表。
STMTID id-host-variable integer-constant
指定为缓存语句提取EXPLAIN记录,并指定语句ID。 id-host-variable 中包含的值或由integer-constant 指定的值用于标识语句ID。 STMTCACHE STMTID 返回以下 EXPLAIN 表的行:
  • PLAN_TABLE
  • dsn_statemnt_table(状态表
  • dsn_function_table
  • dsn_statement_cache_table(缓存表
语句ID是一个整数,用于唯一标识动态语句缓存中缓存的语句。 缓存语句的语句ID可通过IFI监控工具从IFCID 316或124中检索。 一些诊断跟踪记录,如IFCID 0173、0196和0337,也显示了声明ID。

返回的每个EXPLAIN表记录的QUERYNO列包含语句ID值。

STMTTOKEN id-host-variable string-constant
指定为带有指定语句标记的缓存语句提取EXPLAIN记录,并将其写入特定的EXPLAIN表。 token-host-variable 中包含的值或 string-constant 指定的值用于标识语句标记。 STMTCACHE STMTTOKEN 将记录写入以下 EXPLAIN 表:
  • PLAN_TABLE
  • dsn_statemnt_table(状态表
  • dsn_function_table
  • dsn_statement_cache_table(缓存表
声明令牌必须是一个不超过240字节的字符串。 最初准备语句并将其插入缓存的应用程序将语句标记与缓存的语句相关联。 该程序可以与RRSAF SET_ID函数或sqleseti API(如果程序是远程连接的)进行关联。

返回的每个PLAN_TABLE记录的STMTTOKEN列包含语句标记值。 返回的每个EXPLAIN表记录的QUERYNO列包含语句ID值。

有关更多信息,请参阅:

PACKAGE
指定提取包中与指定范围匹配的所有静态 SQL 语句的 EXPLAIN 记录,并将其写入 EXPLAIN 表。 在此选项下,不会发生新的访问路径选择处理。 记录是从绑定软件包时选择的现有访问路径中提取的。 EXPLAIN信息被添加到当前用户拥有的PLAN_TABLE中。 其他EXPLAIN表没有填充。
收藏藏品名称
指定仅针对指定集合名称下的语句捕获EXPLAIN记录。 collection-name 是字符串常量或代表集合名称的主变量。
PACKAGE package-name
指定仅针对指定包名称下的语句捕获EXPLAIN记录。 package-name 是表示包名称的字符串常量或宿主变量。
版本 版本名称

指定仅针对指定版本名称下的语句捕获EXPLAIN记录。 version-name 是表示版本名称的字符串常量或宿主变量。 如果版本名称全部为空或为空字符串,则仅捕获软件包中版本名称全部为空的那些版本的记录。

如果未指定 VERSION 子句,则将捕获 package-name 包的所有版本中的语句的 EXPLAIN 记录。

复制 复制ID
指定仅针对指定复制ID 下的语句捕获EXPLAIN记录。 复制ID 必须为以下值之一:
  • CURRENT
  • 上一页
  • ORIGINAL

更改开始FL 500如果未指定 COPY 子句,则将为该软件包的当前、先前和原始副本捕获语句和 EXPLAIN 记录。更改结束

PLAN_TABLE中的HINT_USED列填入 EXPLAIN PACKAGE: copy-id。 HINT_USED 列中的 copy-id 将是以下值之一:更改开始
  • 当前 - 当前副本
  • 上一个——上一个副本
  • ORIGINAL——原
更改结束
更改开始稳定动态查询更改结束
更改开始FL 500指定提取 STMTID 关键字标识的稳定动态语句的解释记录,并将其写入以下 EXPLAIN 表:
  • PLAN_TABLE
  • dsn_statemnt_table(状态表
  • dsn_function_table
STMTID id-host-variableinteger-constant
指定使用指定的语句标识符捕获语句的EXPLAIN信息。 该值被插入到EXPLAIN表的 PER_STMT_ID列中
复制 复制ID
指定仅针对指定拷贝标识符值下的语句捕获EXPLAIN信息。 copy-id 是一个字符串常量,且必须为以下值之一:
  • CURRENT
  • 无效

PLAN_TABLE.HINT_USED 列中填入了字符串“EXPLAIN SDQ: copy-id-number”,其中 copy-id-number 为以下值之一:

更改开始
CURRENT
当前副本。
无效
无效副本。
更改结束

返回的每个EXPLAIN表记录的QUERYNO列被设置为默认值0,COLLID列的值被设置为“DSNSTBLQRYEXPLAIN”

更改结束

备注 EXPLAIN

EXPLAIN的输出:
Db2 将一行或多行数据插入计划表和其他现有的 EXPLAIN表中

要查看所有EXPLAIN表的列表,请参阅 EXPLAIN表

在执行导致EXPLAIN输出的操作之前,必须先创建计划表。 在 前缀.SDSNSAMP 库的成员DSNTESC中,您可以找到每个EXPLAIN表的CREATE TABLE语句示例。

除非您需要附加EXPLAIN表提供的信息,否则无需创建这些表即可使用EXPLAIN。 但是,当在EXPLAIN语句中指定STMTCACHE ALL关键字时,需要语句缓存表。

Db2 使用访问路径选择过程只为某些类型的EXPLAIN语句生成EXPLAIN记录,如下表所示。

表 1. EXPLAIN记录的来源,用于各种EXPLAIN语句选项
指定选项 Db2 如何创建EXPLAIN记录
EXPLAIN PLAN FOR explainable-sql-statement 使用访问路径选择过程生成EXPLAIN记录
EXPLAIN PACKAGE ... 从软件包中提取现有的访问路径信息,以创建EXPLAIN记录。
EXPLAIN STMTCACHE ... 从动态语句缓存中提取路径信息,以创建EXPLAIN记录。
更改开始EXPLAIN STABILIZED DYNAMIC QUERY ...更改结束 更改开始为指定的稳定动态 SQL 语句从目录表中提取访问路径信息。更改结束

EXPLAIN表中的每一行描述了可解释语句中查询或子查询执行步骤的某个方面。 除其他事项外,行的列值标识查询或子查询、涉及的表和其他对象、执行每个步骤所使用的方法以及这些方法的成本信息。

某些优化工具也可以创建和使用这些表格。 有关计划表和其他EXPLAIN表中不同值的含义的信息,请参阅使用EXPLAIN解释数据访问

有关如何在 EXPLAIN 表之间关联信息的信息,请参阅在 EXPLAIN 表之间关联信息

EXPLAIN表可能包含由 Db2 生成的以DSN 开头的名称。

重要提示: 请勿手动修改优化工具创建的EXPLAIN表中的数据。
EXPLAIN表中的列访问控制或行权限:
EXPLAIN表可以强制执行列访问控制和行权限。 但是,当 Db2 向这些表插入行时,行权限和列掩码将不适用。

如果指定的语句引用了激活了行或列访问控制的表,则EXPLAIN表中可能会出现为这些表创建的行权限和列掩码定义中的以下信息:

  • DSN_FUNCTION_TABLE——用户自定义函数
  • DSN_PREDICAT_TABLE——谓词( CASE 中的谓词和WHEN子句中的谓词除外)
  • DSN_STRUCT_TABLE——查询块
  • PLAN_TABLE——子查询的访问路径

此外,完整或部分定义文本可能会出现在EXPLAIN表中,如DSN_FUNCTION_TABLE、DSN_PREDICAT_TABLE、DSN_QUERY_TABLE、DSN_SORTKEY_TABLE、DSN_STATEMENT_CACHE_TABLE和DSN_STATEMENT_RUNTIME_INFO。

当表格强制执行列访问控制或行权限时,对现有访问路径的影响:
访问路径选择会考虑行权限的谓词。 因此,出于性能调校的目的,它们在EXPLAIN表中显示。
更改开始在动态 SQL 语句中引用不存在的对象时对 EXPLAIN 表的影响更改结束
更改开始在某些情况下,如果在引用不存在对象的动态 SQL 语句上运行 EXPLAIN,则会发出 SQLCODE -204 表示该对象未在 Db2 子系统中定义。 但是,对相关 EXPLAIN 表的更改可能不会回滚。更改结束
获取EXPLAIN记录以加速行集查询时的注意事项:
在以下情况下,行集查询无法传递给加速器服务器进行处理:
  • 如果行集查询是远程运行的
  • 如果行集查询声明为 WITH RETURN
  • 如果行集查询是在SQL PL例程下运行的

您不能使用静态EXPLAIN语句来确定行集查询是否传递给加速器服务器,因为您不能为静态EXPLAIN语句指定WITH ROWSET POSITIONING游标属性。 相反,您必须使用动态EXPLAIN语句,其中在属性字符串中指定了WITH ROWSET POSITIONING子句。 您还可以在属性字符串中指定 WITH RETURN 子句,以查看结果集的不合格项。

此外,EXPLAIN语句不能用于确定行集查询不能传递给加速器服务器,因为该查询正在远程运行或在SQL PL例程下运行。 如果EXPLAIN语句的PREPARE在本地运行,则 Db2 将确定是否可以将行集查询作为本地查询卸载来加速。 但是,如果EXPLAIN语句的PREPARE远程运行,则 Db2 表示行集查询无法加速。 相反,您可以使用当前解释模式特殊寄存器来确定应用程序执行期间符合条件的动态 SQL 语句的行为。 更多信息,请参阅当前解释模式特殊寄存器

EXPLAIN 表
关于EXPLAIN表的描述,请参阅 EXPLAIN表

例子 EXPLAIN

示例1 :确定执行查询“SELECT X.ACTNO... ”所需的步骤。 假设PLAN_TABLE表中QUERYNO列的值不为13。
   EXPLAIN PLAN SET QUERYNO = 13
   FOR SELECT X.ACTNO, X.PROJNO, X.EMPNO, Y.JOB, Y.EDLEVEL
       FROM DSN8C10.EMPPROJACT X, DSN8C10.EMP Y
          WHERE X.EMPNO = Y.EMPNO
             AND X.EMPTIME > 0.5
             AND (Y.JOB = 'DESIGNER' OR Y.EDLEVEL >= 12)
          ORDER BY X.ACTNO, X.PROJNO;
示例2 :检索示例1中返回的信息。 假设存在一个语句表,因此还要检索处理查询的估计成本。 使用以下查询,它将计划表和语句表连接起来。
  SELECT * FROM PLAN_TABLE A, DSN_STATEMNT_TABLE B
    WHERE A.QUERYNO = 13 and B.QUERYNO = 13
    ORDER BY A.QBLOCKNO, A.PLANNO, A.MIXOPSEQ;
示例3 :提取现有访问路径信息,以获取缓存语句(语句ID为124)的EXPLAIN记录。 假设宿主变量 SID 包含 124。
EXPLAIN STMTCACHE STMTID :SID; 
示例4 :提取现有的访问路径信息,为动态语句缓存中的每个语句获取一行EXPLAIN数据。 记录只写入DSN_STATEMENT_CACHE_TABLE。
EXPLAIN STMTCACHE ALL; 
示例5: 假设您想使用由 ADMF001 创建的计划表,您的授权ID是SYSADM。 如果您在 ADMF001.PLAN_TABLE 上有一个别名(CREATE ALIAS SYSADM.PLAN_TABLE FOR ADMF001.PLAN_TABLE ),并且对表有足够的INSERT和SELECT权限,则将执行以下EXPLAIN语句并填充 ADMF001.PLAN_TABLE。
  EXPLAIN PLAN SET QUERYNO = 101
    FOR SELECT * FROM DSN8C10.EMP;
示例6: 提取现有访问路径信息,以获取当前用户PLAN_TABLE中当前副本中所有静态SQL语句的EXPLAIN记录,包名为“ COLLA.PACK52604 ”:
  EXPLAIN PACKAGE COLLECTION 'COLLA' PACKAGE 'PACK52604' COPY 'CURRENT';

结束特定程序编程接口信息。