1、Oracle 索引简介
      在Oracle数据库中,存储的每一行数据都有一个rowID来标识。当Oracle中存储着大量的数据时,意味着有大量的rowID,此时想要快速定位指定的rowID,就需要使用索引对象。
当对Oracle表执行指定条件的查询时,常规的方法是将所有的记录取出来,然后再把每一条记录与查询条件作对比,最后返回满足条件的记录。这样操作不仅耗费时间并耗费资源。当有了索引之后,只需要在索引中找到符合查询条件的索引字段值,就可以通过保存在索引中的rowID快速找到表中对应的记录。
      用户可以根据情况不同创建多种类型的索引。按照索引的存储方式将索引分为B树索引、位图索引、反向索引和基于函数的索引。创建索引时需要注意以下几点:
    (1)索引应该建立在 where 子句频繁引用、排序以及分组的列上,如果选择的列不合适将无法提升查询速度;
    (2)限制索引的个数。索引只要提升查询速度,但会降低 DML 操作的速度;
    (3)指定索引块空间的使用参数。基于表建立索引时, Oracle 会将相应表添加到索引块。为索引添加数据时, Oracle 会按照 pctfree 参数在索引块上预留部分空间。如果将来在表上执行大量的 insert 操作,那么应该在建立索引时设置较大的 pctfree ;
    (4)将表和索引部署到相同的表空间,可以简化表空间的管理;将表和索引部署到不同的表空间,可以提高访问性能( Oracle 能够并行读取不同硬盘的数据);
2、创建索引
      在创建索引时,Oracle首先对将要建立索引的字段进行排序,然后将排序后的字段值和对应记录的rowID存储在索引段中。查询时,根据索引查询指定条件的rowID,再根据rowID提取数据行。
1)B树索引
     B树索引时Oracle最常用的索引类型(也是默认类型),是以B树结构组织并存放索引数据。默认情况下B树索引中的数据是以升序方式排列的。B树索引是由根块、分支块和叶块组成。
     例:为emp表的deptno列创建索引index _ test
            Create index index _ test on emp (deptno)
            Pctfree 25
            Tablespace users;

其中,子句 pctfree 指定为将来 insert 操作所预留的空闲空间,子句 tablespace 指定索引段所在的表空间

2)位图索引
     当需创建索引列包含的取值太少时,如对性别列创建索引,取值只能是“男”或者“女”,使用B树索引取出来的值任然太多,失去了索引的意义。这种情况需要使用位数索引,
     例:
          Create bitmap index index _ test On emp (salary)
          Tablespace users;
     注:初始化参数create _ bitmap _ area _ size用于指定建立位图索引时分配的位图区大小,默认值为8MB ,该参数越大建立位图索引的速度越快。修改该参数语句为:
            Alter system set create _ bitmap _ area _ size =8388608
            Scope = spfile;
      修改后需要重新启动数据库方可生效;
3) 反向键索引
      在单调递增的列上使用B树索引时,若用户对表中数据做了删除操作,将导致对某一边的叶子节点的大量占用。Oracle提供另一种索引机制,及反向键索引,它可以将添加的数据随机分散到索引中。反向键索引是一种特殊的 B 树索引,在顺序递增数列上建立索引非常有用。反向键索引在原理和存储结构方面和B树索引类似。当用户插入记录时,将列值进行反向操作后进行索引,此时数据不在是递增的,所以新数据在值的范围上分布通常比原来的有序树更均匀。
      例:
           Create index index _ test On emp ( deptno ) reverse
           Tablespace users;
     如果该列上已经建立了 B 树索引,那么可以将其修改为反向键索引:
            Alter index index _ test Rebulid reverse;
4) 基于函数的索引
      用户在使用数据库时,最常遇到的问题是大小写字符敏感。例如在emp表中Job字段有MANAGER的记录,当用户使用小写搜索时则无法找到该记录,只能通过函数upper对应进行转换,在使用转换后的数据进行检查。但是这样查询是,即便job列有普通索引,Oracle也会执行全表搜索,并为遇到的各个行计算upper函数。这种情况可以使用建立基于函数的索引,通常只是常规B树索引,但是它存放的数据是由表中数据应用函数后得到的,而不是直接存放表中的数据本身。
如果习惯使用小写字符串,可以创建如下索引:
       Create index index _ test On emp (lower(job));
3、修改索引
      修改索引使用alter index完成。
      为表建立索引后,随着对表不断进行更替、插入和删除动作,索引中国会产生越来越多的存储碎片,导致索引工作效率降低。这是可以采取重建索引和合并索引清除碎片。合并索引只是将 B 树中叶子节点的存储碎片合并在一起,并不会改变索引的物流组织结构。
1)合并索引:
      Alter index index _ test Coalesce deallocate unused ;
2)重建索引:
      Alter index index _ test rebuild
      Tablespace user 1;
     重建索引时可以更改索引的类型,存储表空间等
4、删除索引
      删除索引使用drop index语句。当索引过于碎片化,或者不经常被用到时,既可以删除索引:
           Drop index index _ test;
      注:删除表是也会删除其相应的索引。
5、显示索引信息
      为了显示索引的信息,Oracle提供了一系列数据字典视图,使用户了解索引的各方面信息。
1)显示表的所有索引:显示emp的所有索引
     Select * from dba _ indexs where owner =’EMP’;
2)显示索引列:显示index _ test所使用的索引列:
     Select * from user _ ind _ columns where index _ name =’INDEX _ TEST’
3)显示索引位置及大小
     Select * from user _ segments where segment _ name =’INDEX _ TEST’
4)显示函数索引
     Select * from user _ ind _ expressions where index _ name =’INDEX _ TEST’

6、索引失效原因汇总

参考博客:https://www.cnblogs.com/651434092qq/p/11209261.html

转自:http://blog.itpub.net/31535677/viewspace-2199178/https://www.cnblogs.com/caomj/p/10751399.html

Oracle中的索引的更多相关文章

  1. Oracle中的索引详解

    Oracle中的索引概述 索引与表一样,也属于段(segment)的一种.里面存放了用户的数据,跟表一样需要占用磁盘空间.索引是一种允许直接访问数据表中某一数据行的树型结构,为了提高查询效率而引入,是 ...

  2. Oracle中B-TREE索引的深入理解(转载)

    索引概述 索引与表一样,也属于段(segment)的一种.里面存放了用户的数据,跟表一样需要占用磁盘空间.只不过,在索引里的数据存放形式与表里的数据存放形式非常的不一样.在理解索引时,可以想象一本书, ...

  3. 简单了解,使用oracle中的索引,表分区

    索引的分类 如下: 物理分类 逻辑分类 分区或非分区索引 单列或组合索引 B树索引(标准索引) 唯一或非唯一索引 正常或反向键索引 基于函数索引 位图索引   B树索引 b树索引通常也称为标准索引,索 ...

  4. Oracle中组合索引的使用详解(转)

    在Oracle中可以创建组合索引,即同时包含两个或两个以上列的索引.在组合索引的使用方面,Oracle有以下特点: 1. 当使用基于规则的优化器(RBO)时,只有当组合索引的前导列出现在SQL语句的w ...

  5. [转]Oracle中的索引详解

    原文地址:http://www.oschina.net/question/30362_4057 一. ROWID的概念 存储了row在数据文件中的具体位置:64位 编码的数据,A-Z, a-z, 0- ...

  6. Oracle中的索引详解(转载)

    一. ROWID的概念 存储了row在数据文件中的具体位置:64位 编码的数据,A-Z, a-z, 0-9, +, 和 /, row在数据块中的存储方式 SELECT ROWID, last_name ...

  7. 索引笔记《一》Oracle中的索引详解

    一. ROWID的概念 存储了row在数据文件中的具体位置:64位 编码的数据,A-Z, a-z, 0-9, +, 和 /, row在数据块中的存储方式 SELECT ROWID, last_name ...

  8. oracle中位图索引和B-tree索引的区别

    1.适用系统的不同:位图索引适合OLAP系统,而B-tree索引适合OLTP系统. 2.占用存储空间不同:位图索引只需要很小的存储空间,而B-tree索引需要占用很大的存储空间. 3.创建需要的时间不 ...

  9. SQL Server中的索引

    1 SQL Server中的索引 索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度.索引包含由表或视图中的一列或多列生成的键.这些键存储在一个结构(B 树)中,使 SQL Serve ...

随机推荐

  1. DeWeb 电脑和手机动态适配

    DeWeb 做多平台适配很方便! 多平台适配代码在OnMouseUp中. X,Y分别表示当前设备的Width/Height: Button : mbLeft : 屏幕纵向, mbRight:屏幕横向: ...

  2. oracle静默安装完成后,重启数据库,错误ORA-01102: cannot mount database in EXCLUSIVE mode

    静默安装oracle完成后,登录数据库激活用户,无法更改,提示未载入数据库,关闭后重启报错: 1.找到安装目录下的$ORACLE_HOME/dbs/ 目录下,查看当前使用lkORCL文件的用户(fus ...

  3. RocketMQ Consumer 启动时都干了些啥?

    可能我们对 RocketMQ 的消费者认知乍一想很简单,就是一个拿来消费消息的客户端而已,你只需要指定对应的 Topic 和 ConsumerGroup,剩下的就是只需要: 接收消息 处理消息 就完事 ...

  4. 变量命名网站 Codelf

    程序员最头疼的事情除了头发以外就是给变量或函数命名,一开始学编程语言的时候还可以 abc.a1.x2 等方式命名,等到工作过程中开始真正的项目开发时,如果还是这样随意的命名,即使同事可以忍受你的 ab ...

  5. vscode + vim 全键盘操作高效搭配方案

    基础知识 vscode-vim vscode-vim是一款vim模拟器,它将vim的大部分功能都集成在了vscode中,你可以将它理解为一个嵌套在vscode中的vim. 由于该vim是被模拟的的非真 ...

  6. 【java+selenium3】select 下拉选 (八)

    一.select 下拉框 1.下拉选的处理类:Select 如果页面元素是一个下拉框,我们可以将此web元素封装成Select对象. Select select = new Select(WebEle ...

  7. JMeter学习笔记--关联

    1.什么是关联? 本次请求需要的数据,需要上一步的请求返回给提供的过程. 2.JMeter关联中常用的两种方式 正则表达式提取器 正则表达式提取器用于对页面任何文本的提取,提取的内容是根据正则表达式在 ...

  8. 在代码生成工具Database2Sharp中增加Vue&Element 工作流页面的快速生成

    在我们基于框架开发系统的时候,往往对一些应用场景的页面对进行了归纳总结,因此对大多数情况下的页面呈现逻辑都做了清晰的分析,因此在我们基于框架的基础上,增量式开发业务功能的时候,能够事半功倍.代码生成工 ...

  9. [python]django rest framework写POST和GET接口

    版本声明 python3.6.5 Django-2.0.6 djangorestframework-3.8.2 mysqlclient-1.3.12 1.写一个登录接口,不多说,直接上代码 login ...

  10. 大爽Python入门教程 2-2 序列: 字符串、元组与列表

    大爽Python入门公开课教案 点击查看教程总目录 序列 序列(sequence): 顾名思义,有序的排列. 有序排列的一串数据. 一种容器,容器内成员有序排列. python的字符串str,元组tu ...