初识
      
      
        oracle
      
      
        中的索引组织表
      
    
  
  
    
      
        
              
        
      
      
        索引组织表(
      
      
        IOT
      
      
        )有一种类
      
      
        B
      
      
        树的存储组织方法。普通的堆组织表是以一种无序的集合存储。而
      
      
        IOT
      
      
        中的数据是按主键有序的存储在
      
      
        B
      
      
        树索引结构中。与一般
      
      
        B
      
      
        树索引不同的的是,在
      
      
        IOT
      
      
        中每个叶结点即有每行的主键列值,又有那些非主键列值。
      
    
  
  
    
      
        如下图所示,在
      
      
        IOT
      
      
        所对应的
      
      
        B
      
      
        树结构中,每个索引项包括
      
      
        <
      
      
        主键列值,非主键列值
      
      
        >
      
      
        而不是
      
      
        ROWID
      
      
        ,对于普通堆组织表,
      
      
        oracle
      
      
        会有对应的索引与之对应,且分开存储。换句话说,
      
      
        IOT
      
      
        即是索引,又是实际的数据。
      
    
  
  
  
    
      
        
                                         
          
            普通表索引与表数据的对应关系
          
        
      
    
  
  
  
    
      
        
                                      
          
            IOT
          
          
            的索引项和表数据的对应关系
          
        
      
    
  
  
    
      
        IOT
      
    
    
      和普通表对于应用程序来说,例如
    
    
      
        sql
      
    
    
      查询语句,是没有区别的。也就是说
    
    
      
        oracle
      
    
    
      中对表的组织形式对应用来说是透明的。
    
  
  
    
      
        
                 
        
      
    
    
      下表总结了
    
    
      
        IOT
      
    
    
      与一般表的区别:
    
  
  | 
              
                普通表
              
             | 
              
                
                  IOT
                
              
             | 
| 
              
                
                  ROWID
                
              
              
                唯一确定一行录
              
             | 
              
                主键唯一确定一行记录
              
             | 
| 
              
                可以不指定主键
              
             | 
              
                必须指定主键
              
             | 
| 
              
                
                  ROWID
                
              
              
                伪列中保存物理
              
              
                
                  rowid
                
              
              
                ,可以构建二级索引
              
             | 
              
                
                  ROWID
                
              
              
                伪列中保存逻辑
              
              
                
                  rowid
                
              
              
                ,可以构建二级索引
              
             | 
| 
              
                基于
              
              
                
                  rowid
                
              
              
                进行访问
              
             | 
              
                基于逻辑
              
              
                
                  rowid
                
              
              
                进行访问
              
             | 
| 
              
                顺序扫描才能得到所有行
              
             | 
              
                只须扫描索引即可返回所有行
              
             | 
| 
              
                可以和其它表一起聚集存储
              
             | 
              
                不能存储为聚集表
              
             | 
| 
              
                可以包含
              
              
                
                  long
                
              
              
                和
              
              
                
                  lob
                
              
              
                类型的列
              
             | 
              
                可以包含
              
              
                
                  lob
                
              
              
                类型但不可以包括
              
              
                
                  long
                
              
              
                类型的列
              
             | 
      
        使用
      
      
        
          IOT
        
      
      
        的好处:
      
    
    
      
        
          1
        
      
      
        、由于索引项和数据存储在一起,所以无论是基于主键的等值查询还是范围查询都能大大节省磁盘访问时间。
      
    
    
      
        
          2
        
      
      
        、为了能够更快地访问那些频繁访问的列,可以使用溢出存储选项将那些访问不频繁的列放在
      
      
        
          B
        
      
      
        树叶结点数据块之外的溢出堆空间中。这样一来便可以得到更小的
      
      
        
          B
        
      
      
        树,以及包含更多行的叶结点
      
    
    
      
        
          3
        
      
      
        、和堆组织表和索引不同,主键不需要被存储两次。
      
    
    
      
        
          4
        
      
      
        、
      
      
        
          ROWID
        
      
      
        伪列是基于主键值的逻辑
      
      
        
          rowid
        
      
      
        ,而不是物理
      
      
        
          rowid
        
      
      
        ,即使表被重新组织过,造成了基表行的迁移,二级索引仍然可用,不需要重建。
      
    
    
      
        注:
      
    
    
      
        
          1
        
      
      
        、
      
      
        
          Oracle
        
      
      
        使用
      
      
        
          rowid
        
      
      
        数据类型存储行地址
      
      
        
          ,rowid
        
      
      
        可以分成两种,分别适于不同的对象,
      
      
        
          Physical rowids
        
      
      
        :存储
      
      
        
          ordinary table,clustered table,table partition and subpartition,indexe,index partition and subpartition;
        
      
      
        
          Logical rowids :
        
      
      
        存储
      
      
        
          IOT
        
      
      
        的行地址
      
    
    
      
        
          2
        
      
      
        、每个表在
      
      
        
          oracle
        
      
      
        内部都有一个
      
      
        
          ROWID
        
      
      
        伪列
      
      
        
          ,
        
      
      
        它在所有
      
      
        
          sql
        
      
      
        中无法显示,不占存储空间
      
      
        
          ;
        
      
      
        它用于从表中查询行的地址或者在
      
      
        
          where
        
      
      
        中进行参照
      
      
        
          ,
        
      
      
        一个例子如下:
      
    
    
      
        
          
                
          
           SELECT ROWID, last_name FROM employees;          
        
      
      
        
          Oracle
        
      
      
        内部使用保留在
      
      
        
          ROWID
        
      
      
        伪列中的值构建索引结构
      
      
        
          ,rowid
        
      
      
        伪列不存储在
        
          数据库
        
         中
      
      
        
          ,
        
      
      
        它不是数据库表的数据
      
      
        
          ,
        
      
      
        (从
      
      
        
          database
        
      
      
        及
      
      
        
          table
        
      
      
        的逻辑结构来说)。事实上
      
      
        
          ,
        
      
      
        在物理结构上
      
      
        
          ,
        
      
      
        每行由一个或多个
      
      
        
          row pieces
        
      
      
        组成
      
      
        
          ,
        
      
      
        每个
      
      
        
          row piece
        
      
      
        的头部包含了这个
      
      
        
          piece
        
      
      
        的
      
      
        
          address,
        
      
      
        即
      
      
        
          rowid.
        
      
      
        从这个意义上来说,
      
      
        
          rowid
        
      
      
        还是占了磁盘空间的
      
      
        
          .
        
      
    
    
      
        
          3
        
      
      
        、二级索引:
      
      
        
          
            也可理解为聚集索引,好比是我们人查字典时自已会使用的索引。
          
        
      
    
  
  


 
     
     
					 
					