スキーマ・オブジェクト
Oracle Globally Distributed Databaseの利点を活用するには、1つのシャードで処理されるデータベース・リクエストの数が最大になるように、分散データベースのスキーマを設計する必要があります。
パーティション、表領域およびチャンク
異なるシャードに存在する表領域にパーティションを作成することで、シャード間にパーティションを分散します。
シャード表の各パーティションが個別の表領域に格納され、表領域が分散データベースのデータ分散の単位になります。
シャード表ファミリで説明するように、マルチシャード結合の数を最小にするために、表ファミリのすべての表の対応するパーティションが常に同じシャードに格納されます。構文の例で表領域セットts1
がすべての表に使用されているように、1つの表ファミリの表が分散された表領域の同じセットに作成されるときに、これが保証されます。
ただし、1つの表ファミリの異なる表を異なる表領域のセットに作成することも可能です。たとえば、表領域セットts1
にCustomers表を作成し、表領域セットts2
にOrdersを作成できます。この場合、Customersのパーティション1が格納される表領域が常に、Ordersのパーティション1が格納される表領域と同じシャードに存在することが保証される必要があります。
この機能をサポートするために、表ファミリのすべての表の対応するパーティションのセット(チャンクと呼ばれる)が作成されます。チャンクには表ファミリの各表の1つのパーティションが含まれます。これより、様々なシャード表の関連するデータが一緒に移動されることが保証されます。つまり、チャンクはシャード間のデータ移行の単位です。システム管理およびコンポジットのデータ分散方法では、分散データベースの作成時に各シャード内のチャンク数が指定されます。ユーザー定義のデータ分散の場合、チャンクの合計数はパーティションの数と同じです。
次の図に、Cutomers-Orders-LineItemsスキーマの表の対応するパーティションを含むチャンクを示します。
次の図のように、各シャードに複数のチャンクが含まれます。
シャード表に加えて、シャードには1つ以上の重複表も含めることができます。重複表は、シャード表に使用される表領域には格納できません。
表領域セット
Oracle Globally Distributed Databaseは、TABLESPACE SET
という単位で表領域を作成および管理します。
システム管理およびコンポジットのデータ分散方法で構成された分散データベースではTABLESPACE SET
が使用され、ユーザー定義のデータ分散では通常の表領域が使用されます。
表領域は、分散データベースでのデータ分散の論理単位です。異なるシャードに存在する表領域にパーティションを自動的に作成することで、シャード間にパーティションを分散します。
マルチシャード結合の数を最小にするために、関連する表の対応するパーティションは常に同じシャードに格納されます。シャード表の各パーティションが個別の表領域に格納されます。
PARTITIONS AUTO
句は、パーティション数を自動的に判別することを指定します。このハッシュ・タイプによってシャード間のデータ移行でさらに柔軟性および効率性がもたらされ、これは弾力的な拡張性にとって重要です。
表領域セットごとに作成される表領域の数は、デプロイメント時にシャード領域に定義されたチャンクの数に基づいて決定されます。
ノート:
表領域セットでは、Oracle Managed Filesのみがサポートされます。
個々の表領域を表領域セット全体とは別個に削除または変更することはできません。
TABLESPACE SET
をユーザー定義のデータ分散方法とともに使用することはできません。
シャード表
データベース表はシャード間で分割されるため、各シャードには同じ列を持つが行のサブセットが異なる表が含まれます。この方法で分割された表はシャード表と呼ばれます。
次の図は、大規模な表のセット(表ファミリと呼ばれる)を3つのシャード間で水平にパーティション化して、各シャードに赤、黄および青の行で示されるデータのサブセットを含める方法を示しています。
パーティションはシャーディング・キーに基づいて表領域レベルでシャード間に分散されます。キーの例として顧客ID、アカウント番号、国IDなどがあります。
シャード表の各パーティションが個別の表領域に存在し、各表領域が特定のシャードと関連付けられます。データ分散方法に応じて、関連付けは自動的に確立するか、管理者が定義できます。
シャード表のパーティションが複数のシャード内に存在する場合でも、アプリケーションにとってその表は、単一データベース内のパーティション表とまったく同じように表示され、動作します。アプリケーションによって発行されたSQL文はシャードを参照する必要はなく、シャードの数およびその構成に依存することもありません。
シャード間で行をパーティション化する方法は、表のパーティション化でよく目にするSQL構文によって指定します。たとえば、次のSQL文はシャーディング・キーcust_id
に基づいて、シャード間で表を水平にパーティション化したシャード表を作成します。
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)
)
PARTITION BY CONSISTENT HASH (cust_id)
PARTITIONS AUTO
TABLESPACE SET ts1
;
シャード表はコンシステント・ハッシュ(スケーラブルな分散システムで一般的に使用される特殊なタイプのハッシュ・パーティション化)によりパーティション化されます。この手法は、シャード間で表領域を自動的に分散するため、データおよびワークロードが均等に分散されます。
ノート:
シャード表でのグローバル索引はサポートされていませんが、ローカル索引はサポートされています。シャード表ファミリ
シャード表ファミリは、同様にシャーディングされた一連の表です。しばしば、データベースの表には親子関係があり、親表の主キーを参照する子表(外部キー)には参照制約があります。
このような関係でリンクされている複数の表は、通常はツリーのような構造になり、各子が1つの親を持ちます。そのような一連の表は、表ファミリと呼ばれます。表ファミリ内の親を持たない表をルート表と呼びます。1つの表ファミリに存在できるルート表は1つのみです。
表ファミリのシャーディング方法
ここでは、Customers-Orders-LineItemsスキーマを使用して表ファミリをシャーディングします。
シャーディングの前に、スキーマ内の表は次の例のようになります。3つの表に親子関係があり、Customersがルート表になります。
シャーディング前のCustomers表(ルート)
CustNo Name Address Location Class --------- ---------- -------------- --------- ------ 123 Brown 100 Main St us3 Gold 456 Jones 300 Pine Ave us1 Silver 999 Smith 453 Cherry St us2 Bronze
シャーディング前のOrders表
OrderNo CustNo OrderDate --------- -------- ----------- 4001 123 14-FEB-2013 4002 456 09-MAR-2013 4003 456 05-APR-2013 4004 123 27-MAY-2013 4005 999 01-SEP-2013
シャーディング前のLineItems表
LineNo OrderNo CustNo StockNo Quantity ------ ------- ------ ------- -------- 40011 4001 123 05683022 1 40012 4001 123 45423609 4 40013 4001 123 68584904 1 40021 4002 456 05683022 1 40022 4002 456 45423509 3 40022 4003 456 80345330 16 40041 4004 123 45423509 1 40042 4004 123 68584904 2 40051 4005 999 80345330 12
ルートであるCustomers表の顧客番号CustNo
に基づいて表をシャーディングできます。次の表の例には、顧客123に関連するデータが格納されたシャードが示されています。
顧客123のデータを含むCustomers表シャード
CustNo Name Address Location Class --------- ---------- -------------- ---------- ------ 123 Brown 100 Main St us3 Gold
顧客123のデータを含むOrders表シャード
OrderNo CustNo OrderDate --------- -------- ----------- 4001 123 14-FEB-2013 4004 123 27-MAY-2013
顧客123のデータを含むLineItems表シャード
LineNo OrderNo CustNo StockNo Quantity ------ ------- ------ ------- -------- 40011 4001 123 05683022 1 40012 4001 123 45423609 4 40013 4001 123 68584904 1 40041 4004 123 45423509 1 40042 4004 123 68584904 2
重複表
Oracle Globally Distributed Databaseでは、各シャードに同じコンテンツを含む表を重複表と呼びます。
分散データベースには、シャード間で水平にパーティション化されたシャード表、およびすべてのシャードにレプリケートされる重複表が含まれます。
頻繁には更新されず、シャード表とともにアクセスされることが多い比較的小さい表には、重複表を選択することをお薦めします。このため、通常、重複表には参照情報が含まれています(たとえば、各シャードで共通のStock Items表)。
多くのアプリケーションの場合、単一のシャードで処理されるデータベース・リクエストの数は、すべてのシャードに読取り専用またはほぼ読取り専用の表を複製することによって最大化できます。シャード表と重複表の組合せによって、シャーディング・キーに関連付けられているすべてのトランザクションを単一のシャードで処理できます。この技法によって、線形のスケーラビリティおよび障害の分離が可能になります。
重複表が必要な例として、シャード表ファミリで説明される表ファミリを取り上げます。このデータベース・スキーマにはProducts
表も含まれる可能性があり、この表ファミリに対して作成されたシャード内のすべての顧客が共有するデータが含まれますが、顧客番号でシャーディングすることはできません。注文処理中のマルチシャード問合せを回避するため、表全体を分散データベース内のすべてのシャードに複製できます。
シャード表(Customers、Orders、Line Items)と重複表(Products)の違いを次の図に示します。
上の図では、Customers、Orders、Line Itemsの各表はすべて、Customer ID番号によって3つのシャードにシャードされます。図の上部にある各表の行の色と、各シャード内のシャード表の対応する色で示されています。重複表Products (グレー表示)は、3つのシャードをポイントする表の矢印で示すように、すべてのシャードに完全にレプリケートされます。
詳細、制限事項および例については、重複表の作成を参照してください。
すべてのシャードに作成される表以外のオブジェクト
重複表に加えて、他のスキーマ・オブジェクト(ユーザー、ロール、ビュー、索引、シノニム、ファンクション、プロシージャ、パッケージなど)および非スキーマ・データベース・オブジェクト(表領域、表領域セット、ディレクトリ、コンテキストなど)をOracle Globally Distributed Database内のすべてのシャードに作成できます。
CREATE
文に追加のキーワード(SHARDED
またはDUPLICATED
)が必要となる表と異なり、他のオブジェクトは既存の構文を使用してすべてのシャードに作成します。唯一の要件は、SHARD DDL
セッション・プロパティを有効にする必要があることです。
すべてのシャードでの次のオブジェクトの自動作成は、このリリースではサポートされません。これらのオブジェクトは、個別のシャードに接続することによって作成できます。
-
クラスタ
-
制御ファイル
-
データベース・リンク
-
ディスク・グループ
-
エディション
-
フラッシュバック・アーカイブ
-
マテリアライズド・ゾーン・マップ
-
アウトライン
-
Pfile
-
プロファイル
-
リストア・ポイント
-
ロールバック・セグメント
-
要約
Oracle Database 18c以降では、マテリアライズド・ビューとビュー・ログがサポートされますが、次の制限事項があります。
-
シャード表に対して作成されたマテリアライズド・ビューは、カタログ・データベースでは空のままですが、シャード上の対応するマテリアライズド・ビューには個々のシャードのデータが含まれています。
-
シャード表のマテリアライズド・ビューでは、
REFRESH COMPLETE ON DEMAND USING TRUSTED CONSTRAINTS
オプションのみがサポートされます。