ADMIN_EXPLAIN_MAINT 存储过程
您可以使用存储过程 ADMIN_EXPLAIN_MAINT 创建 EXPLAIN 表,将表升级到当前 Db2 版本的格式,并完成其他管理任务。
有关使用存储过程 ADMIN_EXPLAIN_MAINT 为 EXPLAIN 表完成管理任务的详细信息,请参阅操作输入参数的描述。
重要提示: ADMIN_EXPLAIN_MAINT存储过程不会将EBCDIC编码的EXPLAIN表转换为Unicode。 不过,它确实将表格格式升级为当前 Db2 版本的格式。 从 DB2® 10 开始,对于使用Unicode之外的CCSID编码的EXPLAIN表,将发出SQLCODE -878。
环境
ADMIN_EXPLAIN_MAINT存储过程必须在WLM建立的存储过程地址空间中运行。授权
要执行CALL语句,包含CALL语句的程序包或计划的所有者必须在存储过程使用的每个程序包上拥有以下一项或多项权限:- 对存储过程包执行特权
- 套餐所有权
- PACKADM 包裹收集授权
- SYSADM 权限
语法
下面的语法图显示了调用此存储过程的SQL CALL语句:
选项说明
- 方式
- 指定处理模式。 此输入参数接受以下值:
- 运行
- 为指定的模式创建EXPLAIN表。
- 预览
- 未处理任何更改。
- 行为
- 指定为指定架构中的EXPLAIN表完成的操作。 此输入参数接受以下值:
- STANDARDIZE
- 将所有现有的EXPLAIN表升级到当前 Db2 版本的格式。
- 标准化和创建
- 将所有现有的EXPLAIN表升级到当前 Db2 版本的格式,并创建表集输入参数指定的所有缺失表。
- 创建
- 在指定的架构中创建一组新的EXPLAIN表。 仅创建由表集输入参数指定的表。
- 创建别名
- 仅创建一组新的别名。 新别名由为模式别名输入参数指定的值限定。
- DROP
- 删除所有现有的EXPLAIN表和相关表空间。
- DROP_AND_CREATE
- 删除所有现有的EXPLAIN表和相关表空间,并创建一组替换表,替换表由表集输入参数指定。
- 别名管理
- 指定是否为EXPLAIN表创建别名。 此输入参数接受以下值:
- YES
- 存储过程创建别名,以便指定架构中的所有EXPLAIN表都有与现有PLAN_TABLE别名对应的别名。
- 否
- 不会创建别名。
- 餐具
- 指定要创建的EXPLAIN表列表。
如果操作值为CREATE,则指定的表必须不存在。 此输入参数接受以下值:
- 'table-name-1, table-name-2, ..., 表名n'
- 指定要创建的表列表。
- 全部
- 所有由DSNTESC和DSNTESH示例作业创建的EXPLAIN表。
- 加速
- 仅限于以下表格:
- PLAN_TABLE
- DSN_STATEMNT_TABLE
- DSN_语句缓存表
- DSN_查询信息表
- DIAGNOSTICS
- 仅限于以下表格:
- PLAN_TABLE
- DSN_STATEMNT_TABLE
- DSN_DETCOST_TABLE
- DSN_谓词表
- DSN_FILTER_TABLE
- DSN_COLDIST_TABLE
- DSN_密钥分发表
- DSN_查询信息表
- ALL_EXCEPT( table-name-1 , table-name-2 ,……) 表名-n )
- DSNTESC和DSNTESH示例作业创建的所有表,列表中指定的表除外。
只有当行为符合以下价值观之一时,该价值观才适用:
- 标准化和创建
- 创建
- DROP_AND_CREATE
此输入参数的数据类型为VARCHAR(1000)。 如果未指定此选项,则默认创建以下EXPLAIN表:
- PLAN_TABLE
- DSN_STATEMNT_TABLE
- DSN_语句缓存表
- 认证
- 当前SQLID设置。 如果未指定此选项,则使用当前 SQLID 特殊寄存器的值。 所需输入参数的数据类型为VARCHAR(128)。
- schema-name
- 指定对EXPLAIN表进行限制的架构名称。 如果未指定此选项,则使用当前架构特殊寄存器的值。 所需输入参数的数据类型为VARCHAR(128)。
- 别名
- 指定模式名称,该名称用于限定当操作值为CREATE_ALIAS时创建的别名。 此输入参数的数据类型为VARCHAR(128)。 当操作值为CREATE_ALIAS时,此输入参数为必填项。
- 数据库名称
- 指定包含新EXPLAIN表的数据库。 如果数据库不存在,存储过程将创建它。 此输入参数的数据类型为VARCHAR(8)。 如果未指定此选项,则存储过程会在EXPLAIN表的CREATE TABLE语句中省略数据库和表空间名称。
- stogroup-数据库
- 指定包含新EXPLAIN表的数据库的存储组。 此输入参数的数据类型为VARCHAR(128)。 如果未指定此选项,则存储过程会在数据库不存在时从CREATE DATABASE语句中省略STOGROUP关键字。
- stogroup-索引
- 指定新EXPLAIN表的索引存储组。 此输入参数的数据类型为VARCHAR(128)。 如果未指定此选项,则存储过程会从CREATE INDEX语句中省略USING STOGROUP关键字。
- 4k-bufferpool
- 指定分配给新表空间的4 KB页面缓冲池的名称。 此输入参数的数据类型为VARCHAR(8)。 如果未指定此选项,则存储过程会在EXPLAIN表的CREATE TABLE语句中省略表空间名称。
- 8k-bufferpool
- 指定分配给新表空间的8 KB页面缓冲池的名称。 此输入参数的数据类型为VARCHAR(8)。 如果未指定此选项,则存储过程会在EXPLAIN表的CREATE TABLE语句中省略表空间名称。
- 16k-bufferpool
- 指定分配给新表空间的16 KB页面缓冲池的名称。 此输入参数的数据类型为VARCHAR(8)。 如果未指定此选项,则存储过程会在EXPLAIN表的CREATE TABLE语句中省略表空间名称。
- 32k-bufferpool
- 指定分配给新表空间的32 KB页面缓冲池的名称。 此输入参数的数据类型为VARCHAR(8)。 如果未指定此选项,则存储过程会在EXPLAIN表的CREATE TABLE语句中省略表空间名称。
- 索引缓冲池
- 指定新EXPLAIN表的索引缓冲池名称。 此输入参数的数据类型为VARCHAR(8)。 如果未指定此选项,则存储过程会在CREATE INDEX语句中省略BUFFERPOOL关键字。
- bp-4kb-lob
- 指定为新的EXPLAIN表的新辅助表分配的4 KB页面缓冲池的名称。 此输入参数的数据类型为VARCHAR(8)。 如果未指定此选项,则存储过程会在CREATE LOB TABLESPACE语句中省略BUFFERPOOL关键字。
- bp-8kb-lob
- 指定为新的EXPLAIN表的新辅助表分配的8 KB页面缓冲池的名称。 此输入参数的数据类型为VARCHAR(8)。 如果未指定此选项,则存储过程会在CREATE LOB TABLESPACE语句中省略BUFFERPOOL关键字。
- bp-16kb-lob
- 指定为新的EXPLAIN表的新辅助表分配的16 KB页面缓冲池的名称。 此输入参数的数据类型为VARCHAR(8)。 如果未指定此选项,则存储过程会在CREATE LOB TABLESPACE语句中省略BUFFERPOOL关键字。
- bp-32kb-lob
- 指定为新的EXPLAIN表的新辅助表分配的32KB页面缓冲池的名称。 此输入参数的数据类型为VARCHAR(8)。 如果未指定此选项,则存储过程会在CREATE LOB TABLESPACE语句中省略BUFFERPOOL关键字。
- 返回码
- 一个输出参数,包含存储过程的返回代码。 它包含下列其中一个值:
- 0
- 通话已成功结束。
- 4
- 一个或多个现有的EXPLAIN表不是Unicode格式。 表格格式已更新为当前 Db2 版本的格式。 但是,表格不会转换为Unicode。
- 8
- 表集输入参数中包含的一个或多个现有EXPLAIN表的格式无法更新为当前 Db2 版本的格式,因为现有格式与任何已知格式不匹配,或者无法通过ALTER TABLE语句更改这些表。
- 12
- 通话未成功完成。 消息输出参数包含描述错误的消息。
- 消息
- 输出参数,包含存储过程所遇到错误的描述信息。
以下C语言示例展示了如何调用存储过程ADMIN_EXPLAIN_MAINT:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/******************* DB2 SQL Communication Area *******************/
EXEC SQL INCLUDE SQLCA;
int main( int argc, char *argv[] ) /* Argument count and list */
{
/****************** DB2 Host Variables ****************************/
EXEC SQL BEGIN DECLARE SECTION;
/* SYSPROC.ADMIN_EXPLAIN_MAINT parameters */
char pmode[9]; /* Processing mode */
char paction[31]; /* Action */
char pmanagealias[4]; /* Manage alias */
char ptableset[1001]; /* EXPLAIN tables to be created */
char pauthid[129]; /* CURRENT SQLID setting */
char pschema[129]; /* EXPLAIN tables qualifier */
char pschemaalias[129]; /* EXPLAIN tables aliases qual */
char pdatabase[9]; /* Database of EXPLAIN tables */
char pstogroupdb[129]; /* Storage group of database */
char pstogroupix[129]; /* Storage group of EXPLAIN */
/* tables indexes */
char p4Kbp[9]; /* 4 KB page buffer pool for */
/* table space of EXPLAIN table */
char p8Kbp[9]; /* 8 KB page buffer pool for */
/* table space of EXPLAIN table */
char p16Kbp[9]; /* 16 KB page buffer pool for */
/* table space of EXPLAIN table */
char p32Kbp[9]; /* 32 KB page buffer pool for */
/* table space of EXPLAIN table */
char pixbp[9]; /* Buffer pool for indexes of */
/* EXPLAIN tables */
char p4Klobbp[9]; /* 4 KB page buffer pool for */
/* LOB table space */
char p8Klobbp[9]; /* 8 KB page buffer pool for */
/* LOB table space */
char p16Klobbp[9]; /* 16 KB page buffer pool for */
/* LOB table space */
char p32Klobbp[9]; /* 32 KB page buffer pool for */
/* LOB table space */
long int prc; /* Return code */
char pmsg[1332]; /* Error message */
short int ind_pmode; /* Indicator variable */
short int ind_paction; /* Indicator variable */
short int ind_pmanagealias; /* Indicator variable */
short int ind_ptableset; /* Indicator variable */
short int ind_pauthid; /* Indicator variable */
short int ind_pschema; /* Indicator variable */
short int ind_pschemaalias; /* Indicator variable */
short int ind_pdatabase; /* Indicator variable */
short int ind_pstogroupdb; /* Indicator variable */
short int ind_pstogroupix; /* Indicator variable */
short int ind_p4Kbp; /* Indicator variable */
short int ind_p8Kbp; /* Indicator variable */
short int ind_p16Kbp; /* Indicator variable */
short int ind_p32Kbp; /* Indicator variable */
short int ind_pixbp; /* Indicator variable */
short int ind_p4Klobbp; /* Indicator variable */
short int ind_p8Klobbp; /* Indicator variable */
short int ind_p16Klobbp; /* Indicator variable */
short int ind_p32Klobbp; /* Indicator variable */
short int ind_prc; /* Indicator variable */
short int ind_pmsg; /* Indicator variable */
/* Result set locators */
volatile SQL TYPE IS RESULT_SET_LOCATOR *rs_loc1;
volatile SQL TYPE IS RESULT_SET_LOCATOR *rs_loc2;
volatile SQL TYPE IS RESULT_SET_LOCATOR *rs_loc3;
/* SYSIBM.EXPLAIN_MAINT_SUMMARY result set row */
long int db_created; /* Num databases created */
long int ts_created; /* Num table spaces created */
long int tb_created; /* Num EXPLAIN tables created */
long int aux_created; /* Num aux tables created */
long int ix_created; /* Num indexes created */
long int alias_created; /* Num aliases created */
long int tb_examined; /* Num EXPLAIN tables examined*/
/* for old format */
long int tb_altered; /* Num databases created */
long int ts_dropped; /* Num table spaces dropped */
long int tb_dropped; /* Num EXPLAIN tables dropped */
long int tb_unexpected_format; /* Num EXPLAIN tables with */
/* invalid format */
long int tb_not_standardized; /* Num EXPLAIN tables not */
/* upgraded to the current */
/* DB2 release format */
long int tb_not_unicode; /* Num EXPLAIN tables not */
/* in UNICODE */
/* SYSIBM.EXPLAIN_MAINT_SQL result set row */
long int rownum2; /* Sequence number of the */
/* table row */
char sql[16000]; /* SQL statement */
/* SYSIBM.EXPLAIN_MAINT_TB_NOT_UPGRADED result set row */
long int rownum3; /* Sequence number of the */
/* table row */
char schemaname[129]; /* EXPLAIN table qualifier */
char tbname[129]; /* EXPLAIN table name */
char reason[1001]; /* Reason */
EXEC SQL END DECLARE SECTION;
int resultset3 = 0; /* Result set 3 not returned */
/******************************************************************/
/* Clear result tables */
/******************************************************************/
EXEC SQL DELETE FROM SYSIBM.EXPLAIN_MAINT_SUMMARY;
EXEC SQL DELETE FROM SYSIBM.EXPLAIN_MAINT_SQL;
EXEC SQL DELETE FROM SYSIBM.EXPLAIN_MAINT_TB_NOT_UPGRADED;
/******************************************************************/
/* Set procedure input parameters */
/******************************************************************/
strcpy(paction, "STANDARDIZE_AND_CREATE");
strcpy(ptableset,
"DSN_PREDICATE_SELECTIVITY, DSN_STAT_FEEDBACK");
strcpy(pauthid, "USER001");
strcpy(pschema, "USER002");
ind_pmode = -1;
ind_paction = 0;
ind_pmanagealias = -1;
ind_ptableset = 0;
ind_pauthid = 0;
ind_pschema = 0;
ind_pschemaalias = -1;
ind_pdatabase = -1;
ind_pstogroupdb = -1;
ind_pstogroupix = -1;
ind_p4Kbp = -1;
ind_p8Kbp = -1;
ind_p16Kbp = -1;
ind_p32Kbp = -1;
ind_pixbp = -1;
ind_p4Klobbp = -1;
ind_p8Klobbp = -1;
ind_p16Klobbp = -1;
ind_p32Klobbp = -1;
ind_prc = -1;
ind_pmsg = -1;
/******************************************************************/
/* Call stored procedure SYSPROC.ADMIN_EXPLAIN_MAINT */
/******************************************************************/
EXEC SQL CALL SYSPROC.ADMIN_EXPLAIN_MAINT (
:pmode:ind_pmode,
:paction:ind_paction,
:pmanagealias:ind_pmanagealias,
:ptableset:ind_ptableset,
:pauthid:ind_pauthid,
:pschema:ind_pschema,
:pschemaalias:ind_pschemaalias,
:pdatabase:ind_pdatabase,
:pstogroupdb:ind_pstogroupdb,
:pstogroupix:ind_pstogroupix,
:p4Kbp:ind_p4Kbp,
:p8Kbp:ind_p8Kbp,
:p16Kbp:ind_p16Kbp,
:p32Kbp:ind_p32Kbp,
:pixbp:ind_pixbp,
:p4Klobbp:ind_p4Klobbp,
:p8Klobbp:ind_p8Klobbp,
:p16Klobbp:ind_p16Klobbp,
:p32Klobbp:ind_p32Klobbp,
:prc:ind_prc,
:pmsg:ind_pmsg);
/******************************************************************/
/* Retrieve result sets when the SQLCODE from the call is +446, */
/* which indicates that result sets were returned */
/******************************************************************/
if (SQLCODE == +466) /* Result sets were returned */
{
/* Establish a link between a result set and its locator */
EXEC SQL ASSOCIATE LOCATORS (:rs_loc1, :rs_loc2, :rs_loc3)
WITH PROCEDURE SYSPROC.ADMIN_EXPLAIN_MAINT;
/* Associate a cursor with each result set */
EXEC SQL ALLOCATE C1 CURSOR FOR RESULT SET :rs_loc1;
EXEC SQL ALLOCATE C2 CURSOR FOR RESULT SET :rs_loc2;
EXEC SQL ALLOCATE C3 CURSOR FOR RESULT SET :rs_loc3;
if (SQLCODE == 0) /* Result set 3 is returned */
resultset3 = 1;
/* Perform fetch using C1 to retrieve the first result set */
EXEC SQL FETCH C1 INTO :db_created, :ts_created,
:tb_created, :aux_created,
:ix_created, :alias_created,
:tb_examined, :tb_altered,
:ts_dropped, :tb_dropped,
:tb_unexpected_format,
:tb_not_standardized,
:tb_not_unicode;
/* Perform fetches using C2 to retrieve all rows from the */
/* second result set */
EXEC SQL FETCH C2 INTO :rownum2, :sql;
while (SQLCODE == 0)
{
EXEC SQL FETCH C2 INTO :rownum2, :sql;
}
/* Perform fetches using C3 to retrieve all rows from the */
/* third result set */
if (resultset3 == 1)
{
EXEC SQL FETCH C3 INTO :rownum3, :schemaname, :tbname,
:reason;
while (SQLCODE == 0)
{
EXEC SQL FETCH C3 INTO :rownum3, :schemaname, :tbname,
:reason;
}
}
}
return;
}输出
ADMIN_EXPLAIN_MAINT存储过程最多创建三个结果集,并返回到以下全局临时表中:
- SYSIBM.EXPLAIN_MAINT_SUMMARY
- 如果模式输入参数的值为RUN,则存储过程将执行的操作摘要。 如果 mode 输入参数的值为 PREVIEW,则此结果集会总结操作,但操作尚未完成。 各种类型 _CREATED、 类型 _ALTERED、 类型 _DROPPED 列的值汇总了 SYSIBM.EXPLAIN_MAINT_SQL 结果集的 SQL 列中每个操作的对应语句的数量。
表 1. SYSIBM.EXPLAIN_MAINT_SUMMARY 结果集的格式 列名 数据类型 描述 数据库创建 INTEGER NOT NULL 创建的数据库数量。 TS_CREATED INTEGER NOT NULL 创建的表格步数。 TB_CREATED INTEGER NOT NULL 创建的EXPLAIN表的数量。 辅助创建 INTEGER NOT NULL 创建的辅助表的数量。 IX_创建 INTEGER NOT NULL 创建的索引数量。 创建的别名 INTEGER NOT NULL 创建的别名数量。 TB_已检查 INTEGER NOT NULL 检查的EXPLAIN表的格式比当前 Db2 版本的格式更早。 TB_ALTERED INTEGER NOT NULL 当前 Db2 版本中,表格数量已更改为使用该格式。 TS_DROPPED INTEGER NOT NULL 被删除的表格空间数量。 TB_DROPPED INTEGER NOT NULL 被删除的EXPLAIN表的数量。 TB_格式异常 INTEGER NOT NULL 不符合任何已知有效格式的EXPLAIN表的数量。 TB_未标准化 INTEGER NOT NULL 当前 Db2 版本中无法转换为格式的EXPLAIN表的数量。 TB_非_Unicode INTEGER NOT NULL 以Unicode以外的CCSID编码的EXPLAIN表的数量。 此类表格已升级为当前 Db2 版本的格式,但CCSID未更改为Unicode。 - SYSIBM.EXPLAIN_MAINT_SQL
- 如果模式输入参数的值为RUN,则存储过程发出的SQL语句列表。 如果模式输入参数的值为PREVIEW,则此结果集将汇总操作,但不会发出语句。
表 2. SYSIBM.EXPLAIN_MAINT_SQL 结果集的格式 列名 数据类型 描述 ROWNUM INTEGER NOT NULL 表格行序号,1 - n。 SQL VARCHAR(16000) 不为空 存储过程用于创建、更改或删除EXPLAIN表及相关对象的SQL语句文本。 表空间名称 :ADMIN_EXPLAIN_MAINT存储过程为EXPLAIN表和相关辅助表创建的表空间名称基于关联表名称的四字母缩写,后跟四位数字,以确保名称的唯一性。 四个字母的缩写与各种表格名称的关系并不一致。 例如, PLANnnnn 用于PLAN_TABLE, STMTnnnn 用于DSN_STATEMNT_TABLE, SFEDnnnn 用于DSN_STAT_FEEDBACK表。在 SYSIBM.EXPLAIN_MAINT_SQL 结果集中可以找到存储过程创建的表空间名称。
- SYSIBM.EXPLAIN_MAINT_TB_NOT_UPGRADED
- 仅当操作输入参数的值为STANDARDIZE或STANDARDIZE_AND_CREATE且至少满足以下条件之一时,才会返回此结果集。 结果集包含以下出现的每一项:
- 表格是用非Unicode的CSSID创建的。 此类表格可以升级为当前 Db2 版本的格式。 但是,CCSID不会转换为Unicode。
- EXPLAIN表的格式与任何已知格式都不匹配。 此类表格不会升级。
- ALTER TABLE语句无法完成将表升级到当前 Db2 版本所需的格式所需的更改。 此类表格不会升级。
表 3. SYSIBM.EXPLAIN_TMAIN_TB_NOT_UPGRADED 结果集的格式 列名 数据类型 描述 ROWNUM INTEGER NOT NULL 表格行序号,1 - n。 SCHEMA VARCHAR(128) NOT NULL EXPLAIN表的架构无法转换为 Db2 当前版本的格式。 TBNAME VARCHAR(128) NOT NULL EXPLAIN表的名称无法转换为 Db2 当前版本的格式。 推理 VARCHAR(1000) NOT NULL 描述表格无法转换为当前版本 Db2 格式的原因。
