Oracle索引

您所在的位置:网站首页 Oracle加索引语句 Oracle索引

Oracle索引

#Oracle索引| 来源: 网络整理| 查看: 265

索引 (一)什么是索引

索引是用于加速数据存取的数据对象。合理的使用索引可以大大降低 i/o 次数,从而提高数据访问性能。

索引是需要占据存储空间的,也可以理解为是一种特殊的数据。形式类似于下图的一棵“树”,而树的节点存储的就是每条记录的物理地址,也就是我们提到的伪列(ROWID)

img

(二)普通索引 语法: create index 索引名称 on 表名(列名); 需求:我们经常要根据业主名称搜索业主信息,所以我们基于业主表的 name 字段来建立索引。语句如下: create index index_owners_name on t_owners(name);

索引性能测试:

创建一个两个字段的表

create table t_indextest( id number, name varchar2(30) ); 编写 PL/SQL 插入 100 万条记录 begin for i in 1..1000000 loop    insert into t_indextest values (i,'AA'||i); end loop; commit; end;

创建完数据后,根据 name 列创建索引

create index index_testindex on t_indextest(name)

执行下面两句 SQL 执行

SELECT * from T_INDEXTEST where ID=765432;

img

SELECT * from T_INDEXTEST where NAME='AA765432';

img

我们会发现根据 name 查询所用的时间会比根据 id 查询所用的时间要短

(三)唯一索引

如果我们需要在某个表某个列创建索引,而这列的值是不会重复的。这是我们可以创建唯一索引

语法: create unique index 索引名称 on 表名(列名);

需求:在业主表的水表编号一列创建唯一索引 语句: create unique index index_owners_watermeter on t_owners(watermeter) 先查询t_owners select * from t_owners

img

我们尝试把王刚的水表编号修改为和范小冰的一样

update t_owners set watermeter = 30406 where id = 2

img

可以看出唯一索引起的作用

(四)复合索引

我们经常要对某几列进行查询,比如,我们经常要根据学历和性别对学员进行搜索,如果我们对这两列建立两个索引,因为要查两棵树,查询性能不一定高。那如何建立索引呢?我们可以建立复合索引,也就是基于两个以上的列建立一个索引 。

语法:

create index 索引名称 on 表名(列名,)

根据地址和门牌号对学员表创建索引,语句如下:

create index owners_index_ah on t_owners(addressid,housenumber); (五)反向键索引

我们知道Oracle会自动为表的主键列建立索引,这个默认的索引是普通的B-Tree索引。对于主键值是按顺序(递增或递减)加入的情况,默认的B-Tree索引并不理想。这是因为如果索引列的值具有严格顺序时,随着数据行的插入,索引树的层级增长很快。搜索索引发生的I/O读写次数和索引树的层级数成正比,也就是说,一棵具有5个层级的B -Tree索引,在最终读取到索引数据时最多可能发生多达5次I/O操作。因而,减少索引的层级数是索引性能调整的一个重要方法。 如果索引列的数据以严格的有序的方式插入,那么B-Tree索引树将变成一棵不对称的"歪树",如图所示:

img

而如果索引列的数据以随机值的方式插入,我们将得到一棵趋向对称的索引树,如图 所示:

img

比较图 1和图2,在图1中搜索到A块需要进行5次I/O操作,而图2仅需要3次I/O操作。 既然索引列数据从序列中获取,其有序性无法规避,但在建立索引时,Oracle允许对索引列的值进行反向,即预先对列值进行比特位的反向,如 1000,10001,10011,10111,1100经过反向后的值将是0001,1001,1101,0011。显然经过位反向处理的有序数据变得比较随机了,这样所得到的索引树就比较对称,从而提高表的查询性能。 但反向键索引也有它局限性:如果在WHERE语句中,需要对索引列的值进行范围性的搜索,如BETWEEN、等,其反向键索引无法使用,此时,Oracle将执行全表扫描;只有对反向键索引列进行 和 = 的比较操作时,其反向键索引才会得到使用。

语法:

create index 索引名称 on 表名(列名) reverse; (六)位图索引

(3条消息) oracle 位图索引(bitmap index)bitmap index oracle游逸2014的博客-CSDN博客  

语法: create bitmap index 索引名称 on 表名(列名); 需求:我们在 T_owners表的 ownertypeid列上建立位图索引,语句: create bitmap index index_owners_typeid on T_OWNERS(ownertypeid)

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3