ディレクトリによってシャードされた表の作成

CREATE SHARDED TABLE文でPARTITION BY DIRECTORYを使用して、ディレクトリベースのシャード表を作成します。

たとえば:

CREATE SHARDED TABLE customers
( id             NUMBER NOT NULL
, name           VARCHAR2(30)
, address        VARCHAR2(30)
, status         VARCHAR2(1)
,
CONSTRAINT cust_pk PRIMARY KEY(id)
)
PARTITION BY DIRECTORY (id)
( PARTITION p1 TABLESPACE tbs1,
  PARTITION p2 TABLESPACE tbs2,
  PARTITION p3 TABLESPACE tbs3…)
DIRECTORY TABLESPACE tablespace-name //This clause is valid only for root table creation
;

ノート:

  • DIRECTORY TABLESPACE句は、パーティション定義の後にのみ使用でき、ディレクトリベースのシャード表のルート表の作成にのみ有効です。

    この句を使用すると、デフォルトの表領域を使用せずに、ディレクトリ表専用の表領域を別に作成できます。

  • ルート表に作成されたビュー名に追加された追加文字を考慮するため、ルート表名の最大長(識別子の長さ制限)は113です(root_table_name_$SHARD_DIR_VIEWを参照)。

  • ディレクトリ表は、ルート表の作成時に自動的に作成されます。ディレクトリ表の定義は次のとおりです。

    <shard user schema>.<root_table>$SDIR

  • ユーザー定義のデータ分散とは異なり、CREATE TABLE文のパーティションにキー値は指定されません。

  • ルート表とは異なるスキーマで親句を使用して子表を作成する場合は、子表のスキーマ所有者に追加権限が必要です。(これはディレクトリベースのデータ分散専用であり、通常のユーザー定義のデータ分散には必要ありません。)

    これは、ディレクトリ表のシャーディング・キー列に対して子表に外部キー制約が存在し、ディレクトリ・マッピングにシャーディング・キー値が存在せずに子表に行を挿入できないようにするためです。その結果、子表のスキーマには、ディレクトリ表のシャーディング・キー列に対する参照権限が必要です。

    後述の「参照の付与」を参照してください。

参照の付与

この例を次の図に示します。

  • ルート表dealershipsはスキーマuser1の下にあり、シャーディング・キーとしてaccount_idがあります。

  • 子表salespeopleはスキーマuser2の下にあり、「parent user1.dealerships」で定義されます。

このsalespeople子表を作成する前に、次のものが必要です。

  • grant all privileges on user1.dealerships to user2;

    これは、ユーザー定義のデータ分散に必要なものと同じです。

  • grant references (account_id) on user1.dealerships$sdir to user2;

    これは、ディレクトリベースのデータ分散には新しいものです。

dealerships$sdirは内部で生成されたディレクトリ表名であり、root_table_name$sdirの形式であることに注意してください。

2番目の付与がない場合、子表作成DDLはシャード・カタログで成功しますが、シャードで失敗します(外部キーはシャードにのみ追加されるため)。