Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1342410
  • 博文数量: 169
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3800
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-30 13:00
个人简介

About me:Oracle ACE pro,optimistic,passionate and harmonious. Focus on ORACLE,MySQL and other database programming,peformance tuning,db design, j2ee,Linux/AIX,Architecture tech,etc

文章分类

全部博文(169)

文章存档

2024年(24)

2023年(28)

2022年(43)

2020年(62)

2014年(3)

2013年(9)

分类: Oracle

2020-07-23 17:06:09

内容目录:

1)了解B*tree、Bitmap、IOT等索引类型特点和使用。
2)了解索引的扫描方式以及走不了索引的情况等。
3)索引在分页查询中的应用。

ORACLE中的索引:

1)B*tree索引:默认的索引类型,最常使用

   -Index-organized tables索引组织表:相对于堆表的无序,IOT按照主键排序,索引即是表,
     表即是索引。
    -Reverse key indexes反转键索引:按照字节反转存储的索引,可解决索引块争用问题
    -Descending indexes降序索引:按照键值降序存储的索引,默认升序
    -B-tree cluster indexes聚簇索引:专门为cluster定义的索引,很少使用

2)-Bitmap和bitmap join indexes:位图索引和B*tree不同,位图索引的一个index entry使用bitmap指向多行,而B*tree一个index entry指向单行。Bitmap  join indexes是针对多张表的Join建立的索引,避免实际JOIN,从而提高效率。位图索引适合OLAP场景,索引列值的选择性不好,数据只读或者很少做DML操作。

3)-Function-based indexes:函数索引,可以是B*tree或Bitmap,基于表达式或函数运算创建的索引。


4)-Partition indexes:分区索引,利用分区技术建立的索引,提高效率,便于维护。


5)-Application domain indexes:应用域索引是用户针对应用定制的索引,比如全文索引。

B*tree索引结构



  每个B *树索引都有根块作为起始点。 根据条目的数量,有多个分支块可以有多个叶块。 叶块包含索引的所有值加上指向相关数据段中的行的ROWID。

  上一个和下一个块指针连接叶块,以便它们可以从左到右遍历(反之亦然)。索引始终是平衡的,它们从上到下增长。 在某些情况下,平衡算法会导致B *树的高度不必要地增加。 可以重组索引。 这是由ALTER INDEX ... REBUILD |完成的 COALESCE命令。

  B *树索引的内部结构允许快速访问索引值。 系统可以在从索引叶块中检索到地址(ROWID)后直接访问行。


 1)B*tree有两种类型的block:branch blocks用于搜索、leaf blocks存储数据,其中最上面的root branch。
 2)Branch blocks在两个键值之间通过最小化的前缀存储,通过指针指向子块。比如根块条目0..40指向对应分支块,它包含0..10和11..19两个条目,这两个条目通过指针指向对应的leaf block。
 3)从root branch到每个leaf block的高度是一致的。
 4)Leaf blocks按照索引列顺序加上rowid存储(key value,rowid),用于定位对应的行。Leaf blocks之间是双向链表结构。索引的有序性特点,经常用于避免SQL语句中的排序。
 5)B*tree不存储全为NULL的行。


Bitmap Index





1)Oracle针对低基数的列,可以创建位图索引来提高效率,针对每个键值创建位图。
2)位图索引可节省存储空间,对于count,and,or等之类的运算,充分利用位图的高效运算特点。
3)位图索引,一个index entry指向多行,这样在使用中,如果更新对应的位图(insert,update,delete)会对位图索引段加锁,这也是位图索引不适合OLTP的原因。
4)位图索引可存储全为NULL的行。

B*tree index vs Bitmap index




1)在OLTP环境下,基本用的都是B*tree,针对选择性好的列创建B*tree来提高效率,并且做DML操作,针对指定的行加行级锁,效率比Bitmap好,当然它的缺点是不存储全为NULL的行,并且存储要求比Bitmap多,另外没有位图的与,或之类的高效运算,ORACLE优化器目前可将普通索引转为bitmap and、bitmap or运算。
2)位图索引一般的基数比较少,做统计时使用,加的是bitmap segment level locking,锁的行多,适合OLAP环境,数据加载完后一般只读,多维统计效率高。

接PART2:http://blog.chinaunix.net/uid-7655508-id-5837972.html
阅读(2910) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~