如果你管理的oracle数据库下某些应用项目有大量的修改删除操作, 数据索引是需要周期性的重建的.它不仅可以提高查询性能, 还能增加索引表空间空闲空间大小. 在oracle里大量删除记录后, 表和索引里占用的数据块空间并没有释放. 重建索引可以释放已删除记录索引占用的数据块空间. 转移数据, 重命名的方法可以重新组织表里的数据.
下面是可以按oracle用户名生成重建索引的sql脚本:
set echo off;
set feedback off;
set verify off;
set pagesize 0;
set termout on;
set heading off;
accept username char prompt 'enter the index username: ';
spool /oracle/rebuild_&username.sql;
select
'rem +-----------------------------------------------+' chr(10)
'rem index name : ' owner '.' segment_name
lpad('', 33 - (length(owner) + length(segment_name)) )
chr(10)
'rem bytes : ' bytes
lpad ('', 34-(length(bytes)) ) chr(10)
'rem extents : ' extents
lpad ('', 34-(length(extents)) ) chr(10)
'rem +-----------------------------------------------+' chr(10)
'alter index ' owner '.' segment_name chr(10)
'rebuild ' chr(10)
'tablespace ' tablespace_name chr(10)
'storage ( ' chr(10)
' initial ' initial_extent chr(10)
' next ' next_extent chr(10)
' minextents ' min_extents chr(10)
' maxextents ' max_extents chr(10)
' pctincrease ' pct_increase chr(10)
');' chr(10) chr(10)
from dba_segments
where segment_type = 'index'
and owner='&username'
order by owner, bytes desc;
spool off;
如果你用的是windows系统, 想改变输出文件的存放目录, 修改spool后面的路径成:
spool c:\oracle\rebuild_&username.sql;
如果你只想对大于max_bytes的索引重建索引, 可以修改上面的sql语句: 在and owner='&username' 后面加个限制条件 and bytes> &max_bytes
如果你想修改索引的存储参数, 在重建索引rebuild_&username.sql里改也可以.
比如把pctincrease不等于零的值改成是零.
生成的rebuild_&username.sql文件我们需要来分析一下, 它们是否到了需要重建的程度:
分析索引,看是否碎片严重
sql>analyze index &index_name validate structure;
col name heading 'index name' format a30
col del_lf_rows heading 'deletedleaf rows' format 99999999
col lf_rows_used heading 'usedleaf rows' format 99999999
col ratio heading '% deletedleaf rows' format 999.99999
select name,
del_lf_rows,
lf_rows - del_lf_rows lf_rows_used,
to_char(del_lf_rows / (lf_rows)*100,'999.99999') ratio
from index_stats where name = upper('&index_name');
当删除的比率大于15 - 20% 时,肯定是需要索引重建的. 经过删改后的rebuild_&username.sql文件我们可以放到oracle的定时作业里: 比如一个月或者两个月在非繁忙时间运行.
如果遇到ora-00054错误, 表示索引在的表上有锁信息, 不能重建索引. 那就忽略这个错误, 看下次是否成功. 对那些特别忙的表要区别对待, 不能用这里介绍的方法, 还要把它们的索引从rebuild_&username.sql里删去.
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器