网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  oracle数据库中按用户名重建索引的方法     
  文章作者:未知  文章来源:赛迪网技术社区  
  查看:102次  录入:管理员--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性能调优过程中如何观察缓存命中率
  相关文档
Oracle数据库中临时表的进一步深入研究 05-27
讲解oracle数据库提供的多种安全性措施 (1) 05-05
详细讲解"oracle"服务器的常用命令行 03-14
怎样选择适合的Oracle优化器 09-29
讲解如何用组来保证Oracle数据库的安全 06-03
轻松了解 memory_target与自动内存管理 11-15
Oracle数据库字符集转换规律全面剖析 04-11
oracle数据库11g高级压缩特性 及压缩好处 09-22
全面解析oracle体系结构的两个重要概念 (1) 05-13
oracle数据库中如何对时间格式进行处理 03-19
启动或关闭数据库的归档(archivelog)模式 08-06
由浅至深讲解oracle数据库 b-tree索引 (1) 04-16
两个不容易理解的概念──user和schema 03-05
数据库中判断一个字符串内是否含有中文 05-06
详细讲解oracle表分区的相关概念及其优点 (1) 03-17
讲解sql与oracle外键约束中的级联删除 05-29
oracle中用表外键来保证系统参照完整性 (1) 01-24
实例讲解oracle中一些关于权限的数据字典 03-17
在oracle数据库中处理数据的高并发响应 07-30
一个完整的oracle rman备份恢复参考示例 05-29
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息