如果你管理的ORACLE数据库下某些应用项目有大量的修改删除操作, 数据索引是需要周期性的重建的.
它不仅可以提高查询性能, 还能增加索引表空间空闲空间大小.
在ORACLE里大量删除记录后, 表和索引里占用的数据块空间并没有释放.
重建索引可以释放已删除记录索引占用的数据块空间.
转移数据, 重命名的方法可以重新组织表里的数据.
下面是可以按ORACLE用户名生成重建索引的SQL脚本:
---------------------------------------------------------------------------
SET ECHO OFF;
SET FEEDBACKOFF;
SET VERIFY OFF;
SET PAGESIZE0;
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
WHEREsegment_type = 'INDEX'
ANDowner='&username'
ORDER BY owner, bytes DESC;
spool off;
-----------------------------------------------------------------------------
如果你用的是WINDOWS系统, 想改变输出文件的存放目录, 修改spool后面的路径成:
spool c:/oracle/rebuild_&username.sql;
如果你只想对大于max_bytes的索引重建索引, 可以修改上面的SQL语句:
在ANDowner='&username' 后面加个限制条件 ANDbytes> &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_rowsheading '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里删去.
分享到:
相关推荐
3、以删除的叶节点数量:指得是数据行的delete操作从逻辑上删除的索引节点 的数量,要记住oracle在删除数据行后,将 “ 死 “ 节点保留在索引中,这样做可以加快sql删除操作的速度,因此oracle删除数据行后可以不必...
无需删除用户重建相同的用户名,可以通过命令更改oracle下用户名。
索引操作的完整,特别对于索引的相关验证介绍非常实用,在重建索引时可以提供给使用者完整的操作方法。
oracle 修改用户名密码
NULL 博文链接:https://hackpro.iteye.com/blog/1845366
导致索引失效: 1、表上频繁发生update,delete操作; 2、表上发生了alter table ..move操作(move操作导致了rowid变化)。
oracle不同用户名及表空间之间的数据导入
oracle 9i默认用户名、密码解锁
Oracle_默认用户名密码及解锁 适合初学者学习!
oracle数据库用户名及密码 1、连接到数据库。通常可以用sys用户登陆 2、找到 name为需要修改的用户 3、修改提交 4、测试连接
oracle在线创建索引和重组索引。
Oracle 索引 使用方法,索引 使用原理, 索引 使用顺序过程
oracle10g 默认用户名、密码解锁,适用于由于的用户时间久远忘记用户名、密码!
Oracle在线建立超大表的索引,为在线生产系统某核心大表建立索引
oracle数据导出身份证明-用户名和口令-错误的解决方法
如何重建索引如何重建索引如何重建索引如何重建索引如何重建索引
oracle 11g默认用户名密码.zip
[Oracle]在亿级记录表中创建索引 [Oracle]如何在亿级记录表中创建索引 [Oracle]如何在亿级记录表中创建索引
oracle12c程序连接时异常: ORA-01017: 用户名/口令无效; 登录被拒绝 的解决方案。
oracle 用户 全部 索引 all index sql