4.6 パーティション表への非パーティション表の変更

非パーティション表をパーティション表に変更できます。

次の内容について説明します。

関連項目:

表のパーティションの再定義の詳細は、『Oracle Database管理者ガイド』を参照してください

4.6.1 オンライン再定義を使用したコレクション表のパーティション化

Oracle Databaseは、1つ以上のパーティションを移動したり、DMLに対するパーティションの可用性にそれほど影響することなくパーティションの物理構造への他の変更を行うメカニズムを提供します。このメカニズムはオンライン表再編成と呼ばれます。

オンライン再定義を使用すると、非パーティション・コレクション表をパーティション・コレクション表にコピーできます。Oracle Databaseによって、コレクション表の該当するパーティションに行が挿入されます。例4-35は、Objects列内のネスト表でこの処理がどのように行われるかを示します。同様の例は、XMLType表または列内のOrdered Collection Type Tablesにも対応します。新たに定義するコレクション表で索引と制約を維持する場合は、copy_table_dependentsの操作で、索引と制約をコピーするために0またはfalseを指定します。ただし、コレクション表とそのパーティションの名前は、暫定表(例4-35print_media2)のものと同じです。コレクション表の名前を維持するために明示的なステップを実行する必要があります。

例4-35 コレクション表のパーティションの再定義

CONNECT / AS SYSDBA
DROP USER eqnt CASCADE;
CREATE USER eqnt IDENTIFIED BY eqnt;
GRANT CONNECT, RESOURCE TO eqnt;
 
-- Grant privleges required for online redefinition.
GRANT EXECUTE ON DBMS_REDEFINITION TO eqnt;
GRANT ALTER ANY TABLE TO eqnt;
GRANT DROP ANY TABLE TO eqnt;
GRANT LOCK ANY TABLE TO eqnt;
GRANT CREATE ANY TABLE TO eqnt;
GRANT SELECT ANY TABLE TO eqnt;
 
-- Privileges required to perform cloning of dependent objects.
GRANT CREATE ANY TRIGGER TO eqnt;
GRANT CREATE ANY INDEX TO eqnt;
 
CONNECT eqnt/eqnt
 
CREATE TYPE textdoc_typ AS OBJECT ( document_typ VARCHAR2(32));
/
CREATE TYPE textdoc_tab AS TABLE OF textdoc_typ;
/

-- (old) non partitioned nested table
CREATE TABLE print_media
    ( product_id        NUMBER(6) primary key
    , ad_textdocs_ntab  textdoc_tab
    )
NESTED TABLE ad_textdocs_ntab STORE AS equi_nestedtab
(   (document_typ NOT NULL)
    STORAGE (INITIAL 8M)
)
;
 
-- Insert into base table
INSERT INTO print_media VALUES (1,
   textdoc_tab(textdoc_typ('xx'), textdoc_typ('yy')));
INSERT INTO print_media VALUES (11,
   textdoc_tab(textdoc_typ('aa'), textdoc_typ('bb')));
COMMIT;
 
-- Insert into nested table
INSERT INTO TABLE
  (SELECT p.ad_textdocs_ntab FROM print_media p WHERE p.product_id = 11)
   VALUES ('cc');
 
SELECT * FROM print_media;

PRODUCT_ID   AD_TEXTDOCS_NTAB(DOCUMENT_TYP)
----------   ------------------------------
         1   TEXTDOC_TAB(TEXTDOC_TYP('xx'), TEXTDOC_TYP('yy'))
        11   TEXTDOC_TAB(TEXTDOC_TYP('aa'), TEXTDOC_TYP('bb'), TEXTDOC_TYP('cc'))
 
-- Creating partitioned Interim Table
CREATE TABLE print_media2
    ( product_id        NUMBER(6)
    , ad_textdocs_ntab  textdoc_tab
    )
NESTED TABLE ad_textdocs_ntab STORE AS equi_nestedtab2
(   (document_typ NOT NULL)
    STORAGE (INITIAL 8M)
)
PARTITION BY RANGE (product_id)
(
    PARTITION P1 VALUES LESS THAN (10),
    PARTITION P2 VALUES LESS THAN (20)
);
 
EXEC dbms_redefinition.start_redef_table('eqnt', 'print_media', 'print_media2');
 
DECLARE
 error_count pls_integer := 0;
BEGIN
  dbms_redefinition.copy_table_dependents('eqnt', 'print_media', 'print_media2',
                                          0, true, false, true, false,
                                          error_count);
 
  dbms_output.put_line('errors := ' || to_char(error_count));
END;
/
 
EXEC  dbms_redefinition.finish_redef_table('eqnt', 'print_media', 'print_media2');
 
-- Drop the interim table
DROP TABLE print_media2;
 
-- print_media has partitioned nested table here

SELECT * FROM print_media PARTITION (p1);

PRODUCT_ID   AD_TEXTDOCS_NTAB(DOCUMENT_TYP)
----------   ------------------------------
         1   TEXTDOC_TAB(TEXTDOC_TYP('xx'), TEXTDOC_TYP('yy'))

SELECT * FROM print_media PARTITION (p2);

PRODUCT_ID   AD_TEXTDOCS_NTAB(DOCUMENT_TYP)
----------   ------------------------------
        11   TEXTDOC_TAB(TEXTDOC_TYP('aa'), TEXTDOC_TYP('bb'), TEXTDOC_TYP('cc'))

4.6.2 パーティション表への非パーティション表の変換

非パーティション表をパーティション表に変換するには、ALTER TABLE SQL文にMODIFY句を追加します。

また、キーワードONLINEを指定すると、変換が進行中の同時DML操作が可能になります。

次に、パーティション表へのオンライン変換にONLINEキーワードを使用するALTER TABLE文の例を示します。

例4-36 パーティション表へのオンライン変換にALTER TABLEのMODIFY句を使用する方法

ALTER TABLE employees_convert MODIFY
  PARTITION BY RANGE (employee_id) INTERVAL (100)
  ( PARTITION P1 VALUES LESS THAN (100),
    PARTITION P2 VALUES LESS THAN (500)
   ) ONLINE
  UPDATE INDEXES
 ( IDX1_SALARY LOCAL,
   IDX2_EMP_ID GLOBAL PARTITION BY RANGE (employee_id)
  ( PARTITION IP1 VALUES LESS THAN (MAXVALUE))
 );

UPDATE INDEXES句を使用する際の考慮事項

UPDATE INDEXES句を使用する際は、次のことに注意してください。

  • この句を使用して、索引のパーティション化状態および変換される索引の記憶域プロパティを変更できます。

  • UPDATE INDEXES句の指定はオプションです。

    索引は、パーティション表へのオンライン変換とオフライン変換の両方でメンテナンスされます。

  • この句は、索引の元のリストが定義されている列を変更できません。

  • この句は、索引の一意性プロパティまたは他の索引プロパティを変更できません。

  • いずれかの索引の表領域を指定しない場合は、次の表領域のデフォルトが適用されます。

    • 変換後のローカル索引が表パーティションと連結します。

    • 変換後のグローバル索引が、非パーティション表の元のグローバル索引の同じ表領域に存在します。

  • INDEXES句を指定しないか、INDEXES句が元の非パーティション表のすべての索引を指定しない場合、次のデフォルトの動作がすべての未指定の索引に適用されます。

    • グローバル・パーティション索引は同じまま、元のパーティション形状が保持されます。

    • 非同一キー索引が、グローバル非パーティション索引になります。

    • 同一キー索引はローカル・パーティション索引に変換されます。

      同一キーとは、パーティション・キー列が索引定義に含まれていることを意味しますが、索引定義は、パーティション化キーのみを含めることに限定されません。

    • ビットマップ索引は、同一キーかどうかに関係なく、ローカル・パーティション索引になります。

      ビットマップ索引は、常にローカル・パーティション索引である必要があります。

  • 変換操作は、ドメイン索引がある場合は実行できません。