• 索引的重建


    一、何时需要重建索引

    1. 表上频繁发生update,delete操作;
    2. 表上发生了alter table ..move操作(move操作导致了rowid变化)。

    二、判断某索引是否应被重建

    1、索引重建是否有必要,一般看索引是否倾斜的严重,是否浪费了空间,那应该如何才可以判断索引是否倾斜的严重,是否浪费了空间,对索引进行结构分析:
    SQL> analyze index index_name validate structure;

    2、在相同的session中查询index_stats表
    SQL> select height,DEL_LF_ROWS/LF_ROWS from index_stats;
    当查询的height>=4(索引的深度,即从根到叶节点的高度)或DEL_LF_ROWS/LF_ROWS>0.2的情况下,就应该考虑重建该索引。

    三、如何执行重建索引的操作

    1、drop原索引,然后再创建索引

    SQL> drop index index_name;
    SQL> create index index_name on table_name (index_column);
    上述方法相当耗时间,不建议使用。

    2 、直接重建索引

    SQL> alter index indexname rebuild;
    SQL> alter index indexname rebuild online;
    此方法较快,建议使用。
    

    rebuild是快速重建索引的一种有效的办法,因为它是一种使用现有索引项来重建新索引的方法。如果重建索引时有其他用户在对这个表操作,尽量使用带online参数来最大限度的减少索引重建时将会出现的任何加锁问题。由于新旧索引在建立时同时存在,因此,使用这种重建方法需要有额外的磁盘空间可供临时使用,当索引建完后把老索引删除,如果没有成功,也不会影响原来的索引。利用这种办法可以用来将一个索引移到新的表空间。

    四、alter index rebuild内部过程和注意事项

    Rebuild创建索引的内部过程:

    1. 扫描方式不同。Rebuild以index fast full scan或table full scan方式(到底采用那种方式取决于cost)读取原索引中的数据来构建一个新的索引,重建过程中有排序操作,rebuild online执行表扫描获取数据,重建过程中有排序的操作;
    2. 是否阻塞DML操作。Rebuild会阻塞DML操作,rebuild online不会阻塞DML操作 ;
    3. rebuild online时系统会产生一个SYS_JOURNAL_xxx的IOT类型的系统临时日志表,所有rebuild online时索引的变化都记录在这个表中,当新的索引创建完成后,把这个表的记录维护到新的索引中去,然后drop掉旧的索引,rebuild online就完成了。

    示例一、用rebuild方式重建索引的

    SQL> explain plan for alter index DBUSRPOS.PK_REPORTREG rebuild;
    
    Explained.
    
    SQL> set lines 150
    
    SQL> select * from table(dbms_xplan.display);
    
    PLAN_TABLE_OUTPUT
    ------------------------------------------------------------------------------------------------------------------------------------------------------
    Plan hash value: 1405161665
    
    ---------------------------------------------------------------------------------------
    | Id  | Operation              | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------------------
    |   0 | ALTER INDEX STATEMENT  |              |    41 |   246 |     1   (0)| 00:00:01 |
    |   1 |  INDEX BUILD UNIQUE    | PK_REPORTREG |       |       |            |          |
    |   2 |   SORT CREATE INDEX    |              |    41 |   246 |            |          |
    |   3 |    INDEX FAST FULL SCAN| PK_REPORTREG |    41 |   246 |     1   (0)| 00:00:01 |
    ---------------------------------------------------------------------------------------
    

    示例二、用rebuild online方式重建索引

    SQL> explain plan for alter index DBUSRPOS.PK_PRIVATEPARA rebuild online;
    
    Explained.
    
    SQL> set lines 150
    
    SQL> select * from table(dbms_xplan.display);
    
    PLAN_TABLE_OUTPUT
    ------------------------------------------------------------------------------------------------------------------------------------------------------
    Plan hash value: 3437353873
    
    ----------------------------------------------------------------------------------------
    | Id  | Operation             | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------------------
    |   0 | ALTER INDEX STATEMENT |                |    94 |   282 |     1   (0)| 00:00:01 |
    |   1 |  INDEX BUILD UNIQUE   | PK_PRIVATEPARA |       |       |            |          |
    |   2 |   SORT CREATE INDEX   |                |    94 |   282 |            |          |
    |   3 |    TABLE ACCESS FULL  | PRIVATEPARA    |    94 |   282 |     1   (0)| 00:00:01 |
    ----------------------------------------------------------------------------------------
    

    重建索引过程中的注意事项:

    1. 执行rebuild操作时,需要检查表空间是否足够;
    2. 虽然说rebuild online操作允许DML操作,但还是建议在业务不繁忙时间段进行;
    3. Rebuild操作会产生大量Redo Log;

    五、重建分区表上的分区索引

    SQL> alter index indexname rebuild partition paritionname tablespace tablespacename;
    SQL> alter index indexname rebuild subpartition partitioname tablespace tablespacename;
    

     

  • 相关阅读:
    iOS开发之JSON格式数据的生成与解析
    Xcode 怎么查看代码总行数
    iOS OC与JS的交互(JavaScriptCore实现)
    Webstorm设置代码提示
    iOS app性能优化的那些事
    pThread多线程demo
    更新UI放在主线程的原因
    iOS小知识点
    上传本地代码及更新代码到GitHub教程
    logstash安装配置
  • 原文地址:https://www.cnblogs.com/sunmengbbm/p/5757915.html
Copyright © 2020-2023  润新知