oracle索引

一个表如果数据量非常的大,如果这个表又没有索引的话,那么在查询这个表中的任何记录都只能顺序的扫描,那么这将会产生大量的IO输入输出,因此会降低执行效率.为了加快查询的速度,这个时候我们就需要用到索引.什么是索引呢? 打个比方来说,你看一本书,但是你想看这个书中的某一点内容,假设这本书没有目录的话,那么你只能一页一页的去寻找你想要看的内容.这样是不是很慢.加入有了目录的话,你首先会去看目录,找到某一条目录,然后根据目录指向的页码,然后直接去阅读该页码下你想要阅读的内容.在这里来说,目录就相当于是索引.

在oracle当中,索引也是按照索引关键字的顺序存放的记录,也叫数据结构.在索引记录中存有索引关键字,以及指向表中真正数据的指针(地址).oracle系统利用算法在索引上可以很快的查找到所系的记录,并且利用指针找到所需的数据.oracle索引当中只存储了索引关键字和指向表中真正数据的指针,因此规模要小很多,所以对索引进行操作的IO量要比操作表的IO量小很多,也就相当于加快了查询速度.

在oracle当中,索引是一个独立于表的对象,它可以存放在与表不同的磁盘上,即使索引崩溃了, 也不会影响真正存有数据的表.索引从建立之后就由oracle自动进行维护.并且oracle自动决定什么时候使用该索引.不需要在查询语句当中指定使用索引.如果表被删除时,基于该表的所有索引都会被自动的删除掉.

建立索引

系统自动建立

当在表上建立主键(primary key),或唯一约束(unique)时,oracle会自动创建唯一索引.

手动建立

手动在一个表的一列或者多列上使用创建索引的语句来创建非唯一索引(NONUNIQUE INDEX).
创建索引的语法如下, CREATE INDEX (索引名称) ON 表名 列名.可以理解为  创建名为XXX的索引,在(ON)哪个表的哪个列上.
需要注意的是,oracle推荐的索引命名方式为  "表名_列名_对象类型",这种方式对于oracle来说维护起来更方便,当然这不是强制性的,而是一个建议.

查看索引

可以利用oracle的数据字典 user_indexes 来查看当前登录用户下的索引信息.一个简单的查询语句就搞定 
select * from user_indexes
查询出来的字段名称,关注点可以只有几个,如下.

更详细的信息可以查询 user_ind_columns 这个表来获得,可以查询到更具体的信息.

使用索引应该注意的问题

索引关键字:个人理解为就是索引名称.
尽管建立索引可能会加快查询速度,但是这可能会降低DML操作的速度.因为每一条DML语句,只要涉及到索引关键字,那么oracle就要调整索引.而且索引做为独立的对象是需要磁盘空间的.如果表很大,那么索引消耗的磁盘空间也会很大.应该尽量避免在一个表上创建过多的索引.而且建立了索引,oracle也并不一定保证会使用它.为了使用索引,应该尽量把索引关键字放在SELECT语句的WHERE子句中.虽然这也不能保证oracle一定使用索引.例如把组合索引总的一个索引关键字放在了SELECT语句中的WHERE字句中么人该索引关键字不是罪左边的索引关键字.

oracle给出的关于索引的建议

  1. 表很大而且大多数查询的返回数据量很少(oracle推荐为小于总行数的百分之二到百分之四).因为如果返回的数据量很大的话,就不如顺序的扫描这个表了.
  2. 此列的取值范围很广.一般为随机分布.如在大多数员工表中的年龄一列(18--65)岁的都有.可以认为是随机分布.但是范围小的话,就不是随机分布了.
  3. 一列或多列经常出现在WHERE字句或连接条件中.
  4. 表上的DML操作很少.
  5. 此列中包含了大量的空值(NULL)
  6. 此列不经常做为SELECT语句中某个表达式的一部分.

函数式索引

一般的索引其关键字是列,而函数式索引则是表达式.
假设,如果在SELECT语句中的WHERE字句中使用了某一表达式,那么如何加快这样的查询速度呢?我们可以使用函数式索引来解决这样的问题.
创建的方式与一般的索引相同,只不过列名换成了表达式.

创建完毕之后查询可以看到如下

删除索引

删除索引语法为
DROP INDEX 索引名称
其次在删除表时,跟该表想关联的一些索引也会被一同删除.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值