暂无图片
暂无图片
10
暂无图片
暂无图片
1
暂无图片

oracle表维护操作move update index与move online的一点差异

原创 范计杰 2021-09-24
1569

在巡检时发现部分表的分区的索引比表大了几千倍,虽然频繁发生UPDATE,DELETE会导致索引比表大,但大这么多的很少见到,经过分析发现是这些表之前维护时做过MOVE操作,使用了update index选项。12c开始支持move online操作,move online操作在完成时会重建索引,不会产生move完成后表变小了,但索引仍然很大的问题,下面记录一下重现该过程并对比move online操作。

move update index

SQL> create table dbmt.t1(id number,c varchar2(1024));


Table created.

SQL> insert into dbmt.t1 select rownum,rpad('a',1024,'b') from dual connect by rownum<100000;

99999 rows created.

SQL>  create index dbmt.idx_t1 on dbmt.t1(c);


Index created.


SQL> @seg dbmt.t1

    SEG_MB OWNER                SEGMENT_NAME                   SEG_PART_NAME                  SEGMENT_TYPE         SEG_TABLESPACE_NAME                                              BLOCKS     HDRFIL     HDRBLK
---------- -------------------- ------------------------------ ------------------------------ -------------------- ------------------------------------------------------------ ---------- ---------- ----------
       120 DBMT                 T1                                                            TABLE                USERS                                                              7680        878     570147

SQL> @seg dbmt.idx_t1

    SEG_MB OWNER                SEGMENT_NAME                   SEG_PART_NAME                  SEGMENT_TYPE         SEG_TABLESPACE_NAME                                              BLOCKS     HDRFIL     HDRBLK
---------- -------------------- ------------------------------ ------------------------------ -------------------- ------------------------------------------------------------ ---------- ---------- ----------
       128 DBMT                 IDX_T1                                                        INDEX                USERS                                                              8192        878     570163

SQL> delete dbmt.t1;

99999 rows deleted.

SQL> commit;

Commit complete.

SQL> alter table DBMT.t1 move update indexes;


Table altered.


SQL> @seg dbmt.t1

    SEG_MB OWNER                SEGMENT_NAME                   SEG_PART_NAME                  SEGMENT_TYPE         SEG_TABLESPACE_NAME                                              BLOCKS     HDRFIL     HDRBLK
---------- -------------------- ------------------------------ ------------------------------ -------------------- ------------------------------------------------------------ ---------- ---------- ----------
         0 DBMT                 T1                                                            TABLE                USERS                                                                 8        878     574919

SQL> @seg dbmt.idx_t1

    SEG_MB OWNER                SEGMENT_NAME                   SEG_PART_NAME                  SEGMENT_TYPE         SEG_TABLESPACE_NAME                                              BLOCKS     HDRFIL     HDRBLK
---------- -------------------- ------------------------------ ------------------------------ -------------------- ------------------------------------------------------------ ---------- ---------- ----------
       128 DBMT                 IDX_T1                                                        INDEX                USERS                                                              8192        878     570163
复制

move online


SQL> drop table dbmt.t1;

Table dropped.

SQL> create table dbmt.t1(id number,c varchar2(1024));

Table created.

SQL>  insert into dbmt.t1 select rownum,rpad('a',1024,'b') from dual connect by rownum<100000;

99999 rows created.

SQL>  create index dbmt.idx_t1 on dbmt.t1(c);

Index created.

SQL>  @seg dbmt.t1

    SEG_MB OWNER                SEGMENT_NAME                   SEG_PART_NAME                  SEGMENT_TYPE         SEG_TABLESPACE_NAME                                              BLOCKS     HDRFIL     HDRBLK
---------- -------------------- ------------------------------ ------------------------------ -------------------- ------------------------------------------------------------ ---------- ---------- ----------
       120 DBMT                 T1                                                            TABLE                USERS                                                              7680        878     570147

SQL>  @seg dbmt.idx_t1

    SEG_MB OWNER                SEGMENT_NAME                   SEG_PART_NAME                  SEGMENT_TYPE         SEG_TABLESPACE_NAME                                              BLOCKS     HDRFIL     HDRBLK
---------- -------------------- ------------------------------ ------------------------------ -------------------- ------------------------------------------------------------ ---------- ---------- ----------
       128 DBMT                 IDX_T1                                                        INDEX                USERS                                                              8192        878     574927

SQL> delete dbmt.t1;
commit;
99999 rows deleted.

SQL> 

Commit complete.

SQL> alter table DBMT.t1 move online;

Table altered.

SQL> @seg DBMT.t1

    SEG_MB OWNER                SEGMENT_NAME                   SEG_PART_NAME                  SEGMENT_TYPE         SEG_TABLESPACE_NAME                                              BLOCKS     HDRFIL     HDRBLK
---------- -------------------- ------------------------------ ------------------------------ -------------------- ------------------------------------------------------------ ---------- ---------- ----------
         0 DBMT                 T1                                                            TABLE                USERS                                                                 8        878     574955

SQL> @seg DBMT.idx_t1

    SEG_MB OWNER                SEGMENT_NAME                   SEG_PART_NAME                  SEGMENT_TYPE         SEG_TABLESPACE_NAME                                              BLOCKS     HDRFIL     HDRBLK
---------- -------------------- ------------------------------ ------------------------------ -------------------- ------------------------------------------------------------ ---------- ---------- ----------
         0 DBMT                 IDX_T1                                                        INDEX                USERS                                                                 8        878     574947

SQL> @o dbmt.idx_t1

owner                     object_name                    object_type        status           OID      D_OID CREATED           LAST_DDL_TIME
------------------------- ------------------------------ ------------------ --------- ---------- ---------- ----------------- -----------------
DBMT                      IDX_T1                         INDEX              VALID        7134518    7134525 20210924 10:19:29 20210924 10:20:05
复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

筱悦星辰
暂无图片
1年前
评论
暂无图片 0
生活从来没有捷径,当你知道自己想要的是什么时,制定计划、勇敢出发,让梦想照进现实。只要你勇敢前行,生活早晚会给你意想不到的惊喜。
1年前
暂无图片 点赞
评论