假如你管理的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按用户名重建索引方法浅析
                
                文章URL:http://www.csdahua.cn/qtweb/news1/532951.html
            
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网