sql >> データベース >  >> RDS >> Oracle

Oracle 11gで、パーティション表をある表領域から別の表領域に移動するにはどうすればよいですか。

    無効になる可能性のあるインデックスも考慮する必要があります。これに加えて、デフォルトのテーブルスペースのリセットに関する質問をカバーするために、これが実装する必要のある完全なプロセスだと思います。

    1)パーティションを移動します(zürigschnäzletsの回答によるPL / SQLループ)

    これらは、a_tname、a_destTS、vTname、およびvTspNameを定義する匿名ブロックラッパー内で使用するプロシージャです。これらは、一般的なアイデアを提供するはずです。

    procedure mvTabPart (a_tname in varchar2, a_destTS in varchar2) is
    cursor pCur(vTname varchar2, vTspName varchar2) is
      select table_name, partition_name
      from user_tab_partitions
      where table_name = vTname
          and tablespace_name not like vTspName
      order by partition_position desc;
    begin
    for pRow in pCur(a_tname, a_destTS) loop
     sqlStmnt := 'alter table '||pRow.table_name||
                 ' move partition '||pRow.partition_name||
                 ' tablespace '||a_destTS;
    execute immediate sqlStmnt;
    end loop;
    end mvTabPart;
    

    2)テーブルのデフォルトパーティションテーブルスペースを設定して、そこに新しいパーティションが作成されるようにします。

        procedure setDefTabPart (a_tname in varchar2, a_destTS in varchar2) is
        cursor tCur(vTname varchar2) is
          select table_name
          from user_part_tables
          where table_name = vTname;
        begin
        for tRow in tCur(a_tname) loop
         sqlStmnt := 'alter table '||tRow.table_name||
                     ' modify default attributes '||
                     ' tablespace '||a_destTS;
        execute immediate sqlStmnt;
        end loop;
    end setDefNdxPart;
    

    3)インデックスのデフォルトパーティションテーブルスペースを設定して、新しいインデックスパーティション(存在する場合)が必要な場所に作成されるようにします。

    procedure setDefNdxPart (a_tname in varchar2, a_destTS in varchar2) is
    cursor iCur(vTname varchar2) is
      select index_name
      from user_part_indexes
      where index_name in (select index_name
                 from user_indexes where table_name = vTname);
    begin
    for iRow in iCur(a_tname) loop
     sqlStmnt := 'alter index '||iRow.index_name||
                 ' modify default attributes '||
                 ' tablespace '||a_destTS;
    execute immediate sqlStmnt;
    end loop;
    
    end setDefNdxPart;
    

    4)再構築が必要で、目的のテーブルスペースにないパーティションインデックスを再構築します。

    procedure mvNdxPart (a_tname in varchar2, a_destTS in varchar2) is
    cursor ndxCur(vTname varchar2, vTspName varchar2) is
    select i.index_name index_name, ip.partition_name partition_name
      from user_ind_partitions ip, user_indexes i
      where i.index_name = ip.index_name
         and i.table_name = vTname
         and i.partitioned = 'YES'
         and (ip.tablespace_name not like vTspName or ip.status not like 'USABLE')
      order by index_name, partition_name ;
    begin
    for ndxRow in ndxCur(a_tname, a_destTS) loop
     sqlStmnt := 'alter index '||ndxRow.index_name||
                 ' rebuild partition '||ndxRow.partition_name||
                 ' tablespace '||a_destTS;
    execute immediate sqlStmnt ;
    end loop;
    end mvNdxPart;
    

    5)グローバルインデックスを再構築します

    procedure mvNdx (a_tname in varchar2, a_destTS in varchar2) is
    cursor ndxCur(vTname varchar2, vTspName varchar2) is
      select index_name
      from user_indexes
      where table_name = vTname
           and partitioned = 'NO'
           and (tablespace_name not like vTspName or status like 'UNUSABLE')
      order by index_name ;
    begin
    for ndxRow in ndxCur(a_tname, a_destTS) loop
     sqlStmnt := 'alter index '||ndxRow.index_name||
                 ' rebuild tablespace '||a_destTS;
    execute immediate sqlStmnt ;
    end loop;
    end mvNdx;
    


    1. インスタンスをBluemix上のアプリケーションにバインドせずに、IBM Bluemixで作成されたサービス・インスタンスのサービス・クレデンシャルを取得するにはどうすればよいですか?

    2. MYSQL内部2つのキーを介して2つのテーブルを結合します

    3. カーソル内でレコード型を呼び出すことはできますか?

    4. 別のSELECTの値に基づいてSELECTする方法