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 DGMGRL ORA-16603报错的解决方法(DG Broker)
Apr 06 Oracle
Oracle 数据仓库ETL技术之多表插入语句的示例详解
Apr 12 Oracle
Oracle11g r2 卸载干净重装的详细教程(亲测有效已重装过)
Jun 04 Oracle
Oracle11g R2 安装教程完整版
Jun 04 Oracle
ORACLE查看当前账号的相关信息
Jun 18 Oracle
使用Oracle跟踪文件的问题详解
Jun 28 Oracle
Oracle 死锁的检测查询及处理
Sep 25 Oracle
oracle删除超过N天数据脚本的方法
Feb 28 Oracle
排查并解决Oracle sysaux表空间异常增长
Apr 20 Oracle
解决Oracle数据库用户密码过期
May 11 Oracle
Oracle锁表解决方法的详细记录
Jun 05 Oracle
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
Jun 28 Oracle
Oracle 死锁的检测查询及处理
Sep 25 #Oracle
RPM包方式安装Oracle21c的方法详解
oracle连接ODBC sqlserver数据源的详细步骤
Oracle以逗号分隔的字符串拆分为多行数据实例详解
快速学习Oracle触发器和游标
使用Oracle跟踪文件的问题详解
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
You might like
ecshop 订单确认中显示省市地址信息的方法
2010/03/15 PHP
比较完整的微信开发php代码
2016/08/02 PHP
javascript支持firefox,ie7页面布局拖拽效果代码
2007/12/20 Javascript
Ext.MessageBox工具类简介
2009/12/10 Javascript
关于页面嵌入swf覆盖div层的问题的解决方法
2014/02/11 Javascript
jQuery基于当前元素进行下一步的遍历
2014/05/20 Javascript
JS在IE下缺少标识符的错误
2014/07/23 Javascript
jQuery制作简洁的图片轮播效果
2015/04/03 Javascript
jquery实现多条件筛选特效代码分享
2015/08/28 Javascript
domReady的实现案例
2016/11/23 Javascript
微信小程序实现的一键拨号功能示例
2019/04/24 Javascript
bootstrap中的导航条实例代码详解
2019/05/20 Javascript
javaScript中indexOf用法技巧
2019/11/26 Javascript
javascript数组元素删除方法delete和splice解析
2019/12/09 Javascript
用实例说明python的*args和**kwargs用法
2013/11/01 Python
Python version 2.7 required, which was not found in the registry
2014/08/26 Python
对Python新手编程过程中如何规避一些常见问题的建议
2015/04/01 Python
Python开发如何在ubuntu 15.10 上配置vim
2016/01/25 Python
解决Python pandas df 写入excel 出现的问题
2018/07/04 Python
Python动态语言与鸭子类型详解
2019/07/01 Python
Django 大文件下载实现过程解析
2019/08/01 Python
Python中使用threading.Event协调线程的运行详解
2020/05/02 Python
pycharm-professional-2020.1下载与激活的教程
2020/09/21 Python
CSS3圆角边框和边界图片效果实例
2016/07/01 HTML / CSS
HTML5 3D书本翻页动画的实现示例
2019/08/28 HTML / CSS
戴尔美国官网:Dell
2016/08/31 全球购物
Joules官网:女士、男士和儿童服装和鞋类
2018/10/23 全球购物
书法培训心得体会
2014/01/05 职场文书
个人廉洁自律承诺书
2014/03/27 职场文书
领导班子自我剖析材料
2014/08/16 职场文书
秋季运动会广播稿(30篇)
2014/09/13 职场文书
成都人事代理协议书
2014/10/25 职场文书
班主任开场白
2015/06/01 职场文书
少年犯观后感
2015/06/11 职场文书
大学宣传委员竞选稿
2015/11/19 职场文书
中国古风插画师排行榜:夏达第一,第三是阴阳师姑获鸟皮肤创作者
2022/03/18 国漫