Oracle 分区表的索引重建?

Oracle 分区表的索引重建?,oracle,partitioning,Oracle,Partitioning,朋友们…我正在尝试调试一个过程来移动和重建分区表的索引 我试着做到以下几点: 将分区表移动到新表空间 重建1个分区表的索引 对于2,我使用dba\u ind\u分区,但由于它没有表名称、表所有者,所以很难过滤掉 PROCEDURE moveParTbl (OldTbs in varchar2, NewTbs in varchar2) AUTHID CURRENT USER IS CURSOR curTable IS SELECT table_owner, table_name

朋友们…我正在尝试调试一个过程来移动和重建分区表的索引

我试着做到以下几点:

将分区表移动到新表空间 重建1个分区表的索引 对于2,我使用dba\u ind\u分区,但由于它没有表名称、表所有者,所以很难过滤掉

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-a3索引在每次分区表移动后得到重建,而不是在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

您的表中可能有重复的分区名称oracle不会对此抱怨,因为完整的段名称由[object\u name]\u[partition\u name]组成。如果只想获取与特定表分区相关的索引分区,则需要将表名称和表所有者上的dba\U表和dba\U索引以及索引名称和索引所有者上的dba\U ind\U分区连接起来。您的游标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';

当然,您还需要将所有者和表名(而不仅仅是分区名)输入其中。

移动表分区后,您将重建每个索引分区。对我来说这似乎是正确的。是不是以某种方式多次重建同一索引分区?@DanielStolf,问题在于分区名称如何馈送到curIndex的逻辑。我试图避免在每次表移动后重建相同的分区名称索引,并将其限制为仅重建表名称、表所有者、,partition_name.那么,您只是想知道如何识别与特定表相关的索引的分区-您想知道如何将dba_ind_分区连接到另一个具有该表的视图吗?@AlexPoole,我只是想重建被curTable游标移动的分区表的索引。因为我不能将表的所有者和表的名称传递给dba\U ind\U分区,所以这有点复杂。您需要连接dba\U表、dba\U索引和dba\U ind\U分区。试着这样做:游标curIndex lTabNam在varchar2中,varchar2中的lParNam是select i.index\u name,dba\u tables中的ip.partition\u name t join dba\u index i在t.table\u name=i.table\u name=i.index\u name=ip.index\u name,其中t.table\u name=lTabNam和ip.partition\u name=lParNam;这就是诀窍。。。这确实需要一些复杂的连接。我输入了表的所有者、表的名称和分区的名称,看起来很好。。。需要彻底测试。。。