表の分散スキームの定義
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を参照してください。