您现在的位置是:首页 >

把什么和什么相比较 Oracle:MOVE与SHRINK命令相比较

火烧 2022-09-29 00:41:21 1065
Oracle:MOVE与SHRINK命令相比较   MITe命令压缩Oracle块中的记录 解决行链接问题 并重置表的高水平线   move和 hri k命令都会重置表的高水平线 那么哪个命令更有效呢

Oracle:MOVE与SHRINK命令相比较  

  MITe命令压缩Oracle块中的记录 解决行链接问题 并重置表的高水平线

  move和shrink命令都会重置表的高水平线 那么哪个命令更有效呢?这篇文章讨论使用move和shrink命令重新组织一个表 然后比较Oracle块的记录被压缩得怎么样以及行链接解决得怎么样

  注意 关于表高水平线和重置表高水平线的不同方法的详细讨论不在这篇文章的讨论范围内

  下面的步骤简要描述了使用move和shrink命令对TEMP_JP表进行重组时对该表的各种操作 在这一系列步骤中出现的一些异常被清晰地标注出来(Move相关的命令是以蓝色表示 Shrink相关的命令是以绿色表示)

  

    – 

  创建表temp_jp并插入 条记录到这个表中

  

  显示在表的Oracle块中的记录分配

  奇怪的是 插入到每个Oracle块中的记录数不是相同的

  

  索引表temp_jp

  

  检验表和索引的磁盘空间利用情况 默认情况下 Oracle为一个表分配一个区间 为一个索引分配两个区间

  

  对temp_jp表添加一个第三列来模拟行链接

  

  分析Temp_jp表

  

  从temp_jp表选择行数和链接行数 temp_jp表中几乎所有的记录都是链接的

  

  在模拟行链接之后检查表和索引的磁盘空间利用情况 表temp_jp的磁盘空间使用增加了 番

  

  删除这个表的所有记录 使这个表中每个Oracle块只留一条记录

  

  在删除记录之后 展开显示temp_jp表的记录 记录的数目显示了每个Oracle块是一致的 因为我们删除了这个表的所有记录 这个表中每个Oracle块只留一条记录

  

  分析Temp_jp表

  

  从temp_jp表选择行数和链接行数

  

  检查temp_jp表的索引状态 它是VALID

  

   A 对表执行move操作 BA BB对temp_jp表执行shrink操作

  

   A 在对表执行了move操作之后 索引的状态是不可用的 B在对temp_jp表执行了操作之后 索引的状态是无效的

  

  显示temp_jp表和它的索引的磁盘空间使用情况 A 在进行move操作之后 对表分配了一个区间 对索引分配了两个区间 B 在进行shrink操作之后 表和索引被分配了每个具有 个Oracle块的区间 最初分配给索引的两个区间下降为一个

  

  展开显示temp_jp表Oracle块中的记录 A 在temp_jp表中的所有 条记录被压缩到一个Oracle块中 B 在temp_jp表中的所有 条记录被扩展到 个Oracle块中

  

   AA 表分析操作失败 错误为ORA AB 在表上重新建立索引来使其生效 在索引重建操作之后 一个Oracle区间被分配给了这个索引 AC 在索引重建之后 分析这个表 B 分析这个表

  

  选择temp_jp表的行数和行链接数 A 在对temp_jp表进行move操作之后 行链接被解决了 链接行数为 B 在对temp_jp表进行shrink操作之后 行链接没有解决 链接行数为

  

  检验temp_jp表的索引状态是有效的

  测试A

  move操作怎样影响一个表的Oracle块中行链接和数据的分配

   A

  drop table temp_jp;

   A

  create table temp_jp(col number( ) col varchar ( )) tablespace users;

   A

   declare  begin  for i in loop  insert into temp_jp values(i RAMA );  end loop;  mit;  end;  /

   A

   select dbms_rowid rowid_relative_fno(rowid)   dbms_rowid rowid_block_number(rowid)    count(*)  from temp_jp  group by dbms_rowid rowid_relative_fno(rowid)   dbms_rowid rowid_block_number(rowid)  order by dbms_rowid rowid_relative_fno(rowid)     dbms_rowid rowid_block_number(rowid);DBMS_ROWID ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID ROWID_BLOCK_NUMBER(ROWID)   COUNT(*)                                                                                                                                                                                                                                                                                                                                                                                             rows selected

   A

  create index temp_jp_idx on temp_jp(col ) tablespace users;

   A

   select segment_name segment_type bytes/ / mg blocks extents  from user_segments where segment_name like TEMP% ;SEGMENT_NAME    SEGMENT_TYPE               MG     BLOCKS    EXTENTS                                     TEMP_JP           TABLE                                        TEMP_JP_IDX      INDEX                                        

   A

   alter table temp_jp add(col varchar ( ) default THIS IS TO TEST THE ROW CHAINING ISSUE WITH  MOVE MAND AND HOW THE DATA IS SPREAD BEFORE AND AFTER THE MOVE MAND IN EACH BLOCK OF THE TABLE );

   A

  analyze table temp_jp pute statistics;

   A

   select table_name num_rows chain_cnt from user_tables where table_name= TEMP_JP ;TABLE_NAME                       NUM_ROWS  CHAIN_CNT              TEMP_JP                                          

   A

   select segment_name segment_type bytes/ / mg blocks extents  from user_segments where segment_name like TEMP% ;SEGMENT_NAME    SEGMENT_TYPE               MG     BLOCKS    EXTENTS            TEMP_JP           TABLE                                      TEMP_JP_IDX      INDEX                                      

   A

   declare   begin   for c in (select DBMS_ROWID ROWID_BLOCK_NUMBER(ROWID) block     max(rowid) max_rowid  from temp_jp group by DBMS_ROWID ROWID_BLOCK_NUMBER(ROWID)) loop  for c in (select rowid DBMS_ROWID ROWID_BLOCK_NUMBER(ROWID) block    from temp_jp  where DBMS_ROWID ROWID_BLOCK_NUMBER(ROWID)=c block) loop  if ((c block = c block)  and (c rowid <> c max_rowid)) then delete from temp_jp where rowid = c rowid; end if; end loop; end loop;mit; end;  /

   A

   select dbms_rowid rowid_relative_fno(rowid)       dbms_rowid rowid_block_number(rowid)        count(*)      from temp_jp      group by dbms_rowid rowid_relative_fno(rowid)       dbms_rowid rowid_block_number(rowid)      order by dbms_rowid rowid_relative_fno(rowid)         dbms_rowid rowid_block_number(rowid);DBMS_ROWID ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID ROWID_BLOCK_NUMBER(ROWID)   COUNT(*)                                                                                                                                                                                                                                                                                                                                                                                                      

   A

  analyze table temp_jp pute statistics;

   B

   select table_name num_rows chain_cnt from user_tables where table_name= TEMP_JP ;TABLE_NAME               NUM_ROWS  CHAIN_CNT TEMP_JP                                          

   A

   select index_name status from user_indexes where table_name= TEMP_JP ;INDEX_NAME                     STATUS TEMP_JP_IDX                    VALID

   A

  alter table temp_jp move tablespace users;

   A

   select index_name status from user_indexes where table_name= TEMP_JP ;INDEX_NAME                     STATUS TEMP_JP_IDX                    UNUSABLE

   A

   select segment_name segment_type bytes/ / mg blocks extents     from user_segments where segment_name like TEMP% ;SEGMENT_NAME    SEGMENT_TYPE               MG     BLOCKS    EXTENTS TEMP_JP              TABLE                                   TEMP_JP_IDX     INDEX                                 

   A

   select dbms_rowid rowid_relative_fno(rowid)          dbms_rowid rowid_block_number(rowid)            count(*)          from temp_jp          group by dbms_rowid rowid_relative_fno(rowid)           dbms_rowid rowid_block_number(rowid)          order by dbms_rowid rowid_relative_fno(rowid)             dbms_rowid rowid_block_number(rowid);DBMS_ROWID ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID ROWID_BLOCK_NUMBER(ROWID)   COUNT(*)                                                                              

把什么和什么相比较 Oracle:MOVE与SHRINK命令相比较

   AA

   analyze table temp_jp pute statistics;analyze table temp_jp pute statistics*ERROR at line :ORA : index GZBGQT TEMP_JP_IDX or partition of such index is in unusable state

   AB

  alter index TEMP_JP_IDX rebuild online;

   AC

  analyze table temp_jp pute statistics;

   A

   select table_name num_rows chain_cnt from user_tables where table_name= TEMP_JP ;TABLE_NAME                       NUM_ROWS  CHAIN_CNT TEMP_JP                                          

   A

   select index_name status from user_indexes where table_name= TEMP_JP ;INDEX_NAME                     STATUS TEMP_JP_IDX                    VALID

  测试B

  shrink操作怎样影响一个表的Oracle块中行链接和数据分配

   B

  drop table temp_jp;

   B

  create table temp_jp(col number( ) col varchar ( )) tablespace users;

   B

     declare   begin   for i in   loop   insert into temp_jp values(i RAMA );   end loop;   mit;   end;   /

   B

    select dbms_rowid rowid_relative_fno(rowid)    dbms_rowid rowid_block_number(rowid)     count(*)   from temp_jp   group by dbms_rowid rowid_relative_fno(rowid)  dbms_rowid rowid_block_number(rowid)   order by dbms_rowid rowid_relative_fno(rowid)    dbms_rowid rowid_block_number(rowid);DBMS_ROWID ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID ROWID_BLOCK_NUMBER(ROWID)   COUNT(*)                                                                                                                                                                                                                                                                                                                                                                                                 rows selected

   B

  create index temp_jp_idx on temp_jp(col ) tablespace users;

   B

   select segment_name segment_type bytes/ / mg blocks extents  from user_segments where segment_name like TEMP% ;SEGMENT_NAME    SEGMENT_TYPE               MG     BLOCKS    EXTENTS                           TEMP_JP                    TABLE                                                      TEMP_JP_IDX           INDEX                                                     

   B

   alter table temp_jp add(col varchar ( ) default THIS IS TO TEST THE ROW CHAINING ISSUE WITH  MOVEMAND AND HOW THE DATA IS SPREAD BEFORE AND AFTER THE MOVE MAND IN EACHBLOCK OF THE TABLE );

   B

  analyze table temp_jp pute statistics;

   B

   select table_name num_rows chain_cnt from user_tables where table_name= TEMP_JP ;TABLE_NAME                       NUM_ROWS  CHAIN_CNT             TEMP_JP                                                

   B

   select segment_name segment_type bytes/ / mg blocks extents  from user_segments where segment_name like TEMP% ;SEGMENT_NAME    SEGMENT_TYPE               MG     BLOCKS    EXTENTS                            TEMP_JP         TABLE                                               TEMP_JP_IDX     INDEX                                                              

   B

   declarebeginfor c in (select DBMS_ROWID ROWID_BLOCK_NUMBER(ROWID) block     max(rowid) max_rowid           from temp_jp group by DBMS_ROWID ROWID_BLOCK_NUMBER(ROWID)) loopfor c in (select rowid DBMS_ROWID ROWID_BLOCK_NUMBER(ROWID) block           from temp_jp           where DBMS_ROWID ROWID_BLOCK_NUMBER(ROWID)=c block) loopif ((c block = c block) and (c rowid <> c max_rowid)) thendelete from temp_jp where rowid = c rowid;end if;end loop;end loop;mit;end;/

   B

   select dbms_rowid rowid_relative_fno(rowid)   dbms_rowid rowid_block_number(rowid)    count(*)  from temp_jp  group by dbms_rowid rowid_relative_fno(rowid)  dbms_rowid rowid_block_number(rowid)  order by dbms_rowid rowid_relative_fno(rowid)    dbms_rowid rowid_block_number(rowid);DBMS_ROWID ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID ROWID_BLOCK_NUMBER(ROWID)   COUNT(*)                                                                                                                                                                                                                                                                                                                                                                                                          rows selected

   B

  analyze table temp_jp pute statistics;

   A

   select table_name num_rows chain_cnt from user_tables where table_name= TEMP_JP ;TABLE_NAME                       NUM_ROWS  CHAIN_CNT                       TEMP_JP                                                        

   B

   select index_name status from user_indexes where table_name= TEMP_JP ;INDEX_NAME                     STATUS        TEMP_JP_IDX                    VALID

   BA

  alter table temp_jp enable row movement;

   BB

  alter table temp_jp shrink space cascade;

   B

   select index_name status from user_indexes where table_name= TEMP_JP ;INDEX_NAME                     STATUS        TEMP_JP_IDX                    VALID

   B

   select segment_name segment_type bytes/ / mg blocks extents  from user_segments where segment_name like TEMP% ;SEGMENT_NAME    SEGMENT_TYPE               MG     BLOCKS    EXTENTS                                            TEMP_JP                   TABLE                                                      TEMP_JP_IDX          INDEX                                                     

   B

   select dbms_rowid rowid_relative_fno(rowid)   dbms_rowid rowid_block_number(rowid)    count(*)  from temp_jp  group by dbms_rowid rowid_relative_fno(rowid)   dbms_rowid rowid_block_number(rowid)  order by dbms_rowid rowid_relative_fno(rowid)     dbms_rowid rowid_block_number(rowid);DBMS_ROWID ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID ROWID_BLOCK_NUMBER(ROWID)   COUNT(*)                                                                                                                                                                                                                                            

   B

  analyze table temp_jp pute statistics;

   B

   select table_name num_rows chain_cnt from user_tables where table_name= TEMP_JP ;TABLE_NAME                       NUM_ROWS  CHAIN_CNT                     TEMP_JP                                              

   B

   select index_name status from user_indexes where table_name= TEMP_JP ;INDEX_NAME                     STATUS       TEMP_JP_IDX                    VALID

  在对temp_jp表进行move操作之后 所有的记录被压缩进一个oracle块中 在temp_jp表中的行链接问题被完全解决了

  shrink不能完全解决表中行链接问题 表中留下的 条记录被扩展到这个表的 个oracle块中

lishixinzhi/Article/program/Oracle/201311/17804  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码