DB2 10.5 for Linux, UNIX, and Windows

表访问信息

db2expln 输出中的一个语句将提供正在访问的表的名称和类型。

关于常规表的信息包括下列其中一个表访问语句:
   Access Table Name = schema.name  ID = ts,n
   Access Hierarchy Table Name = schema.name  ID = ts,n
   Access Materialized Query Table Name = schema.name  ID = ts,n
其中:
  • schema.name 是正在访问的表的标准名称
  • ID 是该表的 SYSCAT.TABLES 目录视图条目中的相应 TABLESPACEID 和 TABLEID
关于临时表的信息包括下列其中一个表访问语句:
   Access Temp Table  ID = tn
   Access Global Temp Table  ID = ts,tn
其中,ID 是该表 (ts) 的 SYSCAT.TABLES 目录视图条目中的相应 TABLESPACEID 或者由 db2expln 指定的相应标识 (tn)。
在表访问语句之后,会提供下列更多的语句以进一步描述该访问。

列数语句

以下语句指示在表的每一行中使用的列数:
   #Columns = n

块访问语句

以下语句指示已对表定义一个或多个维块索引:
   Clustered by Dimension for Block Index Access
如果未出现此语句,那么表明创建该表时未指定 ORGANIZE BY DIMENSIONS 子句。

并行扫描语句

以下语句指示数据库管理器使用若干子代理程序以并行方式读取该表:
   Parallel Scan
如果未出现此语句,那么表明该表仅由一个代理程序(或子代理程序)读取。

扫描方向语句

以下语句指示数据库管理器按反向顺序读取行:
   Scan Direction = Reverse
如果未出现此语句,那么表明扫描方向是正向,这是缺省情况。

行访问语句

下列其中一个语句指示如何访问表中的合格行。
  • Relation Scan 语句指示正在按顺序扫描表以查找合格行。
    • 以下语句指示不会执行数据预取:
         Relation Scan
         |  Prefetch: None
    • 以下语句指示优化器已确定预取的页数:
         Relation Scan
         |  Prefetch: n Pages
    • 以下语句指示必须预取数据:
         Relation Scan
         |  Prefetch: Eligible
  • 以下语句指示正在通过索引来标识和访问合格行:
       Index Scan:  Name = schema.name  ID = xx
       | Index type
       | Index Columns:
    其中:
    • schema.name 是正在扫描的索引的标准名称
    • ID 是 SYSCAT.INDEXES 目录视图中的相应 IID 列
    • 索引类型是下列其中一项:
         Regular index (not clustered)
         Regular index (clustered)
         Dimension block index 
         Composite dimension block index
         Index over XML data
    接着,对于索引中的每一列,都有一行输出。此信息的有效格式如下:
       n: column_name (Ascending)
       n: column_name (Descending)
       n: column_name (Include Column)
    将提供下列语句以指示索引扫描类型。
    • 通过下列语句指示索引的范围定界谓词:
         #Key Columns = n
         |  Start Key: xxxxx
         |  Stop Key: xxxxx
      其中,xxxxx 是下列其中一项:
      • Start of Index
      • End of Index
      • Inclusive Value:Exclusive Value:
        包括键值会包括在索引扫描中。排除键值不会包括在扫描中。键值由该键的每一部分的下列其中一项确定:
           n: 'string'
           n: nnn
           n: yyyy-mm-dd
           n: hh:mm:ss
           n: yyyy-mm-dd hh:mm:ss.uuuuuu
           n: NULL
           n: ?
        将只显示文字串的前 20 个字符。长度超过 20 个字符的字符串由该字符串末尾的省略号 (...) 指示。某些键只有在该部分运行之后才能确定,并且由作为值的问号 (?) 指示。
    • Index-Only Access

      如果能够从索引键中获得所有需要的列,那么会显示此语句,并且不会访问任何表数据。

    • 以下语句指示不会对索引页面进行预取:
         Index Prefetch: None
    • 以下语句指示会对索引预取启用顺序检测预取,并且它会对此类型的预取显示 MAXPAGES 值(由 x 指示):
         Index Prefetch: Sequential (x)
    • 以下语句指示会对索引预取启用提前读预取:
         Index Prefetch: Readahead
    • 以下语句指示会对索引预取启用顺序检测预取和提前读预取。它还会显示顺序检测预取的 MAXPAGES 值(由 x 表示):
         Index Prefetch: Sequential (x), Readahead
    • 以下语句指示不会执行数据页面预取:
         Data Prefetch: None
    • 以下语句指示会对数据预取启用顺序检测预取,并且它会对此类型的预取显示 MAXPAGES 值(由 x 指示):
         Data Prefetch: Sequential (x)
    • 以下语句指示会对数据预取启用提前读预取:
         Data Prefetch: Readahead
    • 以下语句指示会对数据预取启用顺序检测预取和提前读预取。它还会显示顺序检测预取的 MAXPAGES 值(由 x 表示):
         Data Prefetch: Sequential (x), Readahead
    • 如果存在可以传递至索引管理器以帮助限定索引条目的谓词,那么将使用以下语句来显示这些谓词的数目:
         Sargable Index Predicate(s)
         |  #Predicates = n
  • 当语句指示正在通过具有基于表达式的键的索引来识别和访问合格行时,db2explain 会显示有关该索引的详细信息。
    • 接着,对于索引中的每一列,都有一行输出。此信息的有效格式如下:
         n: column_name (Ascending)
         n: column_name (Descending)
         n: column_name (Include Column)
    例如,如果索引是使用表达式 upper(name)、salary+bonus 和 id 创建的,那么这些表达式会返回以下 db2expln 输出:
         |  |  Index Columns:
         |  |  |  1: K00[UPPER(NAME)] (Ascending)
         |  |  |  2: K01[SALARY+BONUS] (Ascending)
         |  |  |  3: ID (Ascending)
  • 如果正在通过存取方案中先前准备的行标识 (RID) 来访问合格行,那么这由以下语句指示:
       Fetch Direct Using Row IDs
    如果已对该表定义一个或多个块索引,那么可通过块标识或行标识来访问行。这种情况由以下语句指示:
       Fetch Direct Using Block or Row IOs

锁定意图语句

对于每个表访问,都会通过以下语句显示将在表级别和行级别获取的锁定的类型:
   Lock Intents
   |  Table: xxxx
   |  Row  : xxxx
可能的表锁定值包括:
  • Exclusive
  • Intent Exclusive
  • Intent None
  • Intent Share
  • Share
  • Share Intent Exclusive
  • Super Exclusive
  • Update
可能的行锁定值包括:
  • Exclusive
  • Next Key Weak Exclusive
  • NONE
  • Share
  • Update

谓词语句

共有三种类型的语句提供有关存取方案中使用的谓词的信息。
  • 以下语句指示对于从分块索引中检索到的每个数据块进行求值的谓词数:
       Block Predicates(s)
       |  #Predicates = n
  • 以下语句指示访问数据时进行求值的谓词数。此数目不包括下推操作,例如聚集或排序:
       Sargable Predicate(s)
       |  #Predicates = n
  • 以下语句指示返回数据之后将进行求值的谓词数:
       Residual Predicate(s)
       |  #Predicates = n
这些语句中显示的谓词数可能未反映查询语句中提供的谓词数,因为这些谓词可能是:
  • 在同一个查询中可以多次应用同一个谓词
  • 在查询优化过程中,可以通过添加隐式谓词来变换和扩展谓词
  • 在查询优化过程中,可以对谓词进行变换和压缩以减少谓词数目

其他表语句

  • 以下语句指示只访问一行:
       Single Record
  • 如果用于进行表访问的隔离级别与语句的隔离级别不同,那么会出现以下语句:
       Isolation Level: xxxx
    对于这种情况,有多种可能的原因。例如:
    • 使用“可重复读”(RR) 隔离级别绑定的程序包影响到某些引用完整性约束;为了检查这些约束而对父表进行的访问会降级到“游标稳定性”(CS) 隔离级别,以避免对此表挂起不必要的锁定。
    • 使用“未落实的读”(UR) 隔离级别绑定的程序包包含 DELETE 语句;为了执行删除操作而对表进行的访问将会升级到 CS。
  • 以下语句指示,如果有足够的 sortheap 内存可用,那么会在缓冲池外部对从临时表读取的部分或全部行进行高速缓存:
       Keep Rows In Private Memory
  • 以下语句指示已对表设置易变基数属性:
       Volatile Cardinality