シャーディング・キー

シャーディング・キーの選択、制約ルールに関する情報、およびシャーディング・キー更新でのシャード間のデータ移動の有効化に関するヒント。

シャーディング・キーの選択

シャード表パーティションはシャーディング・キーに基づいて表領域レベルでシャード間に分散されます。キーの例として顧客ID、アカウント番号、国IDなどがあります。

シャーディング・キーは、次の特性に従う必要があります。

  • シャーディング・キーが非常に安定していて、その値がほとんど変更されることがない必要があります。

  • シャーディング・キーはすべてのシャード表に存在する必要があります。これにより、シャーディング・キーに基づく等価パーティション表のファミリを作成できます。

  • 表ファミリ内の表の結合は、シャーディング・キーを使用して実行する必要があります。

システム管理シャード・データベースのシャーディング・キー

システム管理のシャーディング方法の場合、シャーディング・キーはカーディナリティが高い列に基づいている必要があります。この列の一意の値の数は、シャードの数より大幅に多い必要があります。たとえば、顧客IDはシャーディング・キーのよい候補ですが、米国の州名は適していません。

シャーディング・キーには、単一列または複数列を指定できます。複数の列が存在する場合、列のハッシュが連結されてシャーディング・キーが形成されます。

次の例では、Customersというシャード表を作成し、列cust_idおよびnameが表のシャーディング・キーを構成するように指定します。

CREATE SHARDED TABLE customers
(cust_id     NUMBER NOT NULL
, name        VARCHAR2(50)
, address     VARCHAR2(250)
, region      VARCHAR2(20)
, class       VARCHAR2(3)
, signup      DATE,
CONSTRAINT cust_pk PRIMARY KEY(cust_id, name))
PARTITION BY CONSISTENT HASH (cust_id,name)
PARTITIONS AUTO
TABLESPACE SET ts1;
CREATE SHARDED TABLE Orders
( OrderNo   NUMBER NOT NULL
, CustNo    NUMBER NOT NULL
, Name      VARCHAR2(50) NOT NULL
, OrderDate DATE
, CONSTRAINT OrderPK PRIMARY KEY (CustNo, Name, OrderNo)
, CONSTRAINT CustFK  FOREIGN KEY (CustNo, Name) REFERENCES Customers(Cust_ID, Name)
)
PARTITION BY REFERENCE (CustFK);

コンポジット・シャード・データベースのシャーディング・キー

コンポジット・シャーディングを使用すると、2つのレベルのシャーディング(リストまたは範囲によるシャーディングとコンシステント・ハッシュによるシャーディング)を行うことができます。これは、2つのキー(スーパー・シャーディング・キーおよびシャーディング・キー)を提供するアプリケーションによって実現されます。

コンポジット・シャーディングは、次に示すように、複数列のLISTパーティション・セットをサポートしていません。

CREATE SHARDED TABLE customers (
cust_id     NUMBER NOT NULL,
Name    VARCHAR2(50) NOT NULL,
class VARCHAR2(3) NOT NULL ,
class2 number not null,
CONSTRAINT cust_pk PRIMARY KEY(cust_id,name,class))
PARTITIONSET BY LIST (class, class2)
PARTITION BY CONSISTENT HASH (cust_id,name)
PARTITIONS AUTO (
PARTITIONSET silver VALUES (('SLV',1),('BRZ',2)) TABLESPACE SET ts1
PARTITIONSET gold   VALUES (('GLD',3),('OTH',4)) TABLESPACE SET ts2);

PARTITION BY CONSISTENT HASH (cust_id,name)
*
ERROR at line 8:
ORA-02514: list PARTITIONSET method expects a single partitioning column

次に示すように、複数列のRANGEパーティション・セットがサポートされています。


CREATE SHARDED TABLE customers (
cust_id     NUMBER NOT NULL,
Name    VARCHAR2(50) NOT NULL,
class number NOT NULL ,
class2 number not null,
CONSTRAINT cust_pk PRIMARY KEY(cust_id,name,class))
PARTITIONSET BY RANGE (class, class2)
PARTITION BY CONSISTENT HASH (cust_id,name)
PARTITIONS AUTO (
PARTITIONSET silver VALUES LESS THAN (10,100) TABLESPACE SET ts1,
PARTITIONSET gold   VALUES LESS THAN (20,200) TABLESPACE SET ts2);

Table created.

前述のいずれの場合も、シャーディング・キー(パーティション・セット・キーではありません)は複数列にできます。

ユーザー定義シャード・データベースのシャーディング・キー

ユーザー定義シャーディングのリストによるパーティション化の場合、Oracle Globally Distributed Databaseは単一のシャーディング・キー列を想定しています。リスト・パーティション化されたシャード表に複数の列が指定されている場合、エラーがスローされます。

CREATE SHARDED TABLE accounts
( id             NUMBER
, account_number NUMBER
, customer_id    NUMBER
, branch_id      NUMBER
, state          VARCHAR(2) NOT NULL
, state2         VARCHAR(2) NOT NULL
, status         VARCHAR2(1)
)
PARTITION BY LIST (state,state2)
( PARTITION p_northwest VALUES ('OR', 'WA') TABLESPACE ts1
, PARTITION p_southwest VALUES ('AZ', 'UT', 'NM') TABLESPACE ts2
, PARTITION p_northcentral VALUES ('SD', 'WI') TABLESPACE ts3
, PARTITION p_southcentral VALUES ('OK', 'TX') TABLESPACE ts4
, PARTITION p_northeast VALUES ('NY', 'VM', 'NJ') TABLESPACE ts5
, PARTITION p_southeast VALUES ('FL', 'GA') TABLESPACE ts6
);

ERROR at line 1:
ORA-03813: list partition method expects a single partitioning column in
user-defined sharding

レンジ・パーティション化されたシャード表の場合、シャーディング・キー列として複数の列を指定できます。


CREATE SHARDED TABLE accounts
( id             NUMBER
, account_number NUMBER
, customer_id    NUMBER
, branch_id      NUMBER
, state          NUMBER NOT NULL
, state2         NUMBER NOT NULL
, status         VARCHAR2(1)
)
PARTITION BY RANGE (state, state2)
( PARTITION p_northwest VALUES LESS THAN(10, 100) TABLESPACE ts1
, PARTITION p_southwest VALUES LESS THAN(20,200) TABLESPACE ts2);

Table created.

ただし、どちらの場合も、シャーディング・キー(パーティションセット・キーではありません)は複数列にできます。

シャーディング・キー・タイプのサポート

シャーディング・キーでは次のデータ型がサポートされています。

  • NUMBER

  • INTEGER

  • SMALLINT

  • RAW

  • (N)VARCHAR

  • (N)VARCHAR2

  • (N)CHAR

  • DATE

  • TIMESTAMP

主キーおよび外部キーの制限事項

Oracle Globally Distributed Database環境では、主キーの制約および外部キーの制約は次のルールによって制御されます。

  • 主キーの場合、シャード表に一意制約および一意索引があり、列リストにシャーディング・キー列が含まれている必要があります。以前のOracleリリースでは、シャーディング・キーはこのような列の接頭辞である必要がありましたが、このルールはより緩和されました。

  • あるシャード表から別のシャード表への外部キーにもシャーディング・キーが含まれている必要があります。外部キーは参照表の主キーまたは一意の列を参照するため、これは自動的に強制されます。

  • シャード表の外部キーは、同じ表ファミリ内にある必要があります。異なる表ファミリには異なるシャーディング・キー列があるため、これは必須です。

  • ローカル表を参照するシャード表の外部キーは許可されていません。

  • 重複表を参照するシャード表の外部キーは許可されていません。

  • シャード表を参照する重複表の外部キーは許可されていません。

シャーディング・キー更新での自動データ移動の有効化

通常のSQL UPDATE文を使用して、データが配置されているシャードで特定のレコードのシャーディング・キーを直接更新できます。Oracle Globally Distributed Databaseは、バックグラウンドで分散トランザクションとして、データを正しいシャードに自動的に移動します。

ノート:

シャーディング・キーを更新する前に、前の作業をコミットして新しいトランザクションを開始することをお薦めします。これは、リモート・マシンまたはネットワーク障害の場合、分散トランザクションはローカル・トランザクションよりもリスクが高いためです。競合状態を回避するために、更新される行は挿入/削除操作を開始する前にロックされます。

ユースケース

特定のレコードのシャーディング・キー値を更新する必要がある場合があります。たとえば、従業員の場所が、シャーディング・キーの1つである場合があります。従業員が1つの国から別の国に移動する場合は、その国の値を更新する必要があります。その場合は、データを新しいキー値にマップされたシャードに移動する必要があります。

シャーディング・キーを更新するとどうなりますか。

シャード表でレコードのシャーディング・キー値が更新されると、新しい値のマップ先となるシャードに応じて、レコードの更新後に可能な3つの場所になる可能性があります。

1. 行は同じパーティション内に残ります。

2. 行は同じシャード内の別のパーティションに移動されます。

3. 行は別のシャードに移動されます。

シャード表の特定の行のシャーディング・キー値が更新されると、Oracle Globally Distributed Databaseでは、同じシャード上の別のパーティションにあるか、別のシャード上にあるかにかかわらず、新しい場所へのデータの移動が処理されます。

シャード表ファミリのサポート

表ファミリは、データベース表間の親子関係です。このような関係でリンクされている複数の表は、通常はツリーのような階層になり、各子が1つの親を持ちます。表ファミリは、参照パーティション化またはPARENT句を使用して定義できます。

PARENT句を使用して作成された表ファミリでの自動行移動をサポートするには、親表と子表の間に主キーと外部キー制約を追加する必要があります。

参照パーティション化を使用して作成された表ファミリでは、親表と子表の間の主キーと外部キー制約がすでに存在するため、行の自動移動がサポートされ、追加のステップは必要ありません。

自動データ移動の有効化と無効化

この操作では、データベースのシャード表に対してROW MOVEMENT句を使用します。

ALTER TABLE tablename ENABLE ROW MOVEMENT;

ALTER TABLE tablename DISABLE ROW MOVEMENT;

ROW MOVEMENTは、CREATE TABLEでも指定できます。

ROW MOVEMENTを有効にし、シャーディング・キーの値の更新がある場合、データはシャード間で透過的に移動します。

ROW MOVEMENT句の詳細は、row_movement_clauseに関する項(『Oracle Database SQL言語リファレンス』)を参照してください。

表ファミリでの自動データ移動の有効化

表ファミリの場合、ROW MOVEMENTは、最初に子表、次に親表で有効化する必要があります。

次の例では、accountsがルート表、ordersaccountsの子、lineitemsordersの子です。

ALTER TABLE lineitems ENABLE ROW MOVEMENT;

ALTER TABLE orders ENABLE ROW MOVEMENT;

ALTER TABLE accounts ENABLE ROW MOVEMENT;