スキーマ・オブジェクト

Oracle Globally Distributed Databaseの利点を活用するには、1つのシャードで処理されるデータベース・リクエストの数が最大になるように、分散データベースのスキーマを設計する必要があります。

パーティション、表領域およびチャンク

異なるシャードに存在する表領域にパーティションを作成することで、シャード間にパーティションを分散します。

シャード表の各パーティションが個別の表領域に格納され、表領域が分散データベースのデータ分散の単位になります。

シャード表ファミリで説明するように、マルチシャード結合の数を最小にするために、表ファミリのすべての表の対応するパーティションが常に同じシャードに格納されます。構文の例で表領域セットts1がすべての表に使用されているように、1つの表ファミリの表が分散された表領域の同じセットに作成されるときに、これが保証されます。

ただし、1つの表ファミリの異なる表を異なる表領域のセットに作成することも可能です。たとえば、表領域セットts1にCustomers表を作成し、表領域セットts2にOrdersを作成できます。この場合、Customersのパーティション1が格納される表領域が常に、Ordersのパーティション1が格納される表領域と同じシャードに存在することが保証される必要があります。

この機能をサポートするために、表ファミリのすべての表の対応するパーティションのセット(チャンクと呼ばれる)が作成されます。チャンクには表ファミリの各表の1つのパーティションが含まれます。これより、様々なシャード表の関連するデータが一緒に移動されることが保証されます。つまり、チャンクはシャード間のデータ移行の単位です。システム管理およびコンポジットのデータ分散方法では、分散データベースの作成時に各シャード内のチャンク数が指定されます。ユーザー定義のデータ分散の場合、チャンクの合計数はパーティションの数と同じです。

次の図に、Cutomers-Orders-LineItemsスキーマの表の対応するパーティションを含むチャンクを示します。

図2-2 パーティションのセットとしてのチャンク

図2-2の説明が続きます
「図2-2 パーティションのセットとしてのチャンク」の説明

次の図のように、各シャードに複数のチャンクが含まれます。

図2-3 シャードの内容

図2-3の説明が続く
「図2-3 シャードの内容」の説明

シャード表に加えて、シャードには1つ以上の重複表も含めることができます。重複表は、シャード表に使用される表領域には格納できません。

表領域セット

Oracle Globally Distributed Databaseは、TABLESPACE SETという単位で表領域を作成および管理します。

システム管理およびコンポジットのデータ分散方法で構成された分散データベースではTABLESPACE SETが使用され、ユーザー定義のデータ分散では通常の表領域が使用されます。

表領域は、分散データベースでのデータ分散の論理単位です。異なるシャードに存在する表領域にパーティションを自動的に作成することで、シャード間にパーティションを分散します。

マルチシャード結合の数を最小にするために、関連する表の対応するパーティションは常に同じシャードに格納されます。シャード表の各パーティションが個別の表領域に格納されます。

PARTITIONS AUTO句は、パーティション数を自動的に判別することを指定します。このハッシュ・タイプによってシャード間のデータ移行でさらに柔軟性および効率性がもたらされ、これは弾力的な拡張性にとって重要です。

表領域セットごとに作成される表領域の数は、デプロイメント時にシャード領域に定義されたチャンクの数に基づいて決定されます。

ノート:

表領域セットでは、Oracle Managed Filesのみがサポートされます。

個々の表領域を表領域セット全体とは別個に削除または変更することはできません。

TABLESPACE SETをユーザー定義のデータ分散方法とともに使用することはできません。

シャード表

データベース表はシャード間で分割されるため、各シャードには同じ列を持つが行のサブセットが異なる表が含まれます。この方法で分割された表はシャード表と呼ばれます。

次の図は、大規模な表のセット(表ファミリと呼ばれる)を3つのシャード間で水平にパーティション化して、各シャードに赤、黄および青の行で示されるデータのサブセットを含める方法を示しています。

図2-4 シャード間への表の水平パーティション化



パーティションはシャーディング・キーに基づいて表領域レベルでシャード間に分散されます。キーの例として顧客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)の違いを次の図に示します。

図2-5 シャード表と重複表

図2-5の説明が続きます
「図2-5 シャード表と重複表」の説明

上の図では、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オプションのみがサポートされます。