ITPub博客

首页 > 数据库 > Oracle > b+ and bitmap index

b+ and bitmap index

原创 Oracle 作者:dotaddjj 时间:2011-09-30 08:38:49 0 删除 编辑

索引是优化查询的一个很重要但是又很复杂的技术手段。有时候提到查询更多的网友都是create 索引,但是索引的创建和sql优化器以及具体业务情况都是很有关系的。以及具体索引的类别,具体是b+树索引还是bitmap索引。

创建一个默认b+树单列索引

Create index index_test01 on test01(id);

Create默认的b+树基于函数的索引

Create index index_fun_test05 on test05(substr(id,1,1)

创建一个基于函数的索引,在9.2.0.3之前query_rewrite_enabled参数必须为true,基于函数的索引才能生效,后续版本中基于函数的索引跟此参数已经无关,其中基于函数的索引是先计算该函数或表达式的值然后存储与索引中。

当然还可以创建多列索引。

Create index index_test01 on test01(id,name)

B+树索引:

B+树索引都是树状结构,b+树索引通常是指为索引每个关键字保存一个rowid列表的索引。

索引的最上层是根,然后下一级别是分支块,最底层是叶,关键字扫描索引既可以升序也可以降序。

索引的入口:入口头(包含字段编号和锁信息);关键字段长度和值 rowid(rowid是限制性rowid,由于存储在同一索引段内)

如果关键字段为null,该列不会存储在索引中,所以where中使用null会导致全表扫描。

对表dml操作时,oracle还需要对其关键字的索引进行维护,在dml时可以把索引drop或者无效,然后再重建索引加快dml操作。

Dml和索引:

Insert数据行导致在适当的块中插入,delete仅仅导致删除,update索引字段会导致索引的删除和插入。

rebuild index:

由于对表的dml操作会在索引列上进行相应的更新。例如对表的delete,删除索引中的记录,但是该记录索引项的使用空间不能被重新使用,因此索引空间会不断增加,只是因为索引中无效空间会增加。当然需要管理员定期的对频繁使用的table做alter index rebuild,这样也可以适当的提高使用该索引的查询的效率。

B+树索引的索引值中包含rowid,oracle可以在行级别上锁定索引。但是由于每一数据行索引就会存储在索引段数据块中,bitmap对于相同的关键字只存储与单一数据块中,所以b+树索引需要索引段的更多的数据块。

有两种类型的索引块: (这个是b+树的索引的结构)
1、用于搜索的分支块(branch block)
2、用于存储索引数据的叶块(leaf block)

分支块中存储以下信息:(关于分支快中存储的信息需要理解 )
1、最小的键值前缀,用于在(本块的)两个键值之间做出分支选择。
2、指向包含所查找键值的子块的指针。

包含 n 个键值的分支块含有 n+1 个指针。键值及指针的数量同时还受索引块容量的限制。

所有叶块相对于其根分支块的深度是相同的。

叶块用于存储以下信息:(这也是叶块用于索引检索的关键)
1、数据行的键值(key value) 。
2、键值对应数据行的 ROWID 。

位图索引:

位图索引被存储为压缩的索引值,位图索引结构和b+树索引相同,但是叶节点保存的关键字值的位图而不是rowid,其中包含一个范围内的rowid,b+树索引的叶子节点对应一个rowid,利用位图向量计数。

叶节点:入口头 关键字值 起始rowid 结束rowid 位图段,其中oracle使用一种专利压缩技术保存位图段。

位图索引和b+树索引:

1 b+树索引适合高候选字段,bitmap索引适合低候选字段

2 b+树索引关键字的更新代价相对较小,bitmap索引关键字段更新代价高

3 b+树使用or谓词查询效率低,bitmap索引使用or谓词查询效率高

4 b+树多适用于OLTP,bitmap适用与OLAP,OLAP事务处理,多为即时处理,OLAP数据仓库需要高级管理进行数据分析。

位图索引更新关键字代价较大,是由于位图使用位图段级锁,而在b+树索引,锁加载入口对应表中一行。

位图索引可以用于类似位图’与’操作,oracle可以使用两个位图位和操作,得到一个结果位图,这样使用or可以高效利用位图索引。

自动段空间管理中,段的pctfree参数用于存放后续的insert空间,pctused已经不起作用了,同样也使用与索引段中。

Create_bitmap_area_size参数

位图索引的初始化参数create_bitmap_area_size决定了内存中用来存储位图段的空间数量,默认值是8M,较大的数值可能会加快位图索引的创建速度。

重建索引:使用已经存在的索引重建索引时,不需要排序,当然创建速度比drop然后create快多了,重建的索引不包含任何删除的入口,因此索引的利用率更高。当然重构索引不能把b_tree树索引转换为bitmap索引,反之亦然。

合并索引:索引的合并是联机数据块的重构

Alter index index_test02 coalesce

分析索引的有效性:

Analyze index index_test02 validate structure

分析索引后查询index_status视图。

Alter index index_test02 minitoring usage

检测索引的使用,从oracle 9I后查询v$object_usage中收集有关索引的使用情况,monitioring usage后就会重置视图信息

Truncate和索引:

Truncate表时不仅表段会重建新建,索引段也会释放空间重建。

[@more@]

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

请登录后发表评论 登录
全部评论
  • 博文量
    220
  • 访问量
    1662977