· [Java论坛][安全论坛][数据库论坛][操作系统论坛]
· [访谈] 网银安全系列访谈之:惊心动魄网银故事
· [热点专题] 网银安全系列 3G上网卡巡礼
· [订阅IT技术周刊][IT资源下载专区][病毒求助专区]
· [热点] 跨站脚本十二问 四步防范Conficker
· [热点] Windows 7 RC版公开下载 憾缺中文版

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

发布时间:2008.07.30 04:57     来源:赛迪网    作者:Alizze

【赛迪网-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里删去。

(责任编辑:卢兆林)


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· 用一个实例讲解Oracle数据库的PL/SQL语句块 (07-29) · 实例讲解更改Oracle数据库中的sys口令 (07-29)
· 带你深入了解Oracle数据库的"SYS"口令 (07-29) · 一个修改Oracle数据库用户密码的小诀窍 (07-29)
· 在Oracle数据库中处理数据的高并发响应 (07-29) · Oracle数据库中sys和system两个用户的区别 (07-28)
· Oracle数据库环境下数据文件丢失的恢复 (07-24) · 当数据积累到一定时间后执行会越来越慢 (07-24)
· 讲解Oracle数据库冷备份恢复的具体步骤 (07-18) · 讲解Oracle数据库冷备份恢复的具体步骤 (07-18)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
资讯 通信 IT产品 IT技术 信息化
2009第七届中国电脑商年会直播
·创业投资系列访谈:产业..
·特别策划:视频网站系列..
·专题:网游虚拟货币新规..
专题:6月上市手机新品回顾及7月新机展望
·2009年中国电信业信息化..
·专题:把iPhone 3GS“解..
·WAPI重启国际标准进程 ..
专题:09年中盘点-联想春季打印机新品回顾
·InfoComm 2009 视听与集..
·网游背后的故事 网游服..
·[专题]联想ThinkPad T40..
BizSpark:微软为技术创业企业点燃火花
·社区活动:我的IT求知生..
·访谈:内网安全2009系列..
·安全访谈:网银安全之Sa..