ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 索引的类型

索引的类型

原创 Linux操作系统 作者:gvora 时间:2009-01-11 22:44:13 0 删除 编辑

1B-树索引

B-树索引可以是一个列的索引也可以是组合/复合(多个列)的索引。B-树索引最多可以包括32列。

树叶块包含了索引值、ROWID,以及前一个和后一个树叶块的数据块地址(DBA)。Oracle可以从两个方向遍历这个二叉树。B-树索引保存了在索引列上有值得每个数据行的ROWID值。Oracle不会对索引列上存有空值的行进行索引。如果索引是多个列的组合索引,而其中列上包含有空值,这一行就会处于包含空值的索引列中,且将被处理为空(视为NULL)。

2、位图索引

在位图索引中,Orale为每个惟一键创建一个位图,然后把与键值所关联的ORWID保存为位图。位图索引对于DSS和数据仓库来说非常合适。

当一个表内包含了多个位图索引时,您可以体会到位图索引的真正威力。Oracle可以合并从每个位图索引得到的结果集,快速删除不必要的数据。

技巧:对那些有较低基数的列要使用位图索引。位图对于低基数(少量的不同值)列来说非常快,这是因为索引的大小相对于B-树索引来说小了很多。因为这些索引是低基数的B-树索引,所以非常小,因此可以经常检索表中超过半数的行,并且仍适用位图索引。

技巧:在一个查询中合并多个B-树位图索引后,可以使性能显著提高。位图索引使用固定长度的数据类型要比可变长度的数据类型要好。大的块也会提高对位图索引的存储和读取性能。

 

查询索引的类型,B-树索引作为NORMAL列出,位图索引的类型值为BITMAP

SQL> select index_name,index_type from user_indexes;

 

INDEX_NAME                     INDEX_TYPE

------------------------------ ---------------------------

PK_DEPT                        NORMAL

PK_EMP                         NORMAL

SYS_C005947                 NORMAL

EMPT_ID1                       NORMAL

EMPT_ID2                       NORMAL

BANK_ID                        NORMAL

SKIP1                             NORMAL

EMP2_JOB_BM               BITMAP

EMP2_DEPTNO_BM         BITMAP

 

已选择9行。

 

建议不要在一些OLTP应用程序中使用位图索引。B-树索引的索引值中包含ROWID,这样Oracle就可以在行级别上锁定索引。位图索引被存储为压缩的索引值,其中包含了一个范围的ROWID,因此Oracle必须针对一个给定值锁定所有范围内的ROWID。这种锁定可能在某些DML语句中造成死锁。SELECT语句不会受到这种锁定的影响。

 

 

3HASH索引

 使用HASH索引必须要使用HASH群集。建立一个群集或HASH群集的同时,也就定义了一个群集键。这个键告诉Oracle如何在群集上存储表。在存储数据时,所有与这个群集键相关的行都被存储在一个数据库块上。若数据都存储在同一个数据库块上,并且使用了HASH索引,Oracle就可以通过执行一个HASH函数和I/O来访问数据——而通过适用一个二元高度为4B-树索引来访问数据,则需要在检索数据时使用4I/O

技巧:HASH索引在有限制条件(需要指定一个确定的值而不是一个值范围)的情况下非常有用。

 

4、索引组织表

索引组织表通常都按照主键顺序存储,而一个表通常都存储在一个未经编排的堆上。索引组织表会把表的存储结构改成B-树结构,以表的主键进行排序。这种特殊的表和其他类型的表一样。可以在表上执行所有的DMLDDL语句。由于表的特殊结构,ROWID并没有被关联到表的行上。

索引组织表对于一些涉及精确匹配和范围搜索的语句来说,提供了一种基于键的快速访问机制。UPDATEDELETE语句的性能也同样得以提高,这是因为只需要修改一个结构。由于键列的值在表中没有重复,存储所需要的空间也随之减少。

Oracle提供了一个更快的索引编排表,其中包括一个行溢出区。基于设定的参数值,Oracle把这些额外的行(超出主键和其他不能满足所设定参数的其他非键列)存储到一个溢出区域里,这个区域通过一个物理ROWID连接到索引组织表。可以设定的参数包括PCTTHRESHOLD,该参数指定每个块的比例。还可以设定参数INCLUDING,它命名了一个特殊的列,该列通常是在建立索引组织表的CREATE TABLE语句的最后一个非键列,剩余的就会放到溢出区域中。其目的就是为了保证溢出区域内的数据很少被用到和访问到。显然,如果要用到这些溢出的数据,那么对这些数据的访问就会很慢。

 

技巧:对于总是通过对主键的精确匹配或范围搜索进行访问的表要考虑使用索引组织表。

 

5、反转键索引

当载入一些有序数据时,索引肯定会碰到与I/O相关的一些瓶颈。在数据载入其间,某部分索引和磁盘肯定会比其他部分使用频繁得多。为了解决这个问题,可以把经过索引后的表空间存放在能够把文件物理分割在多个磁盘上的磁盘结构上。

Oracle为解决这个问题提供了一种反转键索引的方法。如果数据以反转键存储,这些数据的值就会与原先存储的数值相反,结果就是索引会为每次新插入的行更新不同的索引块。

注意:对于数据载入操作(INSERT操作),反转键索引可能比B-索引要慢2.5~3倍。

 

6、基于函数的索引

如果没有基于函数的索引,任何在列上执行了函数的查询都不能使用这个列的索引。

Create index EMP$UPPER_JOB on emp(upper(job));

 

注意:对于那些优化器所使用的基于函数的索引来说,必须把初始化参数query_rewrite_enabled设定为TRUE

 

7、分区索引

分区索引就是简单地把一个索引分成多个片断,这样可以访问更小的片断,并且可以把这些片断分别存放在不同的硬盘上(避免I/O问题)。B-数索引和位图索引都可以被分区,HASH索引不可以被分区。

有两种类型的分区索引:本地分区索引和全局分区索引。每个类型都有两个子类型,有前缀索引和无前缀索引。如果使用了位图索引就必须是本地索引。

把索引分区最主要的原因是可以减少所需读取的索引的大小,另外把分区放在不同的表空间中可以提高分区的可用性和可靠性。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15203236/viewspace-536376/,如需转载,请注明出处,否则将追究法律责任。

下一篇: RAID技术初探
请登录后发表评论 登录
全部评论

注册时间:2008-12-30

  • 博文量
    62
  • 访问量
    289406