最も基本的なタイプのキャッシュ・グループは、TimesTenで単一のOracle表をキャッシュするキャッシュ・グループです。複数の表を単一のキャッシュ・グループにキャッシュする処理は複雑であるため、Cache Connect to Oracleの概念の詳細を理解している必要があります。
通常、キャッシュされる各Oracle表には、1つ以上の主キーまたはNULLでない一意索引キーが必要です。また、TimesTenキャッシュ・グループ表で定義されている主キーおよび一意索引は、Oracle表の主キーおよび一意索引と一致している必要があります。たとえば、Oracle表に主キーまたは一意索引列C1、C2およびC3がある場合、キャッシュされた表の対応するTimesTenの主キーにも列C1、C2および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.13に、Oracle表customerをキャッシュするためのtarget_customersという単一表のREADONLYキャッシュ・グループを示します。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表をキャッシュするキャッシュ・グループを複数作成することはできません。 |
次のように、単純なキャッシュ・グループ定義を作成して、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キャッシュ・グループで複数の表がある場合の例を示します。
この例では、キャッシュ・グループは3つのOracle表customer、ordersおよびorder_itemをキャッシュするように拡張されています。キャッシュ・グループのデータは、Oracleデータベースに格納されているすべての顧客に関する大量のデータ・セットのサブセットです。target_customersキャッシュ・グループ内の各親表は、主キー(太字で示されています)を持ち、外部キー関係を介して子表によって参照されます(矢印で示されています)。customer表は、キャッシュ・グループ内の別の表を参照しないため、ルート表になります。customer表の主キーは、target_customersキャッシュ・グループの主キーです。ordersおよびorder_item表は子表です。
複数表の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に、キャッシュ・グループの不適切な表の構成の例を示します。
customer、ordersおよびorder_item表と同じキャッシュ・グループのproductsおよびinventory表を定義することはできません。products表にはルート表customersへの(直接または間接の)外部キー参照がないためです。つまり、products表もルート表とみなされ、1つのキャッシュ・グループは1つ以上のルート表を持つことができないため無効となります。
図2.16に示すように、すべての表をキャッシュするために、productsおよびinventory表に対して2つ目のキャッシュ・グループを作成できます。
通常のOracle表をキャッシュする場合と同じ表記規則に従って、キャッシュ・グループ内のOracleパーティション表を定義できます。たとえば、読取り専用キャッシュ・グループ内のパーティション表には、対応するNULLでない一意の索引がOracle内に必要です。キャッシュ・グループで使用されるパーティション表は、任意の方法(ハッシュ、リスト、範囲または複合)でパーティション化またはサブパーティション化できます。
Oracleパーティション表をキャッシュする場合は、次の制限が適用されます。
CREATE READONLY CACHE GROUP badcachegroup
FROM
user1.partitioned_table(ii NUMBER NOT NULL PRIMARY KEY, jj NUMBER)
WHERE ii IN (SELECT ii
FROM user1.partitioned_table
PARTITION(F200402));
注意: | オフラインのパーティションでキャッシュ処理(LOAD CACHE GROUP、UNLOAD CACHE GROUP、REFRESH CACHE GROUPなど)を実行しようとすると、ORA-00376エラーまたはORA-01110エラーが発生します。ただし、パーティションがオフラインになった場合(バックアップ処理中など)は、このパーティションにアクセスしようとしないかぎり、エラーは生成されません。 |
キャッシュ・グループの表定義は、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シノニムに対して表定義を持つことはできません。