複数の主キーのない複数のキャッシュ・インスタンスの動的ロード
TimesTen Classicでは、単一の表キャッシュ・グループでWHERE
句で参照されている複数の主キーを使用せずに、複数のキャッシュ・インスタンスを動的にロードできます。
問合せで、データベースに存在しているキャッシュ・インスタンスと存在しないキャッシュ・インスタンスの両方のロードを試みた場合、動的ロード処理全体は実行されません。動的ロードは、リクエストされたキャッシュ・インスタンスがTimesTenデータベースにすでに存在しない場合のみ実行されます。
デフォルトでは、次の文、トランザクションまたは接続レベルのヒントのいずれかを1に設定しないかぎり、SELECT
文に任意のWHERE
句がある場合、TimesTen Classicは単一の表キャッシュ・グループの複数のキャッシュ・インスタンスを動的にロードしません。
-
文レベルのヒント:
/*+TT_DynamicLoadRootTbl (1)*/
-
トランザクション・レベルのヒント:
Call ttOptSetFlag(DynamicLoadRootTbl , 1)
-
接続レベルのヒント:
OptimizerHint = TT_DynamicLoadRootTbl (1)
ノート:
『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の「オプティマイザ・ヒントを使用して実行計画を変更する」、『Oracle TimesTen In-Memory Databaseリファレンス』の「ttOptSetFlag」および『Oracle TimesTen In-Memory Database SQLリファレンス』の「オプティマイザ・ヒント」を参照してください。
任意のWHERE
句を持つ複数のキャッシュ・インスタンスの動的ロードの制限
単一の表キャッシュ・グループに対する複数のキャッシュ・インスタンスの動的ロードを行うには、SELECT
文の問合せは次のものに従う必要があります。
-
WHERE
句の結果には、TimesTenデータベースに現在存在するキャッシュ・インスタンスは含まれません。 -
WHERE
句は、Oracle Database SQL構文でサポートされている必要があります。 -
他の動的ロード条件に適格ではありません。
-
集計を使用しません。
-
問合せ内で他の表は参照されません。つまり、
SELECT
文では、JOIN
句やWHERE
句内に埋め込まれたサブ問合せは指定しません。 -
SELECT
...FOR UPDATE
句またはINSERT
...FOR SELECT
句は使用しません。
例
これらの例では、TimesTenデータベースで次のキャッシュ・グループ定義を使用します。
CREATE DYNAMIC READONLY CACHE GROUP cust_orders FROM customers(cust_id BIGINT NOT NULL PRIMARY KEY, cust_name VARCHAR2(100), cust_street VARCHAR2(200), cust_state VARCHAR2(2), cust_zip VARCHAR2(10)) WHERE (customers.cust_state = 'CA');
データがOracleデータベースに挿入されます。
INSERT INTO customers(cust_id, cust_name, cust_street, cust_state, cust_zip) VALUES (100, 'Tom Hanks', '100 Rodeo Dr', 'CA', '90210'); INSERT INTO customers(cust_id, cust_name, cust_street, cust_state, cust_zip) VALUES (200, 'Fred Rogers', '1 Make-Believe Ave', 'CA', '90210');
リクエストされた顧客はいずれもTimesTenデータベースのキャッシュ・グループにありません。したがって、リクエストされたすべての顧客(およびその順序)が動的にロードされ、その名前が問合せによって返されます。
SELECT c.cust_name FROM customers c WHERE (c.cust_zip like '90210%'); <'Tom Hanks'> <'Fred Rogers'>
別の顧客および全データがOracle Databaseに挿入されます。
INSERT INTO customers(cust_id, cust_name, cust_street, cust_state, cust_zip) VALUES (300, 'Matthew Rhys', '2 Moscow Cir', 'CA', '90210');
TimesTenデータベースでは、次の問合せが実行されます。キャッシュ・グループには問合せを満たす行が少なくとも1つあるため、動的ロードはトリガーされません。したがって、現在キャッシュ・グループに存在するデータのみが問合せに対して返されます。
SELECT c.cust_name FROM customers c WHERE (c.cust_zip like '90210%'); <'Tom Hanks'> <'Fred Rogers'>