奇趣技术网 收藏本站
设为主页
商务合作
首页 新闻中心 行业动态 软件新闻 安全资讯 病毒预警 漏洞发布 操作系统 Dos Win9x Win2000 WinXP Win2003 WinVista Linux Unix
数据库 DB2 Access MSSQL MySQL Oracle Sybase 编程技术 ASP PHP JSP CGI/Perl XML .Net C/C++/C# VB VC Delphi Java 汇编
安全技术 安全教学 工具介绍 漏洞利用 病毒防范 入侵检测 防火墙 安全防范 汉化破解 攻击实例 加密解密 技术论坛
中华网络安全联盟 >> 数据库 >> Oracle >> 在ORACLE里按用户名重建索引的方法
数据库
Access
SQL Server
MySQL
DB2
Oracle
Sybase
  • Linux下安装支持ssl连

  • 在同一台机运行多个My

  • 我的MYSQL安装笔记拿出

  • 写了个简单的数据库自

  • Oracle 10g中新型层次

  • ORACLE回滚段管理(下

  • ORACLE回滚段管理(上

  • Oracle大文本在ASP中存

  •   
    在ORACLE里按用户名重建索引的方法
    字体:

    中华网络安全联盟    作者:佚名    来源:网络转载    时间:2006-3-23

    如果你管理的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里删去.

    字体:
     
    设为主页 收藏本站 联系我们 友情连接 商务合作 网友留言
    Copyright©2006-2008 中华网络安全联盟 All rights reserved.