网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  oracle数据库中按用户名重建索引的方法     
  文章作者:未知  文章来源:赛迪网技术社区  
  查看:101次  录入:管理员--2008-04-29  
 

【赛迪网-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数据库始终保持优良性能    下一篇: oracle性能调优过程中如何观察缓存命中率
  相关文档
用一条SQL 实现其它进制到十进制的转换 08-05
了解国外公司的Oracle DBA面试试题 05-13
解析:如何修改 oracle 数据库表的大小 11-21
讲解oracle中job与存储过程的接合用法 03-13
教你轻松掌握如何用toad或oem管理job 02-28
Oracle导出数据库结构到PowerDesigner 09-01
oracle 9i与10g中plan_table的不同 02-29
讲解sql server定时作业job的设置方法 07-28
实例讲解如何使用oracle数据库to_date() 04-17
了解oracle体系结构前必须掌握的两个概念 (1) 04-23
解析:物化视图刷新中出现的“约束冲突” 11-15
怎样在数据字典中直接修改oracle表列名 11-15
教你快速掌握解决rman-06026错误的方法 (1) 04-03
通过rman backup as copy移动数据文件 03-06
细化解析如何共享Oracle数据库身份空间 09-01
Oracle 容灾复制解决方案分析Shar Plex 06-17
在linux平台用hugetlbfs模拟lock_sga 05-13
Oracle系统表查询 01-15
Oracle的两个重要文件:TNSNAMES.ORA 05-13
快速了解Oracle9i中的一个特殊等待事件 09-29
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息