oracle索引(b*树和位图)学习总结
(1)索引相关视图
查询dba_indexes视图得到表中列出所有的指标;进入user_ind_columns视图可以得到特定的列,在一个给定的表索引。
(2)综合指数的概念
当索引包含多个列被索引,索引被称为concatented指数。
注意:只有在索引中使用引导索引时,才能使用复合索引。
(3)b *树索引
树索引是最常见的索引结构,默认索引是这种类型的索引。
DML语句:
创建表的索引(列名列名{…})
B树的特点:
适合大量增加、删除、更改(OLTP);
不能使用包含运算符或运算符的查询;
适合高基数的列(唯一值);
典型的树状结构;
每个节点都是一个数据块。
它们大多是物理的,两层或三层的,三层是逻辑的;
叶块的数据进行排序,从左到右递增。
索引的范围放在分支和根块中。
(4)位图索引
位图索引主要用于决策支持系统或静态数据,不支持行级锁定。位图索引最好用于低基数列(即,列的唯一值除以行数是一个非常小的值,接近于零)。
DML语句:
Create BITMAP index indexname on tablename (columnname{columnname...})
位图的特点:
适宜决策支持系统;
更新是非常昂贵的。
一个非常适合于OR操作符的查询;
当基数较少时,可以创建位图索引。
(5)b *树与位图的区别
在B * *树中,索引条目和行之间通常存在一对一关系:索引项指向一行;对于位图索引,索引项使用位图同时指向多行。
位图索引适用于高度重复,通常只读数据(高重复是指总排数相对表,只有少数不同值的数据)。如果B树索引通常是用于访问数据量小的情况相比,如你在表中的数据是不超过5%,适用于一般的情况;如果位图被广泛应用于数据仓库,为低的碱基序列,如性别像大部分领域重复值的基数较小。
(6)索引失败的情况
使用赋值操作符(< =,!)
索引通常用来避免通过将非相等操作符更改为(或)条件来进行完整的表扫描。
使用NULL或不是null。
使用为空或不空也将限制使用索引,因为空值是未定义的。空在SQL语句的使用会带来很多麻烦。因此,建议开发商设置列需要索引非空表时建造的。如果指数柱上有一些列的空值,该指标将不被使用(除非指数是一个位图索引)。
使用功能
如果不使用基于函数的索引,优化器将在使用SQL语句WHERE子句中的函数时忽略这些索引。
更不匹配的数据类型
不匹配数据类型的比较将使Oracle自动限制索引的使用。即使在这个查询上执行解释计划,也不能理解为什么进行了完整的表扫描。
复合索引中的前导词不用作查询条件。
在复合索引中,前导必须用作查询条件,索引将被使用。
CBO模式中选择的行数太大,优化器需要进行一次完整的表扫描。
这是一个基于成本的优化考虑。