1 简介

  1)索引是数据库对象之一,用于加快数据的检索,类似于书籍的索引。在数据库中索引可以减少数据库程序查询结果时需要读取的数据量,类似于在书籍中我们利用索引可以不用翻阅整本书即可找到想要的信息。

  2)索引是建立在表上的可选对象;索引的关键在于通过一组排序后的索引键来取代默认的全表扫描检索方式,从而提高检索效率

  3)索引在逻辑上和物理上都与相关的表和数据无关,当创建或者删除一个索引时,不会影响基本的表;

  4)索引一旦建立,在表上进行DML操作时(例如在执行插入、修改或者删除相关操作时),oracle会自动管理索引,索引删除,不会对表产生影响

  5)索引对用户是透明的,无论表上是否有索引,sql语句的用法不变

  6)oracle创建主键时会自动在该列上创建索引

2 原理

1.  若没有索引,搜索某个记录时(例如查找name='wish')需要搜索所有的记录,因为不能保证只有一个wish,必须全部搜索一遍

2. 若在name上建立索引,oracle会对全表进行一次搜索,将每条记录的name值哪找升序排列,然后构建索引条目(name和rowid),存储到索引段中,查询name为wish时即可直接查找对应地方

3.创建了索引并不一定就会使用,oracle自动统计表的信息后,决定是否使用索引,表中数据很少时使用全表扫描速度已经很快,没有必要使用索引

3 使用

3.1 创建索引语法

1 CREATE [UNIQUE] | [BITMAP] INDEX index_name  --unique表示唯一索引
2 ON table_name([column1 [ASC|DESC],column2    --bitmap,创建位图索引
3 [ASC|DESC],…] | [express])
4 [TABLESPACE tablespace_name]
5 [PCTFREE n1]                                 --指定索引在数据块中空闲空间
6 [STORAGE (INITIAL n2)]
7 [NOLOGGING]                                  --表示创建和重建索引时允许对表做DML操作,默认情况下不应该使用
8 [NOLINE]
9 [NOSORT];                                    --表示创建索引时不进行排序,默认不适用,如果数据已经是按照该索引顺序排列的可以使用

3.2 修改索引

1)重命名索引

alter index index_sno rename to bitmap_index;

2) 合并索引(表使用一段时间后在索引中会产生碎片,此时索引效率会降低,可以选择重建索引或者合并索引,合并索引方式更好些,无需额外存储空间,代价较低)

alter index index_sno coalesce;

3)重建索引

  方式一:删除原来的索引,重新建立索引

  方式二:

alter index index_sno rebuild;

3.3 删除索引

drop index index_sno;

3.4 查看索引

1 select index_name,index-type, tablespace_name, uniqueness from all_indexes where table_name ='tablename';
2  -- eg:
3 create index index_sno on student('name');
4 select * from all_indexes where table_name='student';

4 分类

4.1  B树索引

1)说明(默认索引,保存讲过排序过的索引列和对应的rowid值):

  1.oracle中最常用的索引;B树索引就是一颗二叉树;叶子节点(双向链表)包含索引列和指向表中每个匹配行的ROWID值

  2.所有叶子节点具有相同的深度,因而不管查询条件怎样,查询速度基本相同

  3.能够适应精确查询、模糊查询和比较查询

2)分类:

   UNIQUE,NON-UNIQUE(默认),REVERSE KEY(数据列中的数据是反向存储的)

3)创建例子

craete index index_sno on student('sno');

4)适合使用场景:

  列基数(列不重复值的个数)大时适合使用B数索引

4.2 位图索引

1)说明:

  1.创建位图索引时,oracle会扫描整张表,并为索引列的每个取值建立一个位图(位图中,对表中每一行 使用一位(bit,0或者1)来标识该行是否包含该位图的索引列的取值,如果为1,表示对应的rowid所在的记录包含该位图索引列值),最后通过位图索 引中的映射函数完成位到行的ROWID的转换

2)创建例子

create bitmap index index_sno on student(sno);

3) 适合场景:

对于基数小的列适合简历位图索引(例如性别等)

4.3 单列索引和复合索引(基于多个列创建)

1) 注意:

  即如果索引建立在多个列上,只有它的第一个列被where子句引用时,优化器才会使用该索引,即至少要包含组合索引的第一列

4.4 函数索引

1)说明:

  1. 当经常要访问一些函数或者表达式时,可以将其存储在索引中,这样下次访问时,该值已经计算出来了,可以加快查询速度

  2. 函数索引既可以使用B数索引,也可以使用位图索引;当函数结果不确定时采用B树索引,结果是固定的某几个值时使用位图索引

  3. 函数索引中可以水泥用len、trim、substr、upper(每行返回独立结果),不能使用如sum、max、min、avg等

2)例子:

create index fbi  on student (upper(name));
select * from student where upper(name) ='WISH';

5 索引建立原则总结

  1. 如果有两个或者以上的索引,其中有一个唯一性索引,而其他是非唯一,这种情况下oracle将使用唯一性索引而完全忽略非唯一性索引

  2. 至少要包含组合索引的第一列(即如果索引建立在多个列上,只有它的第一个列被where子句引用时,优化器才会使用该索引)

  3. 小表不要建立索引

  4. 对于基数大的列适合建立B树索引,对于基数小的列适合简历位图索引

  5. 列中有很多空值,但经常查询该列上非空记录时应该建立索引

  6. 经常进行连接查询的列应该创建索引

  7. 使用create index时要将最常查询的列放在最前面

  8. LONG(可变长字符串数据,最长2G)和LONG RAW(可变长二进制数据,最长2G)列不能创建索引

  9.限制表中索引的数量(创建索引耗费时间,并且随数据量的增大而增大;索引会占用物理空间;当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度)

6 注意事项

  1. 通配符在搜索词首出现时,oracle不能使用索引,eg:

1 --我们在name上创建索引;
2 create index index_name on student('name');
3
4 --下面的方式oracle不适用name索引
5 select * from student where name like '%wish%';
6
7 --如果通配符出现在字符串的其他位置时,优化器能够利用索引;如下:
8 select * from student where name like 'wish%';

2. 不要在索引列上使用not,可以采用其他方式代替如下:(oracle碰到not会停止使用索引,而采用全表扫描)

select * from student where not (score=100);
select * from student where score <> 100;--替换为
select * from student where score>100 or score <100;

  3. 索引上使用空值比较将停止使用索引, eg:

select * from student where score is not null;

转载于:https://www.cnblogs.com/yscit/p/10031354.html

【Oracle学习笔记】索引相关推荐

  1. ORACLE学习笔记 索引和约束

    /*** 约束 ***/ * 如果某个约束只作用于单独的字段,即可以在字段级定义约束,也可以在表级定义约 束,但如果某个约束作用于多个字段,   必须在表级定义约束 * 在定义约束时可以通过CONST ...

  2. Oracle学习笔记---(一)

    Oracle学习笔记---(一) 一 1.Oracle简介     Oracle是以高级结构化查询语言(SQL)为基础的大型关系数据库:是一个对象关系数据库管理系统(ORDBMS).它提供了关系数据库 ...

  3. oracle update单引号,Oracle学习笔记:update的字段中包括单引号

    平时update的时候直接更改字段内的值,例如: update table_temp set name = 'Hider' where id = 100; 但更新后的值中包括单引号,则不能按以上方式进 ...

  4. oracle:oracle学习笔记(四)循环、光标、异常、瀑布模型

    oracle学习笔记:循环.光标.异常 文章目录 打印Hello World 定义基本变量 引用型变量(单行)` my_name emp.ename%type ` 记录型变量(多行) `emp_rec ...

  5. 在大量数据迁移期间oracle学习笔记

    在数据迁移期间oracle学习笔记 0主键(自增) 1用户代码 2区域代码 3承保公司代码 4理赔编码 5投保确认码 6案件状态 7案件进展 8重开案件进展 9转换后案件状态 需求分析: 1.根据上述 ...

  6. oracle 权限问题9017,[数据库]oracle学习笔记(一)用户管理_星空网

    oracle学习笔记(一)用户管理 2014-04-13 0 1 --oracle学习第一天 2 --连接 @后面连接数据库实例,具体连接到那个数据库 3 conn scott/tiger@MYORA ...

  7. 【Oracle】Oracle学习笔记

    [Oracle]Oracle学习笔记 目录 [Oracle]Oracle学习笔记 P1.Oracle数据库的安装和配置 P2.Oracle数据库管理 P3-0.初步SQL P3-1.基本SQL SEL ...

  8. oracle学习笔记 Oracle体系结构概述

    oracle学习笔记 Oracle体系结构概述 从这节开始,开始讲oracle数据库体系结构. 首先从总体上,从概述上把oracle整体的体系结构讲一下, 然后接下来的时间我们会一块一块的将oracl ...

  9. Oracle学习笔记 字符集概述

    Oracle 学习笔记 字符集概述 这节课开始讲oracle里面的字符集 偏重于原理和简单的一些判断以及实现 字符集它涉及到很多的东西 比如建库和操作系统环境 这节课把字符集的原理性的东西以及常见的操 ...

  10. oracle学习笔记 oracle软件安装准备工作 第一部分 环境准备

    oracle学习笔记   oracle软件安装准备工作  第一部分 环境准备 这节课对初学者来说内容较多,我把它分成了三篇. 即使这样也不可能把每个可能遇到的问题都说到,如果遇到没说到的问题自己上网搜 ...

最新文章

  1. 在室内停车场使用道路标记语义进行厘米级建图和定位
  2. 手把手教你发布自己的CocoaPods开源库
  3. 再理下系统分层架构模式
  4. PHPUnit测试框架学习(1)
  5. 如何跳出两层循环嵌套
  6. 开发板接传感器蜂鸣器不断_迅为IMX6ULL终结技开发板初体验
  7. Maven和Java多版本模块
  8. [家里蹲大学数学杂志]第387期一套实变函数期末试题参考解答
  9. 第4章 同余问题《信息学奥赛一本通 提高篇》
  10. springboot版本兼容
  11. mdf2iso linux,MDF to ISO下载
  12. springcloud以及四大神兽面试涉及知识总结(持续更新)
  13. js刻度尺插件_html5 canvas+js刻度尺代码
  14. 自学Python3脚本100例(1-10)
  15. 环形队列、 条带环形队列 Striped-RingBuffer (史上最全)
  16. iphone复制不能全选_iphone长按键盘进行复制、粘贴、全选操作技巧
  17. 读后感——只是为了好玩(Just for Fun)-Linux之父林纳斯自传
  18. git实践系列七:迁出和回退
  19. 使用Batik开发SVG应用程序(一)
  20. 快递100 实时查询

热门文章

  1. 重置单例对象Singleton Swift
  2. 对应node版本_Node.js 应用故障排查手册 —— Node.js 性能平台使用指南
  3. 146.LRU缓存机制
  4. pymysql executemany()函数
  5. 代码整洁之道读书笔记----第四章---注释--第二节-坏孩子与坏注释
  6. 《Thumbs up? Sentiment Classification using Machine Learning Techniques》笔记
  7. HanLP里使用DAT存取字典的方法
  8. LaTeX 修改中文摘要名字
  9. Linux微信群shell,linux shell基础
  10. Hvv近期0day总结五