表の分散スキームの定義

TimesTen Scaleoutでは、データはグリッドの要素間で分散されます。データの分散方法は、CREATE TABLE文のDISTRIBUTE BY句で指定された分散スキームによって定義されます。データの分散方法や特定のデータが格納されている要素に関係なく、アプリケーションでは、単一の要素に接続しているときにデータベース内のすべてのデータにアクセスできます。ただし、表の分散スキームを定義するとき、いくつかのことを考慮する必要があります。

ノート:

  • データベース・オブジェクトの作成を開始する前に、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』TimesTenでの認証を参照してください。

  • データを含む表のロードを計画している場合は、索引なしでの表の作成を検討してください。データのロード後に、索引を作成できます。これにより、表へのデータのロードにかかる時間が短縮されます。

TimesTen Scaleoutの表に使用可能なデータの分散スキームは、次のとおりです。

ハッシュ

ハッシュ分散スキームでは、主キーのハッシュまたはユーザー指定の一連の列に基づいて、データが分散されます。ハッシュ・キーにより、行を格納する必要があるレプリカ・セットが決定されます。表内の特定の1行は、1つのレプリカ・セットにのみ格納されます。表に主キーまたはユーザー指定の分散列が存在しない場合、この目的でTimesTen Scaleoutによって追加された非表示列のハッシュに基づいてデータが分散されます。この分散スキームは、トポロジの変更に対して適応性があり、一貫性のあるハッシュを使用します。つまり、ハッシュ・キー列に特定の値を含む行は、トポロジが変更されない場合には常に同じレプリカ・セットに割り当てられます。トポロジが変更された場合、行の位置は、データが再分散されたときに変わる可能性があります。

ノート:

DISTRIBUTE BY句を指定せずに表を作成する場合は、TimesTen Scaleoutにより、表のハッシュ分散スキームが定義されます。さらに、列がDISTRIBUTE BY HASH句で指定されていない場合は、TimesTen Scaleoutにより、分散スキームのキー列として主キー列が選択されます。主キーが定義されていない場合は、TimesTen Scaleoutにより、ハッシュ・キーとして非表示列が作成されます。

cust_id主キー列のハッシュに基づいてデータを分散するDISTRIBUTE BY HASH句を使用したcustomers表を作成します。

CREATE TABLE customers (
    cust_id            NUMBER(10,0) NOT NULL PRIMARY KEY,
    first_name         VARCHAR2(30) NOT NULL,
    last_name          VARCHAR2(30) NOT NULL,
    addr1              VARCHAR2(64),
    addr2              VARCHAR2(64),
    zipcode            VARCHAR2(5),
    member_since       DATE NOT NULL
) DISTRIBUTE BY HASH;

図5-1は、「データベースの作成」で構成したdatabase1データベース内のcustomers表のデータ分散を示しています。TimesTen Scaleoutでは、cust_id列のハッシュに基づいて、各要素にデータを分散します。

図5-1 ハッシュによって分散された表

図5-1の説明は次にあります
「図5-1 ハッシュによって分散された表」の説明

ハッシュ分散スキームの詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』CREATE TABLEを参照してください。

参照

参照分散スキームでは、外部キー制約の対応する親行の位置に基づいて、子表のデータが分散されます。この分散スキームにより、単一要素の関連データを分散することで、結合のパフォーマンスが最適化されます。親表と子表を結合すると、すべてのデータが同じ要素上に格納されるため、TimesTen Scaleoutでは異なる要素にアクセスする必要がありません。親表をハッシュまたは参照によって分散できるため、複数層の参照分散が可能となります。

ノート:

DISTRIBUTE BY REFERENCE句を使用するときには、必ず外部キー制約の子キー列をNOT NULLとして宣言してください。

cust_id主キー列のハッシュに基づいてデータを分散するDISTRIBUTE BY HASH句を使用したcustomers親表を作成します。次に、fk_customer外部キー内の参照列customers(cust_id)の対応する値の位置に基づいてaccounts表のデータを分散するDISTRIBUTE BY REFERENCE句を使用したaccounts子表を作成します。

CREATE TABLE customers (
    cust_id            NUMBER(10,0) NOT NULL PRIMARY KEY,
    first_name         VARCHAR2(30) NOT NULL,
    last_name          VARCHAR2(30) NOT NULL,
    addr1              VARCHAR2(64),
    addr2              VARCHAR2(64),
    zipcode            VARCHAR2(5),
    member_since       DATE NOT NULL
) DISTRIBUTE BY HASH;
 
CREATE TABLE accounts (
    account_id         NUMBER(10,0) NOT NULL PRIMARY KEY,
    phone              VARCHAR2(15) NOT NULL,
    account_type       CHAR(1) NOT NULL,
    status             NUMBER(2) NOT NULL,
    current_balance    NUMBER(10,2) NOT NULL,
    prev_balance       NUMBER(10,2) NOT NULL,
    date_created       DATE NOT NULL,
    cust_id            NUMBER(10,0) NOT NULL,
    CONSTRAINT fk_customer
        FOREIGN KEY (cust_id)
            REFERENCES customers(cust_id)
) DISTRIBUTE BY REFERENCE (fk_customer);

図5-2は、「データベースの作成」で構成したdatabase1データベース内のcustomers表のデータ分散を示しています。TimesTen Scaleoutでは、customers表のデータをcust_id主キー列のハッシュに基づいて各レプリカ・セットに分散します。この図は、fk_customer外部キー内の参照列cutomers(cust_id)の対応する値の位置に基づいた、accounts表のデータ分散も示しています。

図5-2 参照によって分散された表

図5-2の説明が続きます
「図5-2 参照によって分散された表」の説明

参照分散スキームの詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』CREATE TABLEを参照してください。

複製

複製分散スキームでは、表のデータの同一コピーをデータベースのすべての要素に分散します。この分散スキームにより、すべてのデータ・アクセスが確実にローカルとなり、表に対する読取りと結合のパフォーマンスが最適化されます。ただし、挿入および更新においては、他の分散スキームよりもリソースが大量に消費されます。

データベースのすべての要素にデータを分散するDUPLICATE句を使用したaccount_type表を作成します。

CREATE TABLE account_type (
    type            CHAR(1) NOT NULL PRIMARY KEY,
    description     VARCHAR2(100) NOT NULL
) DUPLICATE;

図5-3は、「データベースの作成」で構成したdatabase1データベース内のaccount_type表のデータ分散を示しています。TimesTen Scaleoutにより、データベースのすべての要素についてデータのコピーが作成されます。

図5-3 複製によって分散された表

図5-3の説明が続きます
「図5-3 複製によって分散された表」の説明

複製分散スキームの詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』CREATE TABLEを参照してください。