ヘッダーをスキップ
Oracle TimesTen Cache Connect to Oracle開発者および管理者ガイド
リリース7.0
E05172-03
  目次へ
目次
索引へ
索引

前へ
前へ
次へ
次へ
 

キャッシュ・グループ表の定義

最も基本的なタイプのキャッシュ・グループは、TimesTenで単一のOracle表をキャッシュするキャッシュ・グループです。複数の表を単一のキャッシュ・グループにキャッシュする処理は複雑であるため、Cache Connect to Oracleの概念の詳細を理解している必要があります。

通常、キャッシュされる各Oracle表には、1つ以上の主キーまたはNULLでない一意索引キーが必要です。また、TimesTenキャッシュ・グループ表で定義されている主キーおよび一意索引は、Oracle表の主キーおよび一意索引と一致している必要があります。たとえば、Oracle表に主キーまたは一意索引列C1C2およびC3がある場合、キャッシュされた表の対応するTimesTenの主キーにも列C1C2およびC3が必要です。

非一意索引は、TimesTenキャッシュ表に対して無制限に作成できます。索引をキャッシュ表に追加すると、非キャッシュTimesTen表と同様の方法でSQLを高速化できます。不適切な一意制約による障害が発生することがあるため、Oracle表の一意索引と一致しない一意索引は作成しないでください。


注意: Oracle一時表をキャッシュすることはできません。

この項の内容は次のとおりです。

単一のキャッシュ・グループ表の定義

次のように、単純なキャッシュ・グループ定義を作成して、単一表をキャッシュします。

CREATE TYPE CACHE GROUP owner.name

FROM

  owner.root_table(

     column_list,

     PRIMARY KEY(primary_key_column_list));

ここで、

列のデータ型を選択する場合は、Oracle列のデータ型を考慮し、キャッシュ・グループ内の表に対して適切にマップされたデータ型を選択してください。「Cache Connect to Oracleのデータ型マッピング」を参照してください。

例2.3

図2.13に、Oracle表customerをキャッシュするためのtarget_customersという単一表のREADONLYキャッシュ・グループを示します。TimesTenキャッシュ・グループのデータは、Oracleデータベースに保存されているすべての顧客に関する大量のデータ・セットのサブセットです。

図2.13 TimesTenでの単一Oracle表のキャッシュ
TimesTenでの単一Oracle表のキャッシュ[テキストの説明]

単一表のtarget_customersキャッシュ・グループの作成に使用されるCREATE READONLY CACHE GROUP文は、次のとおりです。

CREATE READONLY CACHE GROUP target_customers

FROM

  user1.customer (

    cust_num   NUMBER NOT NULL PRIMARY KEY,

    region     VARCHAR2(5) NOT NULL,

    name       VARCHAR2(80),

    address    VARCHAR2(255) NOT NULL

  );

複数のキャッシュ・グループ表の定義

複数のOracle表が同じキャッシュ・グループにキャッシュされる場合は、1つのルート表および1つ以上の子表を定義する必要があります。1つのキャッシュ・グループに存在できるルート表は、1つのみです。

複数の表を持つキャッシュ・グループでは、キャッシュ・グループ内の各子表は、外部キー制約を使用してキャッシュ・グループ内のルート表または別の子表と結合する必要があります。TimesTenでは外部キー制約を使用してキャッシュ・グループ内の表を結合する必要がありますが、Oracleインスタンスでは結合する必要はありません。キャッシュ・グループ内のルート表は、外部キー制約を介してキャッシュ・グループ内の他のすべての表を参照しません。キャッシュ・グループ内の他のすべての表は子表です。

各表定義には、主キーが含まれている必要があります。また、各子表には、親表の主キーに対する外部キー参照が含まれている必要があります。キャッシュ・グループの表の階層では、他の子表の親になるように子表を指定できますが、キャッシュ・グループ内の表は、キャッシュ・グループ内の複数の親の子になることはできません。適切なキャッシュ・グループ表の構成の例は、図2.14を参照してください。図2.15に不適切な表設定を示し、図2.16に問題の解決策を示します。

各Oracle表がキャッシュに含まれるように、キャッシュ・グループ内で個別の表定義を作成する必要があります。キャッシュ・グループ内の表定義の所有者および名前は、Oracle表の所有者および名前と一致している必要があります。表定義を作成すると、Oracle表の列のすべてまたはサブセットをキャッシュできます。


注意: 各Oracle表は1つのキャッシュ・グループにのみ定義できます。同じOracle表をキャッシュするキャッシュ・グループを複数作成することはできません。

例2.4

次のように、単純なキャッシュ・グループ定義を作成して、1つのルート表および1つの子表をキャッシュします。

CREATE TYPE CACHE GROUP owner.name

FROM

  owner.root_table(

     column_list,

     PRIMARY KEY(primary_key_column_list)),

  owner.child_table(

     column_list,

     PRIMARY KEY(primary_key_column_list),

     FOREIGN KEY(reference_column_list)

        REFERENCES owner.root_table(primary_key_column_list));

ここで、

図2.14に、前述の図2.13で示したtarget_customersキャッシュ・グループで複数の表がある場合の例を示します。

図2.14 複数の表を持つキャッシュ・グループ
複数の表を持つキャッシュ・グループ[テキストの説明]

この例では、キャッシュ・グループは3つのOracle表customerordersおよびorder_itemをキャッシュするように拡張されています。キャッシュ・グループのデータは、Oracleデータベースに格納されているすべての顧客に関する大量のデータ・セットのサブセットです。target_customersキャッシュ・グループ内の各親表は、主キー(太字で示されています)を持ち、外部キー関係を介して子表によって参照されます(矢印で示されています)。customer表は、キャッシュ・グループ内の別の表を参照しないため、ルート表になります。customer表の主キーは、target_customersキャッシュ・グループの主キーです。ordersおよびorder_item表は子表です。

例2.5

複数表のtarget_customersキャッシュ・グループの作成に使用されるCREATE READONLY CACHE GROUP文は、次のとおりです。

CREATE READONLY CACHE GROUP target_customers

FROM

user1.customer (

  cust_num  NUMBER NOT NULL PRIMARY KEY,

  region    VARCHAR2(10) NOT NULL,

  name      VARCHAR2(80),

  address   VARCHAR2(255) NOT NULL

),

user1.orders (

  ord_num       NUMBER NOT NULL PRIMARY KEY,

  cust_num      NUMBER NOT NULL,

  when_placed   TIMESTAMP NOT NULL,

  when_shipped  TIMESTAMP,

  FOREIGN KEY (cust_num) REFERENCES user1.customer (cust_num)

),

user1.order_item (

  ord_num   NUMBER NOT NULL,

  prod_num  NUMBER NOT NULL,

  quantity  NUMBER NOT NULL,

  PRIMARY KEY (ord_num, prod_num),

  FOREIGN KEY (ord_num) REFERENCES user1.orders (ord_num)

);

図2.15に、キャッシュ・グループの不適切な表の構成の例を示します。

図2.15 問題: 2つのルート表
問題: キャッシュ・グループの2つのルート表[テキストの説明]

customerordersおよびorder_item表と同じキャッシュ・グループのproductsおよびinventory表を定義することはできません。products表にはルート表customersへの(直接または間接の)外部キー参照がないためです。つまり、products表もルート表とみなされ、1つのキャッシュ・グループは1つ以上のルート表を持つことができないため無効となります。

図2.16に示すように、すべての表をキャッシュするために、productsおよびinventory表に対して2つ目のキャッシュ・グループを作成できます。

図2.16 解決策: 2つの別々のキャッシュ・グループ
解決策: 2つの別々のキャッシュ・グループ[テキストの説明]

Oracleパーティション表のキャッシュ

通常のOracle表をキャッシュする場合と同じ表記規則に従って、キャッシュ・グループ内のOracleパーティション表を定義できます。たとえば、読取り専用キャッシュ・グループ内のパーティション表には、対応するNULLでない一意の索引がOracle内に必要です。キャッシュ・グループで使用されるパーティション表は、任意の方法(ハッシュ、リスト、範囲または複合)でパーティション化またはサブパーティション化できます。

Oracleパーティション表をキャッシュする場合は、次の制限が適用されます。

Oracleのシノニムについて

キャッシュ・グループの表定義は、Oracle実表のOracleプライベート・シノニムを参照できます。実際のOracle実表は別のOracleスキーマ内に存在し、異なる名前を持つことができますが、シノニムと同じOracleサーバーに存在している必要があります。キャッシュ・グループの表名は、プライベート・シノニムの名前である必要がありますが、このシノニムは別のシノニムを示すことができます。この別のシノニムには、パブリックまたはプライベートのいずれのシノニムでも使用できます。シノニムは、最終的に、表、パーティション表またはマテリアライズド・ビューを(直接的または間接的に)示す必要があります。

Oracleシノニムに対する表定義が含まれているキャッシュ・グループは、USERMANAGED、SWTまたはAWTキャッシュ・グループです。USERMANAGEDキャッシュ・グループはLOAD CACHE GROUP、UNLOAD CACHE GROUP、REFRESH CACHE GROUPおよびFLUSH CACHE GROUP処理をサポートできますが、AUTOREFRESHまたはREADONLY属性を指定して構成することはできません。READONLYキャッシュ・グループ内のOracleシノニムに対して表定義を持つことはできません。