精华内容
下载资源
问答
  • 主要介绍了oracle分区的失效和重建代码示例,小编觉得挺不错的,这里分享给大家,供需要的朋友参考。
  • Oracle ~ 重建索引(包括分区)尽量不要重建索引真正需要重建索引的情形如何重建索引1、drop 原来的索引,然后再创建索引2 、直接重建2.1 alter index rebuild 和alter index rebuil online的区别注意点:重建分区表...

    尽量不要重建索引

    a. 大多数脚本都依赖 index_stats 动态表。此表使用以下命令填充:

    analyze index … validate structure;
    尽管这是一种有效的索引检查方法,但是它在分析索引时会获取独占表锁。对于大型索引,其影响会是巨大的,因为在此期间不允许对表执行DML 操作。
    虽然该方法可以在不锁表的情况下在线运行,但是可能要消耗额外的时间。

    b. 重建索引的直接结果是 REDO 活动可能会增加,总体系统负载也可能会提高。
    插入/更新/删除操作会导致索引随着索引的分割和增长不断发展。
    重建索引后,它将连接的更为紧凑;但是,随着对表不断执行 DML 操作,必须再次分割索引,直到索引达到平衡为止。
    结果,重做活动增加,且索引分割更有可能对性能产生直接影响,因为我们需要将更多的 I/O、CPU 等用于索引重建。
    经过一段时间后,索引可能会再次遇到“问题”,因此可能会再被标记为重建,从而陷入恶性循环。
    因此,通常最好是让索引处于自然平衡和(或)至少要防止定期重建索引。

    因此,一般情况下极少会重建索引, 通常是优先考虑index coalesce(索引合并),而不是重建索引。索引合并有如下优点:
    a、不需要占用盘存储空间 2 倍的空间
    b、可以在线操作
    c、无需重建索引结构,而是尽快地合并索引叶块,这样可避免系统开销过大。

    真正需要重建索引的情形

    • 索引或索引分区因介质故障损坏
    • 标记为UNUSABEL的索引需要重建
    • 索引移动到新的表空间或需要改变某些存储参数
    • 通过SQL*Loader加载数据到表分区后,需要重建索引分区
    • 重建索引以启用键压缩
    • 位图索引本质不同于B树索引,建议重建

    如何重建索引

    查询是否需要重建索引:Analyze index index_name validate structure;
    查询是否需要重建索引:select height,DEL_LF_ROWS/LF_ROWS from index_stats;
    当查询出来的 height>=4 或者 DEL_LF_ROWS/LF_ROWS>0.2 的场合 , 该索引考虑重建

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

    删除索引:drop index IX_PM_USERGROUP;

    创建索引:create index IX_PM_USERGROUP on T_PM_USER (fgroupid);

    说明:此方式耗时间,无法在24*7环境中实现,不建议使用。

    2 、直接重建

    alter index indexname rebuild;alter index indexname rebuild online;

    说明:此方式比较快,可以在24*7环境中实现,建议使用此方式

    2.1 alter index rebuild 和alter index rebuil online的区别

    1、扫描方式不同

    • Rebuild以index fast full scan(or table full scan) 方式读取原索引中的数据来构建一个新的索引,有排序的操作;

    • rebuild online 执行表扫描获取数据,有排序的操作;

    说明:Rebuild 方式 (index fast full scan or table full scan 取决于统计信息的cost)

    2 、rebuild 会阻塞 dml 操作 ,rebuild online 不会阻塞 dml 操作

    3 、rebuild online 时系统会产生一个 SYS_JOURNAL_xxx 的 IOT 类型的系统临时日志表 , 所有 rebuild online 时索引的变化都记录在这个表中 , 当新的索引创建完成后 , 把这个表的记录维护到新的索引中去 , 然后 drop 掉旧的索引 ,rebuild online 就完成了

    注意点:

    1、 执行rebuild操作时,需要检查表空间是否足够

    2、虽然说rebuild online操作允许dml操作,但是还是建议在业务不繁忙时间段进行

    Rebuild操作会产生大量redo log

    重建分区表上的分区索引

    重建分区索引方法:

    分区:Alter index indexname rebuild partition paritionname tablespace tablespacename;

    子分区:Alter index indexname rebuild subpartition partitioname tablespace tablespacename;

    展开全文
  • oracle中,重建普通表上的索引很简单。要重建特定索引,只需执行如下sql命令: ALTER INDEX INDEX_NAME Rebuild; 这里,INDEX_NAME代表索引的名字,下同。 如果重建某个表上的全部索引,执行如下PL/SQL 代码...

    在 oracle中,重建普通表上的索引很简单。要重建特定索引,只需执行如下sql命令:

    ALTER INDEX INDEX_NAME Rebuild;

    这里,INDEX_NAME 代表索引的名字,下同。

    如果重建某个表上的全部索引,执行如下 PL/SQL 代码:

    begin
        for c1 in (select t.index_name, t.partitioned from user_indexes t where table_name = 'TABLE_NAME') loop
            if c1.partitioned='NO' then
                execute immediate 'ALTER INDEX ' || c1.index_name || ' REBUILD';
            end if;
        end loop;
    end;
    /

    这里,TABLE_NAME 代表索引的名字,下同。

    而重建分区表上的索引的方法和上面的有所不同。

    如果这个索引不是分区的,那么重建的方法 和 重建普通表上的索引 相同。

    如果这个索引是分区的,重建方法是执行如下sql代码:

    begin
          for c2 in (select partition_name from user_ind_partitions where index_name='INDEX_NAME' and status = 'UNUSABLE')
          loop
            execute immediate 'alter index ' || c1.index_name || ' rebuild partition ' || c2.partition_name;
          end loop;
    end;

     

    重建一张表上的所有非分区索引的方法是执行如下sql代码:


    begin
        for c1 in (select t.index_name, t.partitioned from user_indexes t where table_name = 'TABLE_NAME')
        loop
            if c1.partitioned='YES'
                -- rebuild every unusable partition for partitioned index
                for c2 in (select partition_name from user_ind_partitions where index_name=c1.index_name and status = 'UNUSABLE')
                loop
                    execute immediate 'alter index ' || c1.index_name || ' rebuild partition ' || c2.partition_name;
                end loop;
            end if;
        end loop;
    end;

     

    而重建这张表上的全部索引的sql 代码如下:

    begin
      for c1 in (select t.index_name, t.partitioned from user_indexes t where table_name = 'TABLE_NAME'))
      loop
        if c1.partitioned='NO' then
          -- rebuild global index directly
          execute immediate 'alter index ' || c1.index_name || ' rebuild';
        else
          -- rebuild every unusable partition for partitioned index
          for c2 in (select partition_name from user_ind_partitions where index_name=c1.index_name and status = 'UNUSABLE')
          loop
            execute immediate 'alter index ' || c1.index_name || ' rebuild partition ' || c2.partition_name;
          end loop;
        end if;
      end loop;
    end;

    展开全文
  • oracle 重建分区索引

    2017-07-21 16:13:00
    重建分区表的索引回报:  ORA-14086:不能将分区索引作为整体重建。 so,重建语音必须指定分区。 alter index index_name rebuild partition partition_name; 当然,主键索引可以直接重建。 不过,如果你....

    分区表的所有分区相当于一个单独的表。

    创建在分区表上的索引,就相当于在所有分区上单独创建的索引(主键索引除外)。

    重建分区表的索引回报:

      ORA-14086:不能将分区索引作为整体重建。

    so,重建语音必须指定分区。

    alter index index_name rebuild partition partition_name;

    当然,主键索引可以直接重建。

    不过,如果你想简单残暴一点。

    可以直接把索引删掉,重建,那就不用管分区。

    转载于:https://www.cnblogs.com/Springmoon-venn/p/7218273.html

    展开全文
  • 关于 Oracle 分区索引的失效和重建

    千次阅读 2018-11-07 14:16:40
    –全局非分区索引失效,本地分区索引没有失效 SQL> select status,index_name from user_indexes s where index_name=‘IDX_PART_GLOBAL’; STATUS INDEX_NAME -------- ------------------------------ UNUSABLE ...

    –创建测试表



    SQL> create table t as select object_id,object_name from dba_objects;



    表已创建。



    SQL> select min(object_id),max(object_id) from t;



    MIN(OBJECT_ID) MAX(OBJECT_ID)

    -------------- --------------

                 2          76083



    SQL> create table t_part(object_id int,object_name varchar2(1000)) partition by range(object_id)

      2  (

      3  partition p1 values less than (10000),

      4  partition p2 values less than (20000),

      5  partition p3 values less than (30000),

      6  partition p4 values less than (40000),

      7  partition pm values less than (maxvalue));



    表已创建。



    SQL> insert into t_part select * from t;



    已创建72663行。



    SQL> commit;



    –创建本地分区索引



    SQL> create index idx_part_local on t_part(object_name) local;



    索引已创建。



    –创建全局非分区索引



    SQL> create index idx_part_global on t_part(object_id) global;



    索引已创建。



    –删除其中一个分区



    SQL> alter table t_part drop partition p1;



    表已更改。



    –全局非分区索引失效,本地分区索引没有失效



    SQL> select status,index_name from user_indexes s where index_name=‘IDX_PART_GLOBAL’;



    STATUS   INDEX_NAME

    -------- ------------------------------

    UNUSABLE IDX_PART_GLOBAL





    SQL> select status,index_name from user_ind_partitions s where index_name=‘IDX_PART_LOCAL’;





    STATUS   INDEX_NAME

    -------- ------------------------------

    USABLE   IDX_PART_LOCAL

    USABLE   IDX_PART_LOCAL

    USABLE   IDX_PART_LOCAL

    USABLE   IDX_PART_LOCAL



    –重建失效索引



    SQL> alter index idx_part_global rebuild;



    索引已更改。



    –在删除表分区的时候,可以通过以下命令进行索引重建



    alter table t_part drop partition p2 update indexes;



    –创建全局分区索引



    SQL> drop index idx_part_global;



    索引已删除。



    SQL> CREATE INDEX idx_part_global_full ON t_part (object_id)

      2     GLOBAL PARTITION BY RANGE (object_id)

      3        (PARTITION p1 VALUES LESS THAN (10000),

      4         PARTITION p2 VALUES LESS THAN (30000),

      5         PARTITION p3 VALUES LESS THAN (MAXVALUE));



    索引已创建。



    –删除其中一个分区



    SQL> alter table t_part drop partition p3;



    表已更改。



    –全局分区索引失效



    SQL> select status,index_name from user_ind_partitions s where index_name=‘IDX_PART_GLOBAL_FULL’;



    STATUS   INDEX_NAME

    -------- ------------------------------

    UNUSABLE IDX_PART_GLOBAL_FULL

    UNUSABLE IDX_PART_GLOBAL_FULL

    UNUSABLE IDX_PART_GLOBAL_FULL



    SQL> select /+index(t IDX_PART_LOCAL)/ * from t_part t where object_name = ‘/7f6c264c_IIOPAddress’;



     OBJECT_ID OBJECT_NAME

    ---------- -----------------------------------

         35031 /7f6c264c_IIOPAddress

         35030 /7f6c264c_IIOPAddress



    SQL> select /+index(t IDX_PART_GLOBAL_FULL)/ * from t_part t where object_id > 35000;

    select /+index(t IDX_PART_GLOBAL_FULL)/ * from t_part t where object_id > 35000

    *

    第 1 行出现错误:

    ORA-01502: 索引 ‘SCOTT.IDX_PART_GLOBAL_FULL’ 或这类索引的分区处于不可用状态



    当需要对分区表进行下面操作时,都会导致全局索引的失效。

    ADD (HASH) 
    COALESCE (HASH) 
    DROP 
    EXCHANGE 
    MERGE 
    MOVE 
    SPLIT 
    TRUNCATE
     
    
    之后需要对失效索引进行重建,也可以在删除分区表的时候指定 UPDATE INDEXES 直接进行索引的重建。

    来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26506993/viewspace-1992534/,如需转载,请注明出处,否则将追究法律责任。

    展开全文
  • ORACLE重建索引总结

    2011-12-13 10:32:28
    重建分区索引方法: Alter index indexname rebuild partition paritionname tablespace tablespacename; Alter index indexname rebuild subpartition partitioname tablespace tablespacename; Partition name ...
  • 使用如下方式重建主键索引为分区索引。 alter table xxxx drop constraint xxx; alter table add constraint xxx primary key(ID1,ID2,ID3) USING INDEX LOCAL;
  • 对于oracle分区表分区索引的详细说明。 详细描述了分区表的类型,分区索引的类型 分类 。 删除或truncate 表分区时,什么样的情况索引会失效 需要重建 ,什么时候 对索引 没影响 。
  • ORACLE重建索引详解

    千次阅读 2018-01-25 10:12:03
    一、重建索引的前提 1、表上频繁发生update,delete操作; 2、表上发生了alter table ..move操作(move操作导致了rowid变化)。   二、重建索引的标准 1、索引重建是否有必要,一般看索引是否倾斜的...
  • 通过分区,您可以将非常大的表和索引分解为更小的,更易于管理的部分,称为分区。每个分区都是一个独立的对象,具有自己的名称和可选的自身存储特性。 分区表的几个好处: 1.增加可用性 分区的不可用并不意味着整个...
  • oracle拆分分区表及重建索引

    千次阅读 2020-05-23 12:05:02
    四、重建索引 分区时,语句务必带上“update index”选项,否则拆分以后,索引不可用,报ORA-01502错误,新记录会插不进去!(错误ORA-01502: 索引或这类索引分区处于不可用状态)。但网上许多教程,根本没提这...
  • Oracle分区表及分区索引

    千次阅读 2017-08-10 17:06:52
    Oracle分区索引 索引与表类似,也可以分区; 分区索引分为两类: Locally partitioned index(局部分区索引)Globally partitioned index(全局分区索引) 下面就来详细解析一下这两类索引。   一:...
  • oracle分区表和分区索引的概念

    千次阅读 2019-01-17 16:55:18
    就是决定分区的规则的一列或多列,oracle会自动完成insert、update和delete操作到合适的分区中。 Partitioned Tables 分区表可以包含100万独立分区。但是分区表不能有LONG or LONG RAW 类型的行,可以有CLOB or ...
  • alter index indexname rebuild partition partitionname tablespace spacename parallel 1 nologging; 是属于上述哪一种? 如何查看上述语句是否建立成功?(和没建怎么对比着看?...3.重建分区索引
  • ORACLE重建索引

    万次阅读 2018-04-23 18:42:27
    重建索引 alter index 索引名称 rebuild tablespace DELL_SPACE online; 索引分析 analyze index 索引名称 validate structure; select (del_lf_rows_len/lf_rows_len) from index_stats where name='索引名称';
  • 25 more 初步解答思路:初步尝试Oracle数据库重建分区索引的相关任务时间后延,但是仍然在开始重建分区索引后报错 Debezium版本:1.5 Kafka版本:2.6.1 zookeeper:3.6.2 Oracle版本源库以及目标库均为11g
  • PLSQL,测试 ,创建局部分区索引,全局未分区索引 ,全局分区索引,以及失效重建
  • Oracle分区索引分区

    千次阅读 2016-04-26 13:06:12
    分区技术简介Oracle是最早支持物理分区的数据库管理系统供应商,表分区的功能是在Oracle 8.0版本推出的。分区功能能够改善应用程序的性能、可管理性和可用性,是数据库管理中一个非常关键的技术。尤其在今天,数据库...
  • 新系统改造,对于分区表上的索引都改成local类型的分区索引,便以为高枕无忧,自此任由他人对表进行DDL操作,也无需担心索引失效的情况了。然而,天有不测风云。在巡检系统运行情况时候,发现一条sql语句平均执行...
  • 最近在做一个数据相关的项目,业务表采用了分区。在数据处理过程中由于部分数据需要...经确认,是因为tuncate表分区时,导致分区索引无效,之后采取以下措施进行索引重建。 查询分区无效索引: select index_name fr
  • Oracle 重建索引的必要性

    万次阅读 2014-04-15 15:45:07
    当然Oracle官方也有自己的观点,我们很多DBA也是遵循这一准则来重建索引,那就是Oracle建议对于索引深度超过4级以及已删除的索引条目至少占有现有索引条目总数的20% 这2种情形下需要重建索引。近来Oracle也提出了...
  • 将普通表转为分区表,在分区表改造完成后,在分区表上创建索引 create index test.ind_t on test.t (a, b, c, d, e, f) tablespace t_tbs local NOLOGGING PARALLEL 16; 开16个并行,报错TEMP临时表空间不足 ...
  • 有的时候我们需要针对部分分区创建索引oracle11g提供了这个功能。可以在部分分区上创建本地索引和全局索引。 全局的部分索引:只对那些需要索引分区创建索引,别的分区不会创建。 本地索引:如果对表分区打开...
  • oracle 测试 清除分区数据,索引释放空间
  • 这个分区表是按照里面有个创建时间字段来分区的,1个季度为1个分区。所以我现在要将2017年7月1日之前的数据删除(数据量约1000万),可以直接删除表分区数据就好。如果要是用delete去删除这么多的数据,我还要写存储...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,382
精华内容 5,352
关键字:

oracle重建子分区索引