zoukankan      html  css  js  c++  java
  • 重建索引

    当我们创建索引时,oracle会为索引创建索引树,表和索引树通过rowid(伪列)来定位数据。当表里的数据发生更新时,oracle会自动维护索引树。但是在索引树中没有更新操作,只有删除和插入操作。

    例如在某表id列上创建索引,某表id列上有值“101”,当我将“101”更新为“110”时,oracle同时会来更新索引树,但是oracle先将索引树中的“101”标示为删除(实际并未删除,只是标示一下),然后再将“110”写到索引树中。

    如果表更新比较频繁,那么在索引中删除标示会越来越多,这时索引的查询效率必然降低,所以我们应该定期重建索引。来消除索引中这些删除标记。

    一般不会选择先删除索引,然后再重新创建索引,而是rebuild索引。在rebuild期间,用户还可以使用原来的索引,并且rebuild新的索引时也会利用原来的索引信息,这样重建索引会块一些。

    如果Oracle数据库下某些应用项目有大量的修改删除操作,就需要周期性的重建索引,提高Oracle数据库的查询效率。

    AD:

    Oracle重建索引操作大家经常会用到,下面就为您详细介绍Oracle重建索引方面的知识,供您参考,如果您对此方面感兴趣的话,不妨一看。

    如果你管理的Oracle数据库下某些应用项目有大量的修改删除操作, 数据索引是需要周期性的重建的.

    它不仅可以提高查询性能, 还能增加索引表空间空闲空间大小. 在ORACLE里大量删除记录后, 表和索引里占用的数据块空间并没有释放. Oracle重建索引可以释放已删除记录索引占用的数据块空间. 转移数据, 重命名的方法可以重新组织表里的数据.

    下面是可以按ORACLE用户名生成Oracle重建索引的SQL脚本:

    1. SET ECHO OFF;   
    2.  
    3. SET FEEDBACK OFF;   
    4.  
    5. SET VERIFY OFF;   
    6.  
    7. SET PAGESIZE 0;   
    8.  
    9. SET TERMOUT ON;   
    10.  
    11. SET HEADING OFF;   
    12.  
    13. ACCEPT username CHAR PROMPT 'Enter the index username: ';   
    14.  
    15. spool /oracle/rebuild_&username.sql;   
    16.  
    17. SELECT   
    18.  
    19. 'REM +-----------------------------------------------+' || chr(10) ||   
    20.  
    21. 'REM | INDEX NAME : ' || owner || '.' || segment_name   
    22.  
    23. || lpad('|', 33 - (length(owner) + length(segment_name)) )   
    24.  
    25. || chr(10) ||   
    26.  
    27. 'REM | BYTES : ' || bytes   
    28.  
    29. || lpad ('|', 34-(length(bytes)) ) || chr(10) ||   
    30.  
    31. 'REM | EXTENTS : ' || extents   
    32.  
    33. || lpad ('|', 34-(length(extents)) ) || chr(10) ||   
    34.  
    35. 'REM +-----------------------------------------------+' || chr(10) ||   
    36.  
    37. 'ALTER INDEX ' || owner || '.' || segment_name || chr(10) ||   
    38.  
    39. 'REBUILD ' || chr(10) ||   
    40.  
    41. 'TABLESPACE ' || tablespace_name || chr(10) ||   
    42.  
    43. 'STORAGE ( ' || chr(10) ||   
    44.  
    45. ' INITIAL ' || initial_extent || chr(10) ||   
    46.  
    47. ' NEXT ' || next_extent || chr(10) ||   
    48.  
    49. ' MINEXTENTS ' || min_extents || chr(10) ||   
    50.  
    51. ' MAXEXTENTS ' || max_extents || chr(10) ||   
    52.  
    53. ' PCTINCREASE ' || pct_increase || chr(10) ||   
    54.  
    55. ');' || chr(10) || chr(10)   
    56.  
    57. FROM dba_segments   
    58.  
    59. WHERE segment_type = 'INDEX'   
    60.  
    61. AND owner='&username'   
    62.  
    63. ORDER BY owner, bytes DESC;   
    64.  
    65. spool off;   

    如果你用的是WINDOWS系统, 想改变输出文件的存放目录, 修改spool后面的路径成:

    spool c:\oracle\rebuild_&username.sql;

    如果你只想对大于max_bytes的索引重建索引, 可以修改上面的SQL语句:

    在AND owner='&username' 后面加个限制条件 AND bytes> &max_bytes

    如果你想修改索引的存储参数, 在Oracle重建索引rebuild_&username.sql里改也可以. 比如把pctincrease不等于零的值改成是零. 生成的rebuild_&username.sql文件我们需要来分析一下, 它们是否到了需要重建的程度:

    分析索引,看是否碎片严重

    1. SQL>ANALYZE INDEX &index_name VALIDATE STRUCTURE;   
    2.  
    3. col name heading 'Index Name' format a30   
    4.  
    5. col del_lf_rows heading 'Deleted|Leaf Rows' format 99999999   
    6.  
    7. col lf_rows_used heading 'Used|Leaf Rows' format 99999999   
    8.  
    9. col ratio heading '% Deleted|Leaf Rows' format 999.99999   
    10.  
    11. SELECT name,   
    12.  
    13. del_lf_rows,   
    14.  
    15. lf_rows - del_lf_rows lf_rows_used,   
    16.  
    17. to_char(del_lf_rows / (lf_rows)*100,'999.99999') ratio   
    18.  
    19. FROM index_stats where name = upper('&index_name');   

    当删除的比率大于15 - 20% 时,肯定是需要索引重建的. 经过删改后的rebuild_&username.sql文件我们可以放到ORACLE的定时作业里:

    比如一个月或者两个月在非繁忙时间运行. 如果遇到ORA-00054错误, 表示索引在的表上有锁信息, 不能重建索引. 那就忽略这个错误, 看下次是否成功. 对那些特别忙的表要区别对待, 不能用这里介绍的方法, 还要把它们的索引从rebuild_&username.sql里删去。 

    -- 因为系统中很对表的数据变化比较频繁,导致索引空间膨胀,系统性能下降

    -- 因此需要定期重建系统中的索引,以优化性能,回收空间

    -- 这项维护性工作通过 Oracle  job 进行调度

     

    -- 建立一张表,存放索引重建日志

    CREATE TABLE tmMTNLog (

           fLogDate char ( 19 ),

           fLogMsg  varchar2 ( 4000 )

    );

     

    -- 首先创建一个存储过程,该存储过程重建所有的索引

    CREATE OR REPLACE procedure mtn_rebuild_all_idx

    as

     

    cursor indexCursor is

    select * from user_indexes where table_owner = 'XXXXX' and index_type = 'NORMAL' ;

    --请将XXXXX替换为oracle用户名

     

    indexRow indexCursor %ROWTYPE;

    sqlText varchar2 ( 1024 );

     

    begin

     

         open indexCursor ;

         loop

            fetch indexCursor into indexRow ;

            exit when indexCursor %NOTFOUND;

            sqlText := ' alter index ' || indexRow . index_name || ' rebuild ' ;

           BEGIN

                execute immediate ( sqlText );

               insert into tmMTNLog ( fLogDate , fLogMsg ) values( sysdate , 'rebuild index success:' || indexRow . index_name );

               EXCEPTION

                  WHEN OTHERS THEN

                  insert into tmMTNLog ( fLogDate , fLogMsg ) values( sysdate , 'rebuild index fail:' || indexRow . index_name );

           END;

         end loop;

     

    end;

    /

     

    -- 然后建立一个 Oracle 任务,这个任务每隔七天调度一次 mtn_rebuild_all_idx 这个存储过程

    -- 请注意, Oracle 的任务创建脚本不能多次执行,因为每次执行都会生成一个新的任务,如果要修改,请先删除原有任务

    -- 因为 Oracle 中用编号表示任务,所以脚本不清楚该任务是否已经存在,无法做到自动删了新建

    DECLARE

      X NUMBER ;

    BEGIN

      SYS .DBMS_JOB.SUBMIT

        (

          job        => X

         , what       => 'ITIMS.MTN_REBUILD_ALL_IDX;'

         , next_date  => TRUNC ( SYSDATE + 7 )

         ,interval    => 'TRUNC(SYSDATE+7)'

         , no_parse   => FALSE

        );

    END; 

  • 相关阅读:
    LeetCode 230. 二叉搜索树中第K小的元素(Kth Smallest Element in a BST)
    LeetCode 216. 组合总和 III(Combination Sum III)
    LeetCode 179. 最大数(Largest Number)
    LeetCode 199. 二叉树的右视图(Binary Tree Right Side View)
    LeetCode 114. 二叉树展开为链表(Flatten Binary Tree to Linked List)
    LeetCode 106. 从中序与后序遍历序列构造二叉树(Construct Binary Tree from Inorder and Postorder Traversal)
    指针变量、普通变量、内存和地址的全面对比
    MiZ702学习笔记8——让MiZ702变身PC的方法
    你可能不知道的,定义,声明,初始化
    原创zynq文章整理(MiZ702教程+例程)
  • 原文地址:https://www.cnblogs.com/kelin1314/p/2355025.html
Copyright © 2011-2022 走看看