转自:http://www.blogjava.net/yes1983/archive/2009/06/17/282922.html
index access在DB2中有几种:
i.首先,最简单的一种就是direct index lookup.它从index的root开始遍历,直到找到符合要求的leaf page为止.然后再利用leaf page中的datapage pointer去访问真正的data.这种方法要求index中的每个column都有明确的值.比如在下面这个表中,index建立在 DEPTNO, TYPE, 和EMPCODE三个column上.SELECT FIRSTNAME, LASTNAME
FROM EMPLOYEE
WHERE DEPTNO = 5
AND TYPE = 'X'
AND EMPCODE = 10;
如果你只给了DEPTNO, TYPE的值,那么是没有办法direct index lookup的,因为无法和一个index key对应.对于这种情况,就要用到下面所说的index scan.
ii.index scan
先说下index中的column,还是上面那个例子,index建立在DEPTNO, TYPE,EMPCODE上,那么这三个column不是像电影的演员表一样排名不分先后的,DEPTNO优先级高(也可以称之为high order column),TYPE次之,EMPCODE最后.index scan的时候,是先根据DEPTNO的值,确定一个范围,然后再TYPE,最后EMPCODE.如果大家还不理解,我们可以想象这三个column构成了一个表,DEPTNO是第一个column,TYPE是第二个column,EMPCODE是第三column.而且这个表里的数据都是排好序的.如果我指定了三个确定的值(5,'X',10),那么我肯定在这个表里可以找到唯一的一个row.但是如果我只有两个值(5,'X'),那么我可以找到一个由一些row构成的block,这块数据里面的row都是符合条件的.如果我丢掉了highorder column,比如(,'X',10),那么你可以想象的到,你在这个表里可以找到很多符合条件的row,但是它们不是聚集在一起的.好,接下来说下index scan中的两种 scan方法.
1.matching index scan
还是上面的例子,加入去掉EMPCODE = 10,那么matching index scan会从index的root开始找,直到找到第一个符合条件(DEPTNO = 5, TYPE = 'X' )的leaf page,但这时候它不能确定有几个leaf page符合条件,由于index key不完整,有可能有很多歌leaf page都符合条件(EMPCODE1-10000的都是符合条件的),但是由于high order column已经指定了,所以满足条件的leafpage肯定是在一起的,所以DB2会从第一个开始,向右一直scan,直到把所有符合条件的leaf page都找到为止.
2.non-matching index scan
假如去掉DEPTNO=5,也就是去掉了high order column,那么根据我们上面的讨论,返回的结果是很多leaf page而且这些leaf page不一定是连续的在一起的.所以这时候,index tree的B+树结构就没有意义了,DB2需要整个遍历index tree的leaf page来找到所有符合条件的leaf page.(这时不会再访问non-leaf page了)
iii.index only access
这种情况比较少见.它出现的条件是index的column已经包含了你的query中的column.还是上面的例子,我们稍微改一下select语句:
SELECT DEPTNO, TYPE
FROM EMPLOYEE
WHERE EMPCODE = 10;
你会发现DEPTNO, TYPE都是index中的column,所以DB2根本不需要访问data page,直接从index page中就可以拿数据了.