关于定期重建索引

是否需要定期重建索引,是dba们一直争论的话题,从未停止过.

总结下各方意见

---5.1 支持重建索引的理由

1)oracle的B树索引随着时间的推移变得很不平衡

很多dba认为如果对oracle的B树索引进行大量的DMl操作,尤其是delete或update,索引会变得不平衡;

其实这个不是最终的事实,因为根块和所有的叶块之间的高度始终是一致的.

2)索引中被删除的空间无法重用:下面案例可以说明这个观点不正确的

create table t1
(
sid int not null ,
sname varchar2(10)
)
tablespace test;  

--循环导入数据
declare
        maxrecords constant int:=100000;
        i int :=1;
    begin
        for i in 1..maxrecords loop
          insert into t1 values(i,'ocpyang');
        end loop;
    dbms_output.put_line(' 成功录入数据! ');
    commit;
    end;
/  

create index index01 on t1(sid)
tablespace test;  

delete from t1 where sid<90000;  

commit;  

analyze index index01 validate structure;  

select lf_rows,del_lf_rows,del_lf_rows/lf_rows*100 from index_stats where name='INDEX01';  

  LF_ROWS DEL_LF_ROWS DEL_LF_ROWS/LF_ROWS*100
--------- ----------- -----------------------
   100000       89999                  89.999  

declare
        maxrecords constant int:=89999;
        i int :=1;
    begin
        for i in 1..maxrecords loop
          insert into t1 values(i,'ocpyang');
        end loop;
    dbms_output.put_line(' 成功录入数据! ');
    commit;
    end;
/  

analyze index index01 validate structure;  

select lf_rows,del_lf_rows,del_lf_rows/lf_rows*100 from index_stats where name='INDEX01';  

  LF_ROWS DEL_LF_ROWS DEL_LF_ROWS/LF_ROWS*100
--------- ----------- -----------------------
   100000           0                       0

本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

在大多数情况下,oracle数据库会利用删除的行腾出的空间插入新行,空间最终不一定无法使用.

3)达到一定层数的索引时效率低下的  

这个观点很流行,但是没有足够的证据佐证这个观点的正确性。oracle的B树索引自动平衡,而且

索引性能的好坏和层数没有绝对的关系.

4)很糟糕的聚簇因子

很多dba认为聚簇因子不好,这样的索引需要重建!这个其实是概念混淆,聚簇因子需要改变表的

数据排序才会改变;重建索引不会改变表的数据排序。

一个表中有多个索引,如果重建其中一个索引改变了聚簇因子,但是由于表只能按照一种顺序重建,

或许会影响到其它相关的索引.

----5.2 反对重建的理由

1)analyze index ... validate structure  命令执行过程中会锁定表

2)生产大量的redo日志  

这个可以通过nologging避免

----5.3 是否应该重建索引呢?

是否应该重建索引呢?争论很多,不能一刀切!应该根据各自的情况.

如果你数据库中的大部分查询通过索引访问来读取单个行或有索引的尽可能少的行,这个时候重建索引意义不大;

如果你的数据库执行了大量的update、delete操作,产生了大量的索引碎片,每次查询读取了大量的索引行的同时索引

被频繁访问;那么重建索引的帮助还是很大的.

我们需要重建索引的常见情况如:

1)索引存放的硬盘损坏

2)表的其它维护操作,索引标记为unusable

3)迁移索引到其它表空间

4)大批量加载数据时,为了提高性能,禁用索引,加载完数据后

5)位图索引的重建

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索oracle
, delete
, 数据
, 索引
, create
定期
mysql 定期重建索引、定期重建索引、oracle 重建索引、重建索引、sql重建索引,以便于您获取更多的相关知识。

时间: 2025-01-01 22:25:02

关于定期重建索引的相关文章

ORACLE关于索引是否需要定期重建争论的整理

     ORACLE数据库中的索引到底要不要定期重建呢? 如果不需要定期重建,那么理由是什么? 如果需要定期重建,那么理由又是什么?另外,如果需要定期重建,那么满足那些条件的索引才需要重建呢?关于这个问题,网上也有很多争论,也一直让我有点困惑,因为总有点不得庐山真面目的感觉,直到上周看到了一些资料,遂整理于此,方便以后翻阅:   首先来看看网上关于索引需要重建的准则或标准:    一:分析(analyze)指定索引之后,查询index_stats的height字段的值,如果这个值>=4 ,最好

Oracle 重建索引的必要性

      索引重建是一个争论不休被不断热烈讨论的议题.当然Oracle官方也有自己的观点,我们很多DBA也是遵循这一准则来重建索引,那就是Oracle建议对于索引深度超过4级以及已删除的索引条目至少占有现有索引条目总数的20% 这2种情形下需要重建索引.近来Oracle也提出了一些与之相反的观点,就是强烈建议不要定期重建索引.本文是参考了1525787.1并进行相应描述.   1.重建索引的理由    a.Oracle的B树索引随着时间的推移变得不平衡(误解)    b.索引碎片在不断增加  

Oracle 重建索引脚本

      索引是提高数据库查询性能的有力武器.没有索引,就好比图书馆没有图书标签一样,找一本书自己想要的书比登天还难.然而索引在使用的过程中,尤其是在批量的DML的情形下会产生相应的碎片,以及B树高度会发生相应变化,因此可以对这些变化较大的索引进行重构以提高性能.N久以前Oracle建议我们定期重建那些高度为4,已删除的索引条目至少占有现有索引条目总数的20%的这些表上的索引.但Oracle现在强烈建议不要定期重建索引.具体可以参考文章:Oracle 重建索引的必要性.尽管如此重建索引还是有必

Oracle关于重建索引争论的总结_oracle

索引重建是一个争论不休被不断热烈讨论的议题.当然Oracle官方也有自己的观点,我们很多DBA也是遵循这一准则来重建索引,那就是Oracle建议对于索引深度超过4级以及已删除的索引条目至少占有现有索引条目总数的20% 这2种情形下需要重建索引.近来Oracle也提出了一些与之相反的观点,就是强烈建议不要定期重建索引.本文是参考了1525787.1并进行相应描述. 1.重建索引的理由     a.Oracle的B树索引随着时间的推移变得不平衡(误解)     b.索引碎片在不断增加     c.索

Oracle重建索引Shell脚本、SQL脚本分享_oracle

索引是提高数据库查询性能的有力武器.没有索引,就好比图书馆没有图书标签一样,找一本书自己想要的书比登天还难.然而索引在使用的过程中,尤其是在批量的DML的情形下会产生相应的碎片,以及B树高度会发生相应变化,因此可以对这些变化较大的索引进行重构以提高性能.N久以前Oracle建议我们定期重建那些高度为4,已删除的索引条目至少占有现有索引条目总数的20%的这些表上的索引.但Oracle现在强烈建议不要定期重建索引.具体可以参考文章:Oracle 重建索引的必要性.尽管如此重建索引还是有必要的,只是不

SQL Server通过整理索引碎片和重建索引提高速度

本文章转载:http://database.51cto.com/art/201108/282408.htm SQL Server数据库中,当索引碎片太多时,就会拖慢数据库查询的速度.这时我们可以通过整理索引碎片和重建索引来解决,本文我们主要就介绍了这部分内容,希望能够对您有所帮助.     SQL Server数据库操作中,当数据库中的记录比较多的时候,我们可以通过索引来实现查询.但是当索引碎片太多的时候,就会很严重地影响到查询的速度.这时候我们可以采取两种方法来解决:一种时整理索引碎片,另一种

SQL Server 2000数据库中如何重建索引

在数据库中创建索引时,查询所使用的索引信息存储在索引页中.连续索引页由从一个页到下一个页的指针链接在一起.当对数据的更改影响到索引时,索引中的信息可能会在数据库中分散开来.重建索引可以重新组织索引数据(对于聚集索引还包括表数据)的存储,清除碎片.这可通过减少获得请求数据所需的页读取数来提高磁盘性能. 在 Microsoft SQL Server 2000 中,如果要用一个步骤重新创建索引,而不想删除旧索引并重新创建同一索引,则使用 CREATE INDEX 语句的 DROP_EXISTING 子

在什么样的条件下需要重建索引

问:在什么样的条件下需要重建索引? 答:重建索引需要如下两个条件. 一:分析(analyze)指定索引之后,查询index_stats的height字段的值,如果这个值>=4 ,最好重建(rebuild)这个索引.虽然这个规则不是总是正确,但如果这个值一直都是不变的,则这个索引也就不需重建. 二:在分析(analyze)指定索引之后,查询index_stats的del_lf_rows和lf_rows的值,如果(del_lf_rows/lf_rows)*100 > = 20,则这个索引也需要重建

在Oracle数据库中按用户名重建索引的方法

如果你管理的Oracle数据库下某些应用项目有大量的修改删除操作, 数据索引是需要周期性的重建的. 它不仅可以提高查询性能, 还能增加索引表空间空闲空间大小. 在ORACLE里大量删除记录后, 表和索引里占用的数据块空间并没有释放. 重建索引可以释放已删除记录索引占用的数据块空间. 转移数据, 重命名的方法可以重新组织表里的数据. 下面是可以按ORACLE用户名生成重建索引的SQL脚本: SET ECHO OFF; SET FEEDBACK OFF; SET VERIFY OFF; SET PA