使用说明Word下载.docx
《使用说明Word下载.docx》由会员分享,可在线阅读,更多相关《使用说明Word下载.docx(19页珍藏版)》请在冰点文库上搜索。
--+-------------------------------------+--+---------+---------|
--terminator--termination-character-'
--noenv-'
|explain-options:
||--+---------+--+---------+-------------------------------------|
--graph-'
--opids-'
1.1常用命令行
1.分析程序包
db2expln-d数据库名-i-g-c模式名-p程序包-s0-t
db2expln-d数据库名-i-g-c模式名-p程序包-s0-o文件名
第一条命令行讲执行方案显示在屏幕上,第二条语句将方案输出到文件中
2.分析sql语句
db2expln-d数据库名-i-g-qsql语句-t
db2expln-d数据库名-i-g-qsql语句-o文件名
3.输出简单说明
在该输出中,每个程序包的说明信息显示在下列两个部分:
∙程序包信息,如绑定日期和相关的绑定选项
∙后跟要说明的SQL语句的节信息,例如,节号。
节信息之下,显示为SQL语句选择的存取方案的说明输出。
一个存取方案或节的步骤以数据库管理器执行它们的顺序显示。
每个主要步骤显示为一个向左对齐的标题,有关该步骤的信息以缩进形式显示在该标题下。
缩进条出现在该存取方案的说明输出的左页边距中。
这些条也标记操作的作用域。
在返回到缩进的先前级别之前,在同一操作中处理更低级别的缩进(更远离右边)的操作。
选择的存取方案是基于输出中显示的原始SQL语句的增强版本。
例如,原始语句可能导致激活触发器和约束。
另外,SQL编译器的查询重写组件可以将SQL语句重新编写为一种等效但更有效的格式。
当优化器确定满足该语句的最有效的方案时,会在优化器使用的信息中包括所有这些因素。
因此,在说明输出中显示的存取方案可能与对原始SQL语句期望的存取方案完全不同。
SQL说明设施(包括说明表、SETCURRENTEXPLAIN方式和VisualExplain)显示用于优化的实际SQL语句,其格式为SQL风格的语句,它是通过逆向转换查询的内部表示而创建的。
2.常用显示信息描述
2.1表存取信息
1.三种类型的常规表:
o存取表名:
AccessTableName=schema.nameID=ts,n
其中:
schema.name是正在存取的表的标准名称
ID是该表的SYSCAT.TABLES目录中对应的TABLESPACEID和TABLEID
o存取层次结构表名:
AccessHierarchyTableName=schema.nameID=ts,n
o存取具体查询表名称:
AccessMaterializedQueryTableName=schema.nameID=ts,n
1.两种类型的临时表:
o存取临时表标识:
AccessTempTableID=tn
ID是db2expln指定的对应标识
o存取已声明全局临时表标识:
AccessGlobalTempTableID=ts,tn
ID是该表(ts)的SYSCAT.TABLES目录中对应的TABLESPACEID以及由db2expln(tn)指定的对应标识
在表存取语句之后,将提供附加语句以进一步描述该存取。
这些语句以缩进形式显示在表存取语句之下。
可能的语句有:
∙列数
∙块存取
∙并行扫描
∙扫描伪指令
∙行存取方法
∙锁定意向
∙谓词
∙其它语句
2.列数
以下语句指示该表的每一行中所用的列数:
#Columns=n
3.块存取
以下语句指示表定义了一个或多个维块索引:
ClusteredbyDimensionforBlockIndexAccess
如果未显示此文本,则未使用DIMENSION子句创建该表。
4.并行扫描
以下语句指示数据库管理器将使用几个子代理程序来并行读取该表:
ParallelScan
如果未显示此文本,则该表只能由一个代理程序(或子代理程序)读取。
5.扫描方向
以下语句指示数据库管理器将按倒序读取行:
ScanDirection=Reverse
如果未显示此文本,则扫描方向为正向,这是缺省值。
6.行存取方法
将显示下列语句之一,指示如何存取表中的限定行:
∙关系扫描语句指示按顺序扫描该表,以查找限定行。
o以下语句指示将不执行数据的预取:
RelationScan
|Prefetch:
None
o以下语句指示优化器已预先确定了将预取的页数:
|Prefetch:
nPages
o以下语句指示应该预取数据:
Eligible
o以下语句指示正在通过索引标识和存取限定行:
IndexScan:
Name=schema.nameID=xx
|Indextype
|IndexColumns:
▪schema.name是正在扫描的索引的标准名称
▪ID是SYSCAT.INDEXES目录视图中的对应IID列。
▪索引类型是下列其中一项:
RegularIndex(NotClustered)
RegularIndex(Clustered)
DimensionBlockIndex
CompositeDimensionBlockIndex
对于索引中的每一列,都有一行跟在后面。
将以下列一种形式列示索引中的每一列:
n:
column_name(Ascending)
column_name(Descending)
column_name(IncludeColumn)
提供以下语句,以说明索引扫描的类型:
▪通过以下项显示索引的范围定界谓词:
#KeyColumns=n
|StartKey:
xxxxx
|StopKey:
xxxxx
其中xxxxx是下列其中一个:
▪索引开始
▪索引结束
▪包括的值:
或排除的值:
将会在该索引扫描中包括内含的键值。
不会在扫描中包括排除的键值。
下列其中一行将对键的每一部分给出该键的值:
string'
nnn
yyyy-mm-dd
hh:
mm:
ss
yyyy-mm-ddhh:
ss.uuuuuu
NULL
?
如果出现文字串,则仅显示前面20个字符。
如果该字符串长度大于20个字符,则在该字符串的最后显示...。
一些键只有在执行该部分之后才能确定。
因此会显示?
作为其值。
▪纯索引存取
如果可以从索引键获得所有需要的列,将出现此语句,且不会存取任何表数据。
▪以下语句指示将不执行索引页的预取:
IndexPrefetch:
▪以下语句指示应该预取索引页:
▪以下语句指示将不执行数据页的预取:
DataPrefetch:
▪以下语句指示应该预取数据页:
▪如果存在可以传送至“索引管理器”以帮助限定索引条目的谓词,则以下语句用于显示谓词数:
SargableIndexPredicate(s)
|#Predicates=n
o如果正在通过使用在存取方案中先前准备的行标识(RID)来存取限定行,将用下列语句指示它:
FetchDirectUsingRowIDs
如果表具有为它定义的一个或多个块索引,则块或行标识都可以访问行。
这由以下指示:
FetchDirectUsingBlockorRowIOs
7.锁定意向
对于每个表存取,都会用以下语句显示将在表和行级别获取的锁定类型:
LockIntents
|Table:
xxxx
|Row:
xxxx
表锁定的可能值有:
∙互斥
∙意向互斥
∙无任何意向
∙意向共享
∙共享
∙共享意向互斥
∙超互斥
∙更新
行锁定的可能的值有:
∙下一键互斥(不在db2expln输出中显示)
∙无
∙下一键共享
∙下一键弱互斥
∙弱互斥
8.谓词
有两个语句,它们提供有关在存取方案中使用的谓词的信息:
a.以下语句指示将对从分块索引中检索的每个数据块求出的谓词数。
BlockPredicates(s)
|#Predicates=n
b.以下语句指示当正在存取数据时将求出的谓词数。
谓词的计数不包括下推操作,例如,聚集或排序。
SargablePredicate(s)
|#Predicates=n
c.以下语句指示一旦返回数据,将求出的谓词数:
ResidualPredicate(s)
在上述语句中显示的谓词数也许未能反映在SQL语句中提供的谓词数,因为谓词可以:
∙在同一个查询中应用多次
∙在查询优化过程中,通过添加隐式谓词来变换和扩展
∙在查询优化过程中,被变换和压缩成更少的谓词。
9.其它表语句
∙以下语句指示将只存取一行:
SingleRecord
∙当此表访问所使用的隔离级别与该语句所用的不同时,就会出现以下语句:
||
IsolationLevel:
由于许多原因,可能使用不同的隔离级别,包括:
o一个程序包是用“可重复读取”绑定的,这影响了引用完整性约束;
为检查引用完整性约束而对父表进行的存取会被降级为“游标稳定性”隔离级别,以避免对此表挂起不必要的锁定。
o用“未落实的读”绑定的程序包发出DELETE或UPDATE语句;
用于实际删除的表存取会被升级为“游标稳定性”。
∙如下语句指示如果有足够的排序堆内存可用,从临时表读取的部分或全部行将高速缓存到缓冲池外:
KeepRowsInPrivateMemory
∙如果该表具有易变的基数属性集,则会通过以下信息指出:
VolatileCardinality
2.2临时表信息
1.临时表信息
存取方案在瞬态或临时工作表中执行操作期间,它使用临时表来存储数据。
仅当执行存取方案时,此表才存在。
通常,当在存取方案中需要提前对子查询求值时,或当中间结果不适合可用内存时,会使用临时表。
如果需要创建临时表,则会出现两个可能的语句中的一个。
这些语句指示将创建一个临时表,并将行插入其中。
该标识是引用临时表时为方便起见而由db2expln指定的标识。
此标识以字母“t”为前缀,以指示该表是临时表。
∙以下语句指示将创建一个普通的临时表:
InsertIntoTempTableID=tn
∙以下语句指示多个子代理程序将并行创建一个普通的临时表:
InsertIntoSharedTempTableID=tn
∙以下语句指示将创建一个已排序的临时表:
InsertIntoSortedTempTableID=tn
∙以下语句指示多个子代理程序将并行创建一个已排序的临时表:
InsertIntoSortedSharedTempTableID=tn
∙以下语句指示将创建一个已声明全局临时表:
InsertIntoGlobalTempTableID=ts,tn
∙以下语句指示多个子代理程序将并行创建一个已声明全局临时表:
InsertIntoSharedGlobalTempTableID=ts,tn
∙以下语句指示将创建一个已排序已声明全局临时表:
InsertIntoSortedGlobalTempTableID=ts,tn
∙以下语句指示多个子代理程序将并行创建一个已排序已声明全局临时表:
InsertIntoSortedSharedGlobalTempTableID=ts,tn
上述每个语句都将后跟下列内容:
它指示要插入临时表中的每一行有多少列。
2.已排序临时表信息
已排序的临时表可以由类似如下的操作产生:
∙ORDERBY
∙DISTINCT
∙GROUPBY
∙MergeJoin
∙'
=ANY'
子查询
ALL'
∙INTERSECT或EXCEPT
∙UNION(不带ALL关键字)
在已排序的临时表的原始创建语句后,可跟许多附加语句:
∙以下语句指示在排序中使用的键列数:
#SortKeyColumns=n
对于排序键中的每一列,将会显示下列其中一行:
Keyn:
(Ascending)
(Descending)
∙以下语句提供对行数和行大小的估计,以便在运行时可以分配最优的排序堆。
SortheapAllocationParameters:
|#Rows=n
|RowWidth=n
∙如果只需要排序结果的前几行,则会显示下列内容:
SortLimitedToEstimatedRowCount
∙对于在“对称多处理器”(SMP)环境中的排序,要执行的排序的类型由下列语句之一指示:
UsePartitionedSort
UseSharedSort
UseReplicatedSort
UseRound-RobinSort
∙以下语句指示排序产生的结果是否留在排序堆中:
Piped
和
NotPiped
如果指示管道排序,则数据库管理器会将排序的输出保留在内存中,而不是将排序结果置于另一个临时表中。
∙以下语句指示在排序期间将除去重复的值:
DuplicateElimination
∙如果正在排序中执行聚集,则下列其中一个语句会指示它:
PartialAggregation
IntermediateAggregation
BufferedPartialAggregation
BufferedIntermediateAggregation
3.临时表完成
在包含用于创建临时表的下推操作的表存取之后(即,创建临时表操作是在表存取范围内发生的),有一个“完成”语句,它通过让临时表准备向后续的临时表存取提供行,来处理文件结尾。
将显示下列其中一行:
TempTableCompletionID=tn
SharedTempTableCompletionID=tn
SortedTempTableCompletionID=tn
SortedSharedTempTableCompletionID=tn
4.表函数
表函数是用户定义的函数(UDF),它将数据以表的形式返回至语句。
表函数由以下语句指示:
AccessUserDefinedTableFunction
|Name=schema.funcname
|SpecificName=specificname
|SQLAccessLevel=accesslevel
|Language=lang
|ParameterStyle=parmstyle
|FencedNotDeterministic
|CalledonNULLInputDisallowParallel
|NotFederatedNotThreadsafe
特定名称唯一标识调用的表函数。
其余行详细描述函数的属性。
2.3连接信息
有三种类型的连接:
∙散列连接
∙合并连接
∙嵌套循环连接。
当在一节中执行到要执行连接时,会显示下列其中一个语句:
HashJoin
MergeJoin
NestedLoopJoin
执行左外连接是可能的。
左外连接由下列其中一个语句指示:
LeftOuterHashJoin
LeftOuterMergeJoin
LeftOuterNestedLoopJoin
对于合并和嵌套循环连接,连接的外部表将是在输出中显示的先前存取语句所引用的表。
连接的内部表将是在连接语句范围内包含的存取语句所引用的表。
对于散列连接,将存取语句反向,将外部表包含在连接范围之内,而内部表出现在连接之前。
对于散列或合并连接,可能出现下列附加语句:
∙在某些环境中,连接只需要确定内部表中的任何行是否与外部表中的当前行匹配。
它是通过下列语句来指示的:
EarlyOut:
SingleMatchPerOuterRow
∙在连接完成之后,应用谓词是可能的。
将指示应用的谓词数,如下所示:
ResidualPredicate(s)
对于散列连接,可能出现下列附加语句:
∙已根据内部表构建了散列表。
如果在进行内部表存取时将散列表的构建压入一个谓词中,则在存取内部表时用以下语句指示该构建:
ProcessHashTableForJoin
∙当存取外部表时,可以构建一个探测表来提高连接的性能。
在存取外部表时用以下语句指示探测表的构建:
ProcessProbeTableForHashJoin
∙构建散列表所需的估计字节数由以下项表示:
EstimatedBuildSize:
n
∙构建探测表所需的估计字节数由以下项表示:
EstimatedProbeSize:
对于嵌套循环连接,紧接在连接语句之后可能会出现以下附加语句:
PipedInner
此语句指示连接的内部表是另一系列的操作的结果。
这也称为组合内连接。
如果一个连接涉及两个以上的表,则应从头到尾读取说明步骤。
例如,假设说明输出具有下列数据流:
Access.....W
Join
|Access.....X
|Access.....Y
|Access.....Z
执行的步骤将是:
1.提取W中合格的行。
2.将W中的行与X中的(下一)行连接,并调用结果P1(表示编号1的部分连接结果)。
3.将P1与Y中的(下一)行连接,以创建P2。
4.将P2与Z中的(下一)行连接,以获取一个完整的结果行。
5.如果Z中存在其它行,则转至步骤4。
6.如果Y中存在其它行,则转至步骤3。
7.如果X中存在其它行,则转至步骤2。
8.