Oracle索引以及索引碎片
索引,可以增加查询速度,若没有索引,每次查询都必须是全表查询。例如,搜索某个记录时(如name="gdpuzxs")时,需要全表扫描一下,因为不知道有多少个name="gdpuzxs"的记录。若在字段name上建立了索引,oracle会构建索引条目(name:rowid),每次查询,可以快速定位到这行记录。
(1)位图索引
oracle的索引主要有B树索引以及位图索引。这里主要总结一下B树索引,主要有根节点,分支节点,叶子节点,结构图如下:

每个索引条目都是按照升序排序的(也可以指定为降序),都有两个字段(键值对),对于根节点和分支节点,第一个字段是下属节点的最小键值,第二个字段是下属节点的地址。如根节点,(0,B1;500,B2;1000,B3)代表下属有三个节点,第一个节点的索引最小值为0,地址是B1;第二节点的索引最小值为500,地址是B2,依次类推。
对于叶节点,同样有两个字段(键值对),第一个字段也是下属节点索引的最小值,第二字段是指向数据的rowid。比如你要查找值为150的数据,首先从根节点,进行对比,0<150<500,进入B1,0<150<200,进入L1,查找到值为150相对的rowid。
(2)索引碎片
频繁的对索引字段进行update,delete操作,会对索引造成大量的索引碎片,从而影响索引的使用效率。
对某个索引行执行删除操作时,只是为该行增加了一个删除标志,这个索引行不会真正的释放内存空间。当insert新的数据的时候,也不能插入到该位置。
所以,无论是插入,删除,更新索引数据,都需要消耗储存空间,增大B-TREE索引结构的深度,影响数据的查询速度。尤其是删除和修改,不仅造成空间的浪费,也增加了扫描索引块的速度。所以,建议对经常使用的索引表进行索引重建操作。
(3)案例分析
(1)新建一个testIndex表并且建立索引,如下:
create table testIndex(Id int) create index index_1 on testIndex(id)
(2)插入100万条数据,如下:
SQL> begin
2 for i in 1..1000000 loop
3 insert into testIndex values(i);
4 if mod(i,100)=0 then
5 commit;
6 end if;
7 end loop;
8 end;
9 /
(3)索引碎片分析
先删除70万条数据,如下:
delete from testindex where rownum<=700000
创建索引分析,查询结果如下:
analyze index index_1 validate structure select name,del_lf_rows_len,lf_rows_len,(del_lf_rows_len/lf_rows_len)*100 as "索引碎片率" from index_stats;

如果索引碎片率超过30%,建议对索引进行索引碎片整理。
(4)索引碎片整理
alter index index_1 rebuild
再次执行索引碎片分析:索引碎片为0。
analyze index index_1 validate structure select name,del_lf_rows_len,lf_rows_len,(del_lf_rows_len/lf_rows_len)*100 as "索引碎片率" from index_stats;
参考网址:http://blog.itpub.net/41451/viewspace-1058441/
http://www.cnblogs.com/zhaoguan_wang/p/5169821.html
Oracle索引以及索引碎片的更多相关文章
- 41.oracle索引,分析索引,索引碎片整理
概述 索引分为B树索引和位图索引.我们主要研究B树索引,B树索引如下图(图片源自网络):
- ORACLE学习笔记 索引和约束
/*** 约束 ***/ * 如果某个约束只作用于单独的字段,即可以在字段级定义约束,也可以在表级定义约 束,但如果某个约束作用于多个字段, 必须在表级定义约束* 在定义约束时可以通过CONSTRA ...
- oracle索引,索引的建立、修改、删除
索引,索引的建立.修改.删除 2007-10-05 13:29 来源: 作者: 网友评论 0 条 浏览次数 2986 索引索引是关系数据库中用于存放每一条记录的一种对象,主要目的是加快数据的读取速度和 ...
- oracle 性能优化--索引总结
索引是建立在表的一列或多个列上的辅助对象,目的是加快訪问表中的数据: Oracle存储索引的数据结构是B*树.位图索引也是如此,仅仅只是是叶子节点不同B*数索引: 索引由根节点.分支节点和叶子节点组成 ...
- Oracle中B-TREE索引的深入理解(转载)
索引概述 索引与表一样,也属于段(segment)的一种.里面存放了用户的数据,跟表一样需要占用磁盘空间.只不过,在索引里的数据存放形式与表里的数据存放形式非常的不一样.在理解索引时,可以想象一本书, ...
- oracle之bitmap索引
oracle常见的索引是BTree索引和Bitmap索引. BTree索引特点: 默认索引 适合大量增删改查 不能用or操作符 适合高基数的列(即唯一值多) 创建sql:create index li ...
- 简单了解,使用oracle中的索引,表分区
索引的分类 如下: 物理分类 逻辑分类 分区或非分区索引 单列或组合索引 B树索引(标准索引) 唯一或非唯一索引 正常或反向键索引 基于函数索引 位图索引 B树索引 b树索引通常也称为标准索引,索 ...
- oracle如何进行索引监控分析和优化
在生产环境.我们会发现: ① 索引表空间 I/O 非常高 ② "db file sequential read" 等待事件也比较高 这种迹象表明.整个数据库系统.索引的 ...
- Oracle中的索引
1.Oracle 索引简介 在Oracle数据库中,存储的每一行数据都有一个rowID来标识.当Oracle中存储着大量的数据时,意味着有大量的rowID,此时想要快速定位指定的rowID, ...
随机推荐
- delphi =------报错
关于delphi软件运行出现Invalid floating point operation的错误的解决办法 关于delphi软件运行出现Invalid floating point operatio ...
- git --fast-version-control
--distributed-is-the-new-centralized 读二进制文件 python 读doc xls 几乎所有的版本控制系统都以某种形式支持分支.使用分支意味着你可以把你的工作从 ...
- DOM 综合练习(一)
// 练习一: 完成一个好友列表的展开闭合效果 <html> <head> <style type="text/css"> // 对表格中的 u ...
- mybatis12一级缓存
验证一级缓存的存在 对应的实体类 /** *学生对应的实体类 */ public class Student { private Integer sId; private String sName; ...
- NPOI 操作office、word、excel
下载地址为:http://npoi.codeplex.com/releases/view/616131 可以操作excel表,行,单元格内家及样式等. 使用示例: usin ...
- 关于CSDN 2016博客之星评选活动的感触
一.前言 想想去年的这个时候还接到CSDN邀请,参加了"CSDN 2015博客之星"的评选活动, CSDN2015博客之星评选之拉票环节 而今年却没有接到CSDN的邀请,内心有点小 ...
- CNN结构
神经网络 卷积神经网络依旧是层级网络,只是层的功能和形式做了变化,可以说是传统神经网络的一个改进.多了许多传统神经网络没有的层次. 卷积神经网络的层级结构 数据输入层/Input Layer 卷积计算 ...
- 什么是EJB
学习EJB可以加深对J2EE平台的认识. 百科定义EJB: 被称为java企业bean,服务器端组件,核心应用是部署分布式应用程序.用它部署的系统不限定平台.实际上ejb是一种产品,描述了应用组件要解 ...
- html5.js让IE(包含IE6)支持HTML5元素方法
原文地址:http://blog.sina.com.cn/s/blog_62a36ec401018oqb.html html5.js让IE(包含IE6)支持HTML5元素方法 微软的最新浏览器IE8及 ...
- 模板继承(extend)——(Day68)
模板继承 (extend) Django模版引擎中最强大也是最复杂的部分就是模版继承了.模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 block ...