表の分散スキームの定義
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列のハッシュに基づいて、各要素にデータを分散します。
ハッシュ分散スキームの詳細は、『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表のデータ分散も示しています。
参照分散スキームの詳細は、『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により、データベースのすべての要素についてデータのコピーが作成されます。
複製分散スキームの詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のCREATE TABLEを参照してください。


