如果你管理的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:oraclerebuild_&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里删去。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
入门级的ORACLE数据库备份与数据库还原
为了进行让作者在2008年09月18号于进行了Oracle数据库系统的安装与设置工作。将Oracle数据库系统安装在C盘,数据库文件位置在D:oracleoradata。
-
将多个用户映射到一个数据库用户名上
有没有什么方法可以将Unix 用户 ID映射到一个数据库ID上面?因为表单与数据库紧密联系,有没有什么方法可以将Unix环境变量读到表单中?
-
数据库用户名和密码安全
今天我们更加需要注意确保数据库安全。数据库安全当然包括数据库的用户名和密码安全问题。本文介绍设置用户名和密码的最佳方法、在授予或撤消用户访问权限时我们应该注意的事项以及我们能采取的真正确保用户名和密码安全的方法。
-
如何确保用户名和密码安全?
您能告诉我在Windows平台上确保应用软件程序的用户名和密码安全最简单的方法么?我们用它们连接Oracle服务器,不想将它们置入代码里。我还想按照日期和时间……