定期重建索引?maybe

来源:互联网 发布:java中main函数的参数 编辑:程序博客网 时间:2024/06/05 03:11
是否需要定期重建索引,是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



在大多数情况下,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)位图索引的重建
0 0
原创粉丝点击