12.4 パーティション表内のLOB

パーティション化により、ラージ・データベース・オブジェクトの管理性を簡略化できます。この項では、パーティション表のLOBの様々な側面について説明します。

非常に大きな表および索引は、アプリケーションに対して完全に透過的なパーティションと呼ばれる、小規模で管理しやすい部分に分解できます。LOB列を含む表をパーティション化できます。サポートされているすべてのパーティション化スキームは、LOBで完全にサポートされます。

次のように、パーティション化のすべてのメリットをLOBでも利用できます。

  • LOBセグメントをいくつかの表領域に分散して、I/O負荷を均衡化させ、バックアップおよびリカバリの管理をより簡単にできます。
  • パーティション表内のLOBがメンテナンスしやすくなります。
  • LOBを論理グループにパーティション化し、グループとしてアクセスされるLOBの操作を高速化できます。

次の項では、パーティション表内のLOBの操作方法をいくつか説明します。

12.4.1 LOB列を含む表のパーティション化

サポートされているすべてのパーティション化スキームは、LOBで完全にサポートされます。この項では、LOB列を含む表のパーティション化について説明します。

LOB列を含む表は、次のいずれかの方法でパーティション化できます。

  • CREATE TABLE文のPARTITION BY ...句を使用して表を作成します。
  • ALTER TABLE ...ADD PARTITION句を使用して既存の表にパーティションを追加します。

データ・ディクショナリ・ビューUSER_LOB_PARTITIONSALL_LOB_PARTITIONSおよびDBA_LOB_PARTITIONSは、LOB列のパーティション固有の情報を提供します。

パーティションごとに、異なるインライン・サイズに設定できます。これは、新しい表を既存の表のパーティションにEXCHANGEする場合に便利です。パーティション・レベルのインライン・サイズを指定しない場合、その列の表レベルのデフォルトが使用されます。コンポジット・パーティション化の場合、サブパーティションレベルのインライン・サイズがパーティションレベルのインライン・サイズ(これは表レベルのインライン・サイズより優先される)より優先されます。新しいパーティションの作成中に、インライン・サイズの値が指定されていない場合は表レベルのデフォルトが使用されます。インライン・サイズの値がNULLになることはありません。

例12-15 LOB列があるパーティション表:

CREATE TABLE print_media
    ( product_id        NUMBER(6),
      ad_id             NUMBER(6),
      ad_sourcetext     CLOB)
    LOB (ad_sourcetext)  STORE AS SECUREFILE (TABLESPACE tbs_2)
    PARTITION BY RANGE(product_id)
    (PARTITION P1 VALUES LESS THAN (1000)
         LOB (ad_sourcetext) STORE AS BASICFILE (TABLESPACE tbs_1),
     PARTITION P2 VALUES LESS THAN (2000)
         LOB (ad_sourcetext) STORE AS (TABLESPACE tbs_2 COMPRESS HIGH),
     PARTITION P3 VALUES LESS THAN (3000));

例12-16 インライン・サイズが異なる複数のLOB列を含むパーティション表

CREATE TABLE print_media
    ( product_id        NUMBER(6),
      ad_content        BLOB,
      ad_sourcetext     CLOB)
      LOB (ad_content) STORE AS SECUREFILE (ENABLE STORAGE IN ROW)
      LOB (ad_sourcetext) STORE AS SECUREFILE (ENABLE STORAGE IN ROW 8000) TABLESPACE tbs_1
    PARTITION BY RANGE(product_id)
    (PARTITION P1 VALUES LESS THAN (1000)
        LOB (ad_sourcetext) STORE AS SECUREFILE (ENABLE STORAGE IN ROW 4000),
    PARTITION P2 VALUES LESS THAN (2000)
        LOB (ad_sourcetext) STORE AS (ENABLE STORAGE IN ROW 8000 COMPRESS HIGH),
    PARTITION P3 VALUES LESS THAN (3000)
        LOB (ad_content) STORE AS (DISABLE STORAGE IN ROW));

12.4.2 デフォルトのLOB記憶域属性

この項では、デフォルトのLOB記憶域属性について説明します。

前述の例では、LOB列ad_sourcetextのデフォルト記憶域属性はSTORE AS SECUREFILE (TABLESPACE tbs_2)と示されています。つまり、どのパーティションにもLOB記憶域句が指定されていない場合は、このデフォルトが使用されます。この例では、LOB記憶域が指定されていないため、パーティションP3は表領域tbs_2を使用します。同様に、SECUREFILEはデフォルトの記憶域であり、パーティションP2およびP3で使用されますが、パーティションP1はこれをオーバーライドしてBasicFile記憶域を指定します。

ディクショナリ・ビューUSER_PART_LOBSALL_PART_LOBSおよびDBA_PART_LOBSは、表のLOB列のデフォルトのLOB記憶域オプションに関する情報を提供します。

次の例に示すように、表レベルのデフォルトのLOB記憶域属性を変更できます。

ALTER TABLE print_media MODIFY DEFAULT ATTRIBUTES  LOB (ad_sourcetext)  
    (TABLESPACE  tbs_1);

デフォルト属性を変更しても、既存のパーティションには影響しません。LOB STORAGE句なしで作成された新しいパーティションは、その列のデフォルト値を継承します。

12.4.3 パーティションのメンテナンス操作

この項では、LOB列を含むパーティション表に対するメンテナンス操作について説明します。

LOB列では、すべてのパーティション化メンテナンス操作がサポートされます。いくつか例を挙げます。

例12-17 LOBを含むパーティションの追加

ALTER TABLE print_media ADD PARTITION P4 VALUES LESS THAN (4000)
         LOB (ad_sourcetext) STORE AS SECUREFILE(TABLESPACE tbs_2);

例12-18 LOBを含むパーティションの変更

ALTER TABLE print_media MODIFY PARTITION P3 LOB(ad_sourcetext)
     (RETENTION AUTO);

例12-19 LOBを含むパーティションの移動

ALTER TABLE print_media MOVE PARTITION P1 LOB(ad_sourcetext)  
    STORE AS (TABLESPACE tbs_3 COMPRESS LOW);

前述の例では、LOBパーティションを別の表領域に移動します。これは、表領域がパーティションを保持するのに十分な大きさでなくなった場合に役立ちます。パーティションの移動は、LOBでのCOMPRESS操作の実行やENABLE / DISABLE STORAGE IN ROWオプションの変更など、LOBデータの移動を必要とする他の操作の実行にも使用できます。

例12-20 LOBを含むパーティションの分割

ALTER TABLE ... SPLIT PARTITION句を使用すると、LOBを含むパーティションを2つに分割できます。これにより、一方または両方の新規パーティションを新規の表領域に配置できます。たとえば:

ALTER TABLE print_media SPLIT PARTITION  P1 AT(500) into
(PARTITION P1A LOB(ad_sourcetext) STORE AS (TABLESPACE tbs_1),
PARTITION P1B LOB(ad_sourcetext) STORE AS (TABLESPACE tbs_2)) UPDATE INDEXES;

例12-21 LOBを含むパーティションのマージ

パーティションのマージは、未使用のパーティション領域を再利用する場合に役立ちます。たとえば:

ALTER TABLE print_media MERGE PARTITIONS P1A, P1B INTO PARTITION P1;

例12-22 LOB列を含むパーティションと非パーティション表との交換

ALTER TABLE ...EXCHANGE PARTITION句を使用して、パーティション化されたLOB列を含む表とパーティションを交換します。パーティションの交換は、コストのかかる古いデータの移行操作を行わずに、新しいデータ/パーティションを新しい記憶域形式に変更する強力な手段です。異なる記憶域オプションを持つLOBデータとパーティションを交換できます。たとえば、例11-15のBasicFileデータのパーティションp1は、SecureFiles圧縮形式で格納されたLOB列を持つパーティション化されていない表と交換できます。

CREATE TABLE print_media_nonpart
    ( product_id NUMBER(6),
      ad_id NUMBER(6),
      ad_sourcetext CLOB)
      LOB (ad_sourcetext) STORE AS SECUREFILE (COMPRESS HIGH);

ALTER TABLE print_media  EXCHANGE PARTITION p1 WITH TABLE print_media_nonpart;

12.4.4 パーティション化されたLOB列を含む表に対する索引の作成

問合せのパフォーマンスを改善するために、パーティション化されたLOB列に対してローカル索引またはグローバル索引を作成できます。

LOB列では、ファンクション索引およびドメイン索引のみがサポートされます。一意索引など、他のタイプの索引はLOBでサポートされません。

たとえば:

CREATE INDEX ad_sourcetext_idx_sql on print_media (to_char(substr(ad_sourcetext,1,10)))
      GLOBAL;
CREATE INDEX ad_sourcetext_idx_sql on print_media (to_char(substr(ad_sourcetext,1,10)))
      LOCAL;