服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > 数据库技术 > Oracle技术 > Oracle开发 > 查看文档

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

【赛迪网-it技术报道】如果你管理的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 'deleted|leaf rows' format 99999999

col lf_rows_used heading 'used|leaf rows' format 99999999

col ratio heading '% deleted|leaf 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里删去。

扫描关注微信公众号