分区表的索引重建?

时间:2014-08-19 17:39:52

标签: oracle partitioning

朋友们......我试图调试程序来移动和重建分区表的索引。

我试图在下面做:

  1. 将分区表移至新表空间
  2. 重建#1分区表的索引
  3. 对于#2我使用dba_ind_partitions但由于它没有table_name,因此table_owner很难过滤掉。

    PROCEDURE moveParTbl (OldTbs in varchar2, NewTbs in varchar2)
        AUTHID CURRENT USER
    IS
      CURSOR curTable IS
        SELECT table_owner, table_name, partition_name, tablespace_name
          FROM dba_tab_partition
          WHERE tablespace_name = OldTbs
          ORDER BY TABLE_NAME;
    
      CURSOR curIndex (lParNam IN varchar2)
    IS
      SELECT index_owner, index_name, partition_name, tablespace_name
      FROM dba_ind_partitions
      WHERE partition_name = lParNam;
    
    
    BEGIN
      FOR rec1 IN curTable LOOP
    
        EXECUTE IMMEDIATE 'alter table ' || rec1.table_owner || '.' || rec1.table_name ||
                          ' move partition ' || rec1.partition_name || ' tablespace ' ||NewTbs;
    
       -- Starting curIndex
      FOR rec2 IN curIndex (rec1.partition_name) LOOP
        EXECUTE IMMEDIATE 'rebuild index ' || rec2.index_owner || '.' || rec2.index_name ||
                          ' rebuild partition ' || rec2.partition_name || ' tablespace ' ||NewTbs || ' online';
    
          END LOOP; -- index cursor loop
          END LOOP;  --curTable for loop
    END moveParTbl;
    

    错误是什么:

    1 Table: Tab-A, Tab-B, Tab-C
    2. Index: Tab-A (Ind1, Ind2, Ind3)
    

    Tab-A 3个索引在每个分区表移动后重建,而不是在Tab-A移动后重建一次。

    * 以下是错误的

    Move Tab-A
    Rebuild ind1, ind2, ind3
    Move TAb-B
    Rebuild ind1, ind2, ind3
    Move Tab-C
    Rebuld ind1, ind2, ind3
    

    * 应该如何

    Move Tab-A
    Rebuild ind1, ind2, ind3
    Move TAb-B
    Move Tab-C
    

1 个答案:

答案 0 :(得分:3)

您可能在表中重复了分区名称(oracle不会抱怨这一点,因为完整的segment_name由[object_name]_[partition_name]组成)。您需要加入dba_tablesdba_indexes(位于table_nametable_owner)和dba_ind_partitions(位于index_nameindex_owner),如果您希望仅获取与该特定表分区相关的索引分区。您的光标curIndex应如下所示:

          CURSOR curIndex (lTabOwn IN varchar2, lTabNam IN varchar2, lParNam IN varchar2)
          IS
            select i.index_owner, i.index_name, ip.partition_name from 
                dba_tables t join dba_indexes i 
            on t.table_name=i.table_name and t.owner=i.table_owner
                join dba_ind_partitions ip on i.index_name=ip.index_name and 
                     i.owner=ip.index_owner
            where t.table_name=lTabNam and ip.partition_name=lParNam and 
            and t.owner=lTabOwn and status<>'USABLE';

当然,您还需要将owner和table_name提供给它,而不仅仅是partition_name。