oracle索引总结


Posted in Oracle onSeptember 25, 2021

一、简介

说明:

  1. 索引是数据库对象之一,用于加快数据的检索,类似于书籍的索引。在数据库中索引可以减少数据库程序查询结果时需要读取的数据量,类似于在书籍中我们利用索引可以不用翻阅整本书即可找到想要的信息。
  2. 索引是建立在表上的可选对象;索引的关键在于通过一组排序后的索引键来取代默认的全表扫描检索方式,从而提高检索效率
  3. 索引在逻辑上和物理上都与相关的表和数据无关,当创建或者删除一个索引时,不会影响基本的表;
  4. 索引一旦建立,在表上进行DML操作时(例如在执行插入、修改或者删除相关操作时),oracle会自动管理索引,索引删除,不会对表产生影响
  5. 索引对用户是透明的,无论表上是否有索引,sql语句的用法不变
  6. oracle创建主键时会自动在该列上创建索引

二、索引原理

  • 若没有索引,搜索某个记录时(例如查找name='wish')需要搜索所有的记录,因为不能保证只有一个wish,必须全部搜索一遍
  • 若在name上建立索引,oracle会对全表进行一次搜索,将每条记录的name值哪找升序排列,然后构建索引条目(namerowid),存储到索引段中,查询namewish时即可直接查找对应地方
  • 创建了索引并不一定就会使用,oracle自动统计表的信息后,决定是否使用索引,表中数据很少时使用全表扫描速度已经很快,没有必要使用索引

三、索引使用(创建、修改、删除、查看)

1.创建索引语法

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

2.修改索引

1)重命名索引

alter index index_sno rename to bitmap_index;

2) 合并索引

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

alter index index_sno coalesce;

3.重建索引

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

方式二:

alter index index_sno rebuild;

3.删除索引

drop index index_sno;

4.查看索引

select index_name,index-type, tablespace_name, uniqueness from all_indexes where table_name ='tablename';

 -- eg:    
create index index_sno on student('name');
select * from all_indexes where table_name='student';

四、索引分类

1. B树索引

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

1)说明:

  1. oracle中最常用的索引;B树索引就是一颗二叉树;叶子节点(双向链表)包含索引列和指向表中每个匹配行的ROWID
  2. 所有叶子节点具有相同的深度,因而不管查询条件怎样,查询速度基本相同
  3. 能够适应精确查询、模糊查询和比较查询

2)分类:

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

3)创建例子

craete index index_sno on student('sno');

4)适合使用场景:

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

2. 位图索引

1)说明:

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

2)创建例子

create bitmap index index_sno on student(sno);

3) 适合场景:

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

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

1) 注意:

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

4. 函数索引

1)说明:

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

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

  3. 函数索引中可以水泥用lentrimsubstrupper(每行返回独立结果),不能使用如summaxminavg

 2)例子:

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

五、索引建立原则总结

  1. 如果有两个或者以上的索引,其中有一个唯一性索引,而其他是非唯一,这种情况下oracle将使用唯一性索引而完全忽略非唯一性索引
  2. 至少要包含组合索引的第一列(即如果索引建立在多个列上,只有它的第一个列被where子句引用时,优化器才会使用该索引)
  3. 小表不要简历索引
  4. 对于基数大的列适合建立B树索引,对于基数小的列适合简历位图索引
  5. 列中有很多空值,但经常查询该列上非空记录时应该建立索引
  6.  经常进行连接查询的列应该创建索引
  7. 使用create index时要将最常查询的列放在最前面
  8. LONG(可变长字符串数据,最长2G)和LONG RAW(可变长二进制数据,最长2G)列不能创建索引
  9. 限制表中索引的数量(创建索引耗费时间,并且随数据量的增大而增大;索引会占用物理空间;当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度)

注意事项:

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

--我们在name上创建索引;

create index index_name on student('name');

--下面的方式oracle不适用name索引

select * from student where name like '%wish%';

--如果通配符出现在字符串的其他位置时,优化器能够利用索引;如下:

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;

到此这篇关于oracle索引总结的文章就介绍到这了,更多相关oracle索引内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Oracle 相关文章推荐
Oracle 区块链表创建过程详解
May 15 Oracle
使用Navicat Premium工具将oracle数据库迁移到MySQL
May 27 Oracle
ORACLE数据库应用开发的三十个注意事项
Jun 07 Oracle
详解Oracle数据库中自带的所有表结构(sql代码)
Nov 20 Oracle
详细聊聊Oracle表碎片对性能有多大的影响
Mar 19 Oracle
Oracle 多表查询基本语法实例
Apr 18 Oracle
Oracle使用别名的好处
Apr 19 Oracle
分析SQL窗口函数之排名窗口函数
Apr 21 Oracle
分析SQL窗口函数之取值窗口函数
Apr 21 Oracle
解决Oracle数据库用户密码过期
May 11 Oracle
Oracle删除归档日志及添加定时任务
Jun 28 Oracle
Oracle 死锁的检测查询及处理
Sep 25 #Oracle
RPM包方式安装Oracle21c的方法详解
oracle连接ODBC sqlserver数据源的详细步骤
Oracle以逗号分隔的字符串拆分为多行数据实例详解
快速学习Oracle触发器和游标
使用Oracle跟踪文件的问题详解
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
You might like
PHP中SESSION的注销与清除
2015/04/16 PHP
数组任意位置插入元素,删除特定元素的实例
2017/03/02 PHP
laravel框架添加数据,显示数据,返回成功值的方法
2019/10/11 PHP
JavaScript中使用构造函数实现继承的代码
2010/08/12 Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
2013/11/04 Javascript
Underscore源码分析
2015/12/30 Javascript
JavaScript实现输入框(密码框)出现提示语
2016/01/12 Javascript
全面解析Bootstrap中scrollspy(滚动监听)的使用方法
2016/06/06 Javascript
基于jQuery实现表格内容的筛选功能
2016/08/21 Javascript
在vue项目中使用sass的配置方法
2018/03/20 Javascript
vue组件实现进度条效果
2018/06/06 Javascript
React-router4路由监听的实现
2018/08/07 Javascript
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
微信小程序实现pdf、word等格式文件上传的方法
2019/09/10 Javascript
JS实现电商商品展示放大镜特效
2020/01/07 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
Python贪吃蛇游戏编写代码
2020/10/26 Python
python3 模拟登录v2ex实例讲解
2017/07/13 Python
Python实现JSON反序列化类对象的示例
2018/01/31 Python
python使用wxpy实现微信消息防撤回脚本
2019/04/29 Python
Python企业编码生成系统总体系统设计概述
2019/07/26 Python
利用python实现汉字转拼音的2种方法
2019/08/12 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
2020/05/15 Python
Python常用数据分析模块原理解析
2020/07/20 Python
Python使用socket模块实现简单tcp通信
2020/08/18 Python
如何让PyQt5中QWebEngineView与JavaScript交互
2020/10/21 Python
The Kooples美国官方网站:为情侣提供的法国当代时尚品牌
2019/01/03 全球购物
遗体告别仪式主持词
2014/03/20 职场文书
基层党员群众路线整改措施及努力方向
2014/10/28 职场文书
2015年前台个人工作总结
2015/04/03 职场文书
辞职信格式范文
2015/05/13 职场文书
学困生帮扶工作总结
2015/08/13 职场文书
golang正则之命名分组方式
2021/04/25 Golang
SpringCloud Function SpEL注入漏洞分析及环境搭建
2022/04/08 Java/Android
大脑的记忆过程在做数据压缩,不同图形也有共同的记忆格式
2022/04/29 数码科技
python实现双链表
2022/05/25 Python