B+树索引对于删除的管理
当删除表里的一条记录时,其对应于索引里的索引条目并不会被物理的删除,只是做了一个删除标记。当
一个新的索引条目进入一个索引叶子节点的时候,oracle会检查该叶子节点里是否存在被标记为删除的索引
条目,如果存在,则会将所有具有删除标记的索引条目从该叶子节点里物理的删除。当一个新的索引条目进
入索引时,oracle会将当前所有被清空的叶子节点(该叶子节点中所有的索引条目都被设置为删除标记)收
回,从而再次成为可用索引块。
尽管被删除的索引条目所占用的空间大部分情况下都能够被重用,但仍然存在一些情况可能导致索引空间
被浪费,并造成索引数据块很多但是索引条目很少的后果,这时该索引可以认为出现碎片。而导致索引出现
碎片的情况主要包括:
1)不合理的、较高的PCTFREE。很明显,这将导致索引块的可用空间减少。
2)经常被删除或更新的键值,以后几乎不再会被插入时。前面我们知道,某个索引块中删除了部分的索
引条目,只有当有键值进入该索引块时才能将空间收回。如果一个键值被删除或更新(更新是先删除旧值在
插入新值)后,该键值所在的数据块不在有新值插入
进来,就会导致碎片。
如何判断索引出现碎片
直接运行ANALYZE INDEX … VALIDATE STRUCTURE命令,然后检查index_stats视图的pct_used字段,如果该字段过低(该值没有标
准,参考值为50%),则说明存在碎片。
碎片的影响
碎片对条件值为等于的情况(包括In,or等)几乎没有影响,但对利用索引列的范围扫描(索引范围扫
描)有一定的影响,因为需要访问一些被标记为删除的无用的数据。
去除碎片
从上面的描述也可以知道,更新和删除操作确实会导致索引块周围的可用空间形成碎片,但是一般来说
这些碎片都会被正确的重用。所以一般来说不需要重建索引。定时重建索引更不可取。但是当确实出现了很
多碎片时该怎么去除碎片呢?这里有两种方法
合并索引:合并索引不改变索引的物理组织结构,只是简单地将B树叶子节点中的存储碎片合并在一起。
重建索引:重新创建一个新的索引,删除原来的索引。
合并索引并没有大幅地更改索引的物理结构,只是简单地将B树中的叶子节点中的碎片合在一起,因而并不会对叶子节点的存储参数和表空间进行更改,合并执行前与合并执行后的B树节点如图所示。
由图中可以看到,合并前放在两个节点中的碎片被合并到了1个节点,而另一个叶子节点就被释放了,这
个释放后的叶子节点就可以被再次利用,使得检索的次数变少,提高了查询的效率。
语法:ALTER INDEX idx_ename_empno COALESCE;
重建索引实际上就是对原有的索引的删除,再重新建一个新的索引。因为是对现有的索引进行删除和重
新创建,因此在使用ALTER INDEX时,可以使用各种存储参数来重新设定索引,比如使用STORAGE指
定存储参数,使用TABLE SPACE指定表空间或者是利用NOLOGGING选项避免产生重做日志信息。
语法:ALTER INDEX 索引名称 REBUILD
另外要注意的是,在线重建索引是高风险的操作。在线重建索引是基于日志表。当开始在线重建索引
时,系统会创建一个临时日志表,用于存放索引重建期间产生的日志信息。同时这个索引的FLAG字段上
会被设置REBUILD标识。当索引信息更变时,会把更变信息写入日志表。当在线重建失败时,这个日志
表和数据字典中的状态位都需要靠SMON来清理。要清理这个日志表,需要先锁定这张表。如果业务繁
忙,该表的数据一直在变化,SMON就无法对其进行锁定,因此就不能及时清理。如果该表更变十分平
凡,或许这项清理工作会在几天甚至几星期后才能完成。
所以建议在在线重建索引时,必须注意:
1.所有操作写成脚本在后台以nohup运行
2.对于高可用性系统,不要在无人值守的情况下进行此操作。
3.准备应急预案,一旦出现问题,马上采取措施。
重建索引和合并索引都可以消除索引碎片,但两者在使用上有明显的区别:
合并索引不能将索引移动到其他表空间,但重建索引可以。
合并索引代价较低,无须额外存储空间,但重建索引恰恰相反。
合并索引只能在B树的同一子树中合并,不改变树的高度;但重建索引重建整个B树,可能会降低树的高度。
总结:1.对于索引来说, 如果它没坏,就不要去重建它。
2.不要定期重建索引,可以定期检查索引,在判断索引确实出现问题后再去重建。
3.在可以定期的合并索引。
相关推荐
### 提高SQL Server性能:通过DBCC DBREINDEX重建索引 #### 一、引言 在数据库管理系统中,SQL Server作为一款广泛使用的数据库产品,其性能优化是确保应用程序高效运行的关键因素之一。其中,索引是提升查询速度的...
这时,重建索引就成为了一个必要的优化手段。 重建索引的主要目的是为了重新组织索引数据,特别是对于聚集索引,还包括实际的表数据。当数据在索引页中分布不均匀时,会导致磁盘I/O性能下降,因为获取请求数据可能...
### 浅谈Oracle中重建索引 #### 一、索引的基本概念与作用 在数据库管理系统(DBMS)中,索引是一种特殊的数据结构,它能够加速数据检索的速度。Oracle数据库同样提供了强大的索引功能来优化查询性能。索引通过在...
用于SqlServer的索引重建,全语句实现,可根据实际情况进行部分关键表的索引重建。
重建索引,整理索引碎片,优化sql执行速度
重建索引脚本.sql 可以帮助用户
数据库检测修复重建索引
根据提供的文件信息,本文将详细解析SQL Server 2000中重建索引与收缩数据库的相关知识点。 ### 一、重建索引 #### 1. 什么是索引 在SQL Server 2000中,索引是提高数据检索速度的重要工具。它可以看作是一种特殊...
一、重建索引的前提条件 当表上的数据频繁进行`UPDATE`和`DELETE`操作,或者执行了`ALTER TABLE ... MOVE`操作导致ROWID改变时,可能需要考虑重建索引。这些操作可能导致索引倾斜,空间浪费,影响查询效率。 二、...
### 如何重建索引 #### 一、何时需要考虑重建索引 索引是数据库管理系统为了提高查询效率而建立的数据结构。随着数据的增删改查操作,索引可能会变得不那么高效,甚至可能导致性能下降。因此,在某些情况下,考虑...
本话题将围绕如何针对CLOB类型字段重建索引以及修复用户表空间索引空间的存储过程进行探讨。 首先,重建CLOB类型字段的索引可能是因为索引碎片过多、性能下降或为了更新索引结构以适应新的数据。重建索引通常涉及...
达梦数据库
### 重建索引示例与知识点解析 #### 标题:重建索引例子 DBCC dbreindex dbcc showcontig #### 描述:本示例通过使用`dbcc showcontig`来展示索引碎片化情况,并利用`dbcc dbreindex`命令对指定表的索引进行重组。...
"SQL重建索引.rar"这个压缩包文件可能包含了一个文本文件,旨在指导用户如何有效地批量重建数据库中的所有索引,以恢复其最佳性能。 首先,我们要理解为什么需要重建索引。在SQL Server 2008中,当数据频繁插入、...
重新修复数据库索引, PRINT '重建表' + @TableName +'的索引........Start!'
导致索引失效: 1、表上频繁发生update,delete操作; 2、表上发生了alter table ..move操作(move操作导致了rowid变化)。
由于重建索引是一项资源密集型操作,所以最好在系统负载较低的时间执行,如凌晨3点。执行次数也不宜过于频繁,可以根据实际需求设置每月执行一到两次。 在选择维护任务阶段,确保包含了“检查数据库完整性”、...
因此,重建索引是恢复索引性能的一种方式,它创建了新的索引页,并将索引数据重新排序和整理。 标题“重建所有索引”指出了一个数据库维护操作,即通过脚本或其他方式重建数据库中所有表的索引。描述中提到,随着...
《SQL Server索引重建手册》详细介绍了如何查看和分析索引碎片,如何选择在线重建索引的方式,以及如何观察索引重建的进度。手册强调了操作前必须进行全库备份的重要性,并指出在线重建索引时应遵循的顺序和原则。...
在SQL Server 2008 R2中,重建索引是一项重要的维护任务,它有助于优化数据库性能,尤其是当数据经过频繁的插入、删除和更新操作后,可能导致索引碎片增加。索引碎片有两种类型:逻辑碎片(页顺序不连续)和物理碎片...