Index的几种访问方式

来源:互联网 发布:微博和淘宝怎么解绑 编辑:程序博客网 时间:2024/04/27 22:31

转自: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中就可以拿数据了.

原创粉丝点击