シャーディング・キー
シャーディング・キーの選択、制約ルールに関する情報、およびシャーディング・キー更新でのシャード間のデータ移動の有効化に関するヒント。
シャーディング・キーの選択
シャード表パーティションはシャーディング・キーに基づいて表領域レベルでシャード間に分散されます。キーの例として顧客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
がルート表、orders
がaccounts
の子、lineitems
がorders
の子です。
ALTER TABLE lineitems ENABLE ROW MOVEMENT;
ALTER TABLE orders ENABLE ROW MOVEMENT;
ALTER TABLE accounts ENABLE ROW MOVEMENT;