ヘッダーをスキップ
Oracle In-Memory Database Cacheユーザーズ・ガイド
リリース11.2.1
B56054-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

5 キャッシュ・グループの処理

この章では、キャッシュ・グループに対して実行できる処理について説明します。内容は次のとおりです。

TimesTenデータベースとOracle Database間での更新の送信

TimesTenキャッシュ表とキャッシュされたOracle表間でコミットされた更新を手動で送信するには、次のSQL文を使用します。

SQL文 説明
LOAD CACHE GROUP TimesTenキャッシュ表にないキャッシュ・インスタンスをキャッシュされたOracle表からロードします。
REFRESH CACHE GROUP TimesTenキャッシュ表のキャッシュ・インスタンスをキャッシュされたOracle表の現在のデータで置き換えます。
FLUSH CACHE GROUP TimesTenキャッシュ表にコミットされた更新をキャッシュされたOracle表に伝播します。 ユーザー管理キャッシュ・グループにのみ適用可能です。

AWTキャッシュ・グループ、SWTキャッシュ・グループおよびPROPAGATEキャッシュ表属性を使用するユーザー管理キャッシュ・グループの場合、TimesTenキャッシュ表にコミットされた更新はキャッシュされたOracle表に自動的に伝播されます。

AWTキャッシュ・グループの詳細は、「ASYNCHRONOUS WRITETHROUGH(AWT)キャッシュ・グループ」を参照してください。

SWTキャッシュ・グループの詳細は、「SYNCHRONOUS WRITETHROUGH(SWT)キャッシュ・グループ」を参照してください。

ユーザー管理キャッシュ・グループのキャッシュ表にPROPAGATEキャッシュ表属性を使用する方法の詳細は、「PROPAGATEキャッシュ表属性」を参照してください。

読取り専用キャッシュ・グループまたはユーザー管理キャッシュ・グループにAUTOREFRESHキャッシュ・グループ属性を使用すると、キャッシュされたOracle表にコミットされた更新をTimesTenキャッシュ表に自動的にリフレッシュできます。 自動リフレッシュは、明示的にロードされるキャッシュ・グループまたは動的キャッシュ・グループに対して定義できます。

キャッシュ・グループの自動リフレッシュの詳細は、「AUTOREFRESHキャッシュ・グループ属性」を参照してください。

明示的にロードされるキャッシュ・グループのキャッシュ表にはデータを手動で事前ロードします。 動的キャッシュ・グループの場合、データはリクエストに応じてキャッシュ表にロードされます。特定の文がキャッシュ表でデータを検出できないと、キャッシュされたOracle表からキャッシュ・インスタンスが自動的にロードされるためです。

動的ロード処理の詳細は、「キャッシュ・グループの動的ロード」を参照してください。

動的キャッシュ・グループは通常、使用されなくなったデータをキャッシュ表から自動的にエージ・アウトするように構成されます。

キャッシュ・グループのロードおよびリフレッシュ

キャッシュされたOracle表からTimesTenキャッシュ表にキャッシュ・インスタンスを手動で挿入または更新するには、LOAD CACHE GROUP文またはREFRESH CACHE GROUP文を使用します。 キャッシュ・グループのロードとリフレッシュの違いは次のとおりです。

ほとんどのキャッシュ・グループ・タイプで、LOAD CACHE GROUP文またはREFRESH CACHE GROUP文のWHERE句を使用して、キャッシュ表にロードまたはリフレッシュされる行を限定できます。

キャッシュ表定義にWHERE句が使用されていると、LOAD CACHE GROUP文またはREFRESH CACHE GROUP文でWHERE句が使用されていなくても、WHERE句の条件を満たす行のみがキャッシュ表にロードまたはリフレッシュされます。

グローバル・キャッシュ・グループに対してREFRESH CACHE GROUP文を発行できるのは、WITH ID句が含まれている場合のみです。

キャッシュ・グループに時間ベースのエージング・ポリシーが定義されている場合、ルート表の行のタイムスタンプがエージング・ポリシーの存続期間内にあるキャッシュ・インスタンスのみがキャッシュ表にロードまたはリフレッシュされます。

ロード処理またはリフレッシュ処理が単一のトランザクション内で多数のキャッシュ・インスタンスを処理したために同時実行性およびスループットが大幅に低下する事態を避けるため、WITH ID句を使用していないかぎり、COMMIT EVERY n ROWS句を使用して、コミット頻度を指定する必要があります。 COMMIT EVERY 0 ROWSを指定すると、ロード処理またはリフレッシュ処理は単一のトランザクションで処理されます。

COMMIT EVERY n ROWS句を使用するLOAD CACHE GROUP文またはREFRESH CACHE GROUP文は、独自のトランザクションで実行する必要があり、同じトランザクション内で他の処理を実行しないようにします。

例5-1 キャッシュ・グループのロード

次の文では、キャッシュされたOracle表からcustomer_ordersキャッシュ・グループのTimesTenキャッシュ表に新しいキャッシュ・インスタンスをロードします。

LOAD CACHE GROUP customer_orders COMMIT EVERY 256 ROWS

例5-2 WHERE句を使用したキャッシュ・グループのロード

次の文では、キャッシュされたOracle表からnew_customersキャッシュ・グループのTimesTenキャッシュ表に、顧客番号が5000以上の顧客の新しいキャッシュ・インスタンスをロードします。

LOAD CACHE GROUP new_customers WHERE (oratt.customer.cust_num >= 5000)
COMMIT EVERY 256 ROWS

例5-3 キャッシュ・グループのリフレッシュ

次の文では、キャッシュされたOracle表からtop_productsキャッシュ・グループ内のTimesTenキャッシュ表にキャッシュ・インスタンスをリフレッシュします。

REFRESH CACHE GROUP top_products COMMIT EVERY 256 ROWS

例5-4 WHERE句を使用したキャッシュ・グループのリフレッシュ

次の文では、キャッシュされたOracle表からupdate_anywhere_customersキャッシュ・グループ内のTimesTenキャッシュ表に、zipコードが60610である顧客のキャッシュ・インスタンスをリフレッシュします。

REFRESH CACHE GROUP update_anywhere_customers
WHERE (oratt.customer.zip = '60610') COMMIT EVERY 256 ROWS

詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のLOAD CACHE GROUPおよびREFRESH CACHE GROUPに関する説明を参照してください。

自動リフレッシュ・キャッシュ・グループのロードおよびリフレッシュ

明示的にロードされるキャッシュ・グループの自動リフレッシュ状態がPAUSEDである場合、キャッシュ・グループに対して発行されたLOAD CACHE GROUP文またはREFRESH CACHE GROUP文が完了すると、自動リフレッシュ状態はONに変更されます。

動的キャッシュ・グループの自動リフレッシュ状態がPAUSEDである場合、次のイベントのいずれかが発生すると、自動リフレッシュ状態はONに変更されます。

  • そのキャッシュ表は当初空であり、その後、キャッシュ・グループに対して発行された動的ロード、LOAD CACHE GROUP文または無条件のREFRESH CACHE GROUP文が完了します。

  • そのキャッシュ表は空ではなく、その後、キャッシュ・グループに対して発行された無条件のREFRESH CACHE GROUP文が完了します。

動的キャッシュ・グループの自動リフレッシュ状態がPAUSEDである場合、次のイベントのいずれかが発生すると、自動リフレッシュ状態はPAUSEDのままとなります。

  • そのキャッシュ表は当初空であり、その後、キャッシュ・グループに対して発行されたREFRESH CACHE GROUP .. WITH ID文が完了します。

  • そのキャッシュ表は空ではなく、その後、キャッシュ・グループに対して発行された動的ロード、REFRESH CACHE GROUP .. WITH ID文またはLOAD CACHE GROUP文が完了します。

自動リフレッシュ・キャッシュ・グループを手動でロードまたはリフレッシュする場合は、次の制限が適用されます。

  • キャッシュ・グループが動的である場合を除いて、LOAD CACHE GROUP文を発行できるのはキャッシュ表が空の場合のみです。

  • LOAD CACHE GROUP文を発行するには、キャッシュ・グループが動的である場合を除いて、自動リフレッシュ状態がPAUSEDになっている必要があります。キャッシュ・グループが動的である場合、自動リフレッシュの状態はPAUSEDまたはONである必要があります。

  • REFRESH CACHE GROUP文を発行するには、自動リフレッシュ状態がPAUSEDになっている必要があります。

  • キャッシュ・グループが動的な場合を除いて、LOAD CACHE GROUP文にWHERE句を含めることはできません。キャッシュ・グループが動的な場合、WHERE句の後にはCOMMIT EVERY n ROWS句を続ける必要があります。

  • キャッシュ・グループが動的でないかぎり、LOAD CACHE GROUP文またはREFRESH CACHE GROUP文にWITH ID句を含めることはできません。

  • REFRESH CACHE GROUP文にWHERE句を含めることはできません。

  • キャッシュ・グループのロード時にWHERE句で参照されるすべての表および列は、完全修飾されている必要があります。 たとえば、user_name.table_nameおよびuser_name.table_name.column_nameとなります。

明示的にロードされるキャッシュ・グループに対して自動リフレッシュ処理が発生すると、前回の自動リフレッシュ・サイクル以降に、キャッシュされたOracle表にコミットされたすべての挿入、更新および削除がキャッシュ表にリフレッシュされます。新しいキャッシュ・インスタンスがキャッシュ表にロードされる場合があります。キャッシュ表にすでに存在するキャッシュ・インスタンスは、キャッシュされたOracle表にある対応する行が更新または削除されると、更新または削除されます。

動的キャッシュ・グループの場合、キャッシュ表の既存のキャッシュ・インスタンスのみがリフレッシュされるため、自動リフレッシュ処理は前回の自動リフレッシュ・サイクル以降にキャッシュされたOracle表にコミットされた更新および削除のみをキャッシュ表にリフレッシュします。新しいキャッシュ・インスタンスはキャッシュ表にロードされません。新しいキャッシュ・インスタンスを動的キャッシュ・グループのキャッシュ表にロードするには、LOAD CACHE GROUP文を使用するか、または動的ロード処理を実行します。動的ロード処理の詳細は、「キャッシュ・グループの動的ロード」を参照してください。

WITH ID句を使用したキャッシュ・グループのロードおよびリフレッシュ

LOAD CACHE GROUP文またはREFRESH CACHE GROUP文のWITH ID句を使用すると、WHERE句を使用しなくても、主キー列の値に基づいてキャッシュ・グループをロードまたはリフレッシュできます。 主キーに複数の列が含まれている場合は、WITH ID句の方が同等のWHERE句よりも便利です。 WITH ID句では、キャッシュ・インスタンスを1つずつロードできます。 また、必要に応じて、ロード処理またはリフレッシュ処理を含むトランザクションをロールバックできます。一方、WHERE句を使用する同等の文では、このようなロールバックができません。WHERE句を使用するには、COMMIT EVERY n ROWS句も指定する必要があるためです。

例5-5 WITH ID句を使用したキャッシュ・グループのロード

キャッシュ・グループrecent_ordersには、(orderiditemid)を主キーとするキャッシュ表oratt.orderdetailsが1つ含まれています。 顧客が特定の注文の品目に関して問い合せる場合、指定された注文番号および品目番号のキャッシュ・インスタンスをロードすることでその情報を取得できます。

キャッシュされたOracle表oratt.orderdetailsorderid列の値が1756で、itemid列の値が573である行を含む、recent_ordersキャッシュ・グループのoratt.orderdetailsキャッシュ表をロードします。

LOAD CACHE GROUP recent_orders WITH ID (1756,573)

WHERE句を使用する同等のLOAD CACHE GROUP文は、次のとおりです。

LOAD CACHE GROUP recent_orders WHERE orderid = 1756 and itemid = 573
COMMIT EVERY 256 ROWS

キャッシュ・グループが動的でないかぎり、自動リフレッシュ・キャッシュ・グループに対して発行されるLOAD CACHE GROUP文またはREFRESH CACHE GROUP文にWITH ID句を含めることはできません。

WITH ID句とCOMMIT EVERY n ROWS句を併用することはできません。

複数表のキャッシュ・グループのロードおよびリフレッシュ

キャッシュされたOracle表が同時に更新されている間に、複数表のキャッシュ・グループをロードまたはリフレッシュする場合は、LOAD CACHE GROUP文またはREFRESH CACHE GROUP文を発行する前に、TimesTenデータベースの分離レベルをシリアライズ可能に設定します。 これにより、TimesTenはロード処理またはリフレッシュ処理中、キャッシュされたOracle表にシリアライズ可能な方法で問い合せるため、キャッシュ表にロードまたはリフレッシュされたキャッシュ・インスタンスはキャッシュされたOracle表の対応する行とトランザクション一貫性が確保されます。 キャッシュ・グループをロードまたはリフレッシュした後、TimesTenデータベースの要素にアクセスする際の同時実行性を高めるため、分離レベルをコミット読取りに設定しなおします。

数多くのキャッシュ・インスタンスのロードおよびリフレッシュにおけるパフォーマンスの向上

LOAD CACHE GROUP文またはREFRESH CACHE GROUP文でPARALLEL句を使用すると、多数のキャッシュ・インスタンスをキャッシュ・グループにロードまたはリフレッシュするときのパフォーマンスを向上できます。 ロード処理またはリフレッシュ処理を処理するときに使用するスレッドの数を指定します。 1から10のスレッドを指定できます。 1つのスレッドがキャッシュされたOracle表から行をフェッチし、他のスレッドがTimesTenキャッシュ表に行を挿入します。 システムで使用可能なCPUの数を超えるスレッドを指定しないでください。指定すると、PARALLEL句を使用しなかった場合よりもパフォーマンスが低下することがあります。

WITH ID句またはCOMMIT EVERY 0 ROWS句をPARALLEL句と併用することはできません。

例5-6 PARALLEL句を使用したキャッシュ・グループのリフレッシュ

次の文では、キャッシュされたOracle表からwestern_customersキャッシュ・グループ内のTimesTenキャッシュ表にキャッシュ・インスタンスをリフレッシュします。このことを行うために、1つのスレッドを使用してキャッシュされたOracle表から行をフェッチし、3つのスレッドを使用してその行をキャッシュ表に挿入しています。

REFRESH CACHE GROUP western_customers COMMIT EVERY 256 ROWS PARALLEL 4

明示的にロードされるキャッシュ・グループの手動によるロードおよびリフレッシュの例

明示的にロードされるAWTキャッシュ・グループにキャッシュされるOracle表の定義は、次のとおりです。このOracle表はスキーマ・ユーザーorattによって所有されています。

CREATE TABLE customer
(cust_num NUMBER(6) NOT NULL PRIMARY KEY,
 region   VARCHAR2(10),
 name     VARCHAR2(50),
 address  VARCHAR2(100))

キャッシュされたOracle表oratt.customerのデータは、次のとおりです。

CUST_NUM   REGION    NAME              ADDRESS
--------   -------   ---------------   ---------------------------
       1   West      Frank Edwards     100 Pine St. Portland OR
       2   East      Angela Wilkins    356 Olive St. Boston MA
       3   Midwest   Stephen Johnson   7638 Walker Dr. Chicago IL

次の文では、oratt.customer表をキャッシュする、明示的にロードされるAWTキャッシュ・グループnew_customersが作成されます。

CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP new_customers
FROM oratt.customer
 (cust_num NUMBER(6) NOT NULL,
  region   VARCHAR2(10),
  name     VARCHAR2(50),
  address  VARCHAR2(100),
  PRIMARY KEY(cust_num))

TimesTenキャッシュ表oratt.customerは、最初は空になっています。

Command> SELECT * FROM oratt.customer;
0 rows found.

次のLOAD CACHE GROUP文では、キャッシュされたOracle表からTimesTenキャッシュ表に3つのキャッシュ・インスタンスがロードされます。

Command> LOAD CACHE GROUP new_customers COMMIT EVERY 256 ROWS;
3 cache instances affected.
Command> SELECT * FROM oratt.customer;
< 1, West, Frank Edwards, 100 Pine St. Portland OR >
< 2, East, Angela Wilkins, 356 Olive St. Boston MA >
< 3, Midwest, Stephen Johnson, 7638 Walker Dr. Chicago IL >

新しい行の挿入、既存の行の更新および既存の行の削除によって、キャッシュされたOracle表を更新します。

SQL> INSERT INTO customer
  2  VALUES (4, 'East', 'Roberta Simon', '3667 Park Ave. New York NY');
SQL> UPDATE customer SET name = 'Angela Peterson' WHERE cust_num = 2;
SQL> DELETE FROM customer WHERE cust_num = 3;
SQL> COMMIT;
SQL> SELECT * FROM customer;
CUST_NUM   REGION    NAME              ADDRESS
--------   -------   ---------------   ---------------------------
       1   West      Frank Edwards     100 Pine St. Portland OR
       2   East      Angela Peterson   356 Olive St. Boston MA
       4   East      Roberta Simon     3667 Park Ave. New York NY

明示的にロードされるキャッシュ・グループに対して発行されたREFRESH CACHE GROUP文は、キャッシュ・グループをアンロードしてからリロードすることによって処理されます。 この結果、キャッシュ表のキャッシュ・インスタンスはキャッシュされたOracle表の行に一致します。

Command> REFRESH CACHE GROUP new_customers COMMIT EVERY 256 ROWS;
3 cache instance affected.
Command> SELECT * FROM oratt.customer;
< 1, West, Frank Edwards, 100 Pine St. Portland OR >
< 2, East, Angela Peterson, 356 Olive St. Boston MA >
< 4, East, Roberta Simon, 3667 Park Ave. New York NY >

動的キャッシュ・グループの手動によるロードおよびリフレッシュの例

動的AWTキャッシュ・グループにキャッシュされるOracle表の定義は、次のとおりです。このOracle表はスキーマ・ユーザーorattによって所有されています。

CREATE TABLE customer
(cust_num NUMBER(6) NOT NULL PRIMARY KEY,
 region   VARCHAR2(10),
 name     VARCHAR2(50),
 address  VARCHAR2(100))

キャッシュされたOracle表oratt.customerのデータは、次のとおりです。

CUST_NUM   REGION    NAME              ADDRESS
--------   -------   ---------------   ---------------------------
       1   West      Frank Edwards     100 Pine St. Portland OR
       2   East      Angela Wilkins    356 Olive St. Boston MA
       3   Midwest   Stephen Johnson   7638 Walker Dr. Chicago IL

次の文では、oratt.customer表をキャッシュする動的AWTキャッシュ・グループnew_customersが作成されます。

CREATE DYNAMIC ASYNCHRONOUS WRITETHROUGH CACHE GROUP new_customers
FROM oratt.customer
 (cust_num NUMBER(6) NOT NULL,
  region   VARCHAR2(10),
  name     VARCHAR2(50),
  address  VARCHAR2(100),
  PRIMARY KEY(cust_num))

TimesTenキャッシュ表oratt.customerは、最初は空になっています。

Command> SELECT * FROM oratt.customer;
0 rows found.

次のLOAD CACHE GROUP文では、キャッシュされたOracle表からTimesTenキャッシュ表に3つのキャッシュ・インスタンスがロードされます。

Command> LOAD CACHE GROUP new_customers COMMIT EVERY 256 ROWS;
3 cache instances affected.
Command> SELECT * FROM oratt.customer;
< 1, West, Frank Edwards, 100 Pine St. Portland OR >
< 2, East, Angela Wilkins, 356 Olive St. Boston MA >
< 3, Midwest, Stephen Johnson, 7638 Walker Dr. Chicago IL >

新しい行の挿入、既存の行の更新および既存の行の削除によって、キャッシュされたOracle表を更新します。

SQL> INSERT INTO customer
  2  VALUES (4, 'East', 'Roberta Simon', '3667 Park Ave. New York NY');
SQL> UPDATE customer SET name = 'Angela Peterson' WHERE cust_num = 2;
SQL> DELETE FROM customer WHERE cust_num = 3;
SQL> COMMIT;
SQL> SELECT * FROM customer;
CUST_NUM   REGION    NAME              ADDRESS
--------   -------   ---------------   ---------------------------
       1   West      Frank Edwards     100 Pine St. Portland OR
       2   East      Angela Peterson   356 Olive St. Boston MA
       4   East      Roberta Simon     3667 Park Ave. New York NY

動的キャッシュ・グループに対して発行されたREFRESH CACHE GROUP文では、キャッシュされたOracle表にコミットされた更新および削除のみをキャッシュ表にリフレッシュします。新しいキャッシュ・インスタンスはキャッシュ表にロードされません。 このため、既存のキャッシュ・インスタンスのみがリフレッシュされます。 その結果、キャッシュ表のキャッシュ・インスタンスの数は、キャッシュされたOracle表の行数より少ないか同じになります。

Command> REFRESH CACHE GROUP new_customers COMMIT EVERY 256 ROWS;
2 cache instances affected.
Command> SELECT * FROM oratt.customer;
< 1, West, Frank Edwards, 100 Pine St. Portland OR >
< 2, East, Angela Peterson, 356 Olive St. Boston MA >

キャッシュ表にはコミットされた挿入のみがロードされるため、後続のLOAD CACHE GROUP文では、キャッシュされたOracle表からTimesTenキャッシュ表に1つのキャッシュ・インスタンスがロードされます。 このため、新規キャッシュ・インスタンスのみがロードされます。 LOAD CACHE GROUP文が実行されても、すでにキャッシュ表に存在するキャッシュ・インスタンスは変更されません。これは、キャッシュされたOracle表の対応する行が更新または削除された場合でも同じです。

Command> LOAD CACHE GROUP new_customers COMMIT EVERY 256 ROWS;
1 cache instance affected.
Command> SELECT * FROM oratt.customer;
< 1, West, Frank Edwards, 100 Pine St. Portland OR >
< 2, East, Angela Peterson, 356 Olive St. Boston MA >
< 4, East, Roberta Simon, 3667 Park Ave. New York NY >

キャッシュ・グループの動的ロード

動的キャッシュ・グループの場合、特定のSELECT文、UPDATE文、DELETE文またはINSERT文がTimesTenキャッシュ表のいずれかに対して発行され、目的のデータがそのキャッシュ表には存在しないもののキャッシュされたOracle表には存在すると、そのデータはキャッシュされたOracle表からTimesTenキャッシュ表に自動的にロードされます。

キャッシュされたOracle表の行が文のWHERE句の条件を満たす場合は、親表および子表の主キーと外部キー間に定義されたリレーションシップを維持するために、キャッシュ・インスタンス全体がロードされます。 動的ロード処理では、キャッシュ・グループのルート表に複数の行をロードできません。

キャッシュ表定義のWHERE句の条件を満たす行が含まれているキャッシュ・インスタンスのみがロードされます。 キャッシュ・グループに時間ベースのエージング・ポリシーが定義されている場合、キャッシュ・インスタンスをロードするには、ルート表の行のタイムスタンプがエージング・ポリシーの存続期間内にある必要があります。

動的ロードを使用すると、エージ・アウトまたは削除されたキャッシュ・インスタンスをリロードできます。 キャッシュ・グループにエージング・ポリシーを定義する方法の詳細は、「キャッシュ・グループでのエージングの実装」を参照してください。

動的キャッシュ・グループ内のキャッシュ表のデータとキャッシュされたOracle表との一貫性を確保するため、動的キャッシュ・グループでのキャッシュ表に対する更新は、明示的にロードされるキャッシュ・グループとは異なる方法で処理されます。

動的AWTキャッシュ・グループ、SWTキャッシュ・グループまたはREADONLYキャッシュ表属性を使用しないユーザー管理キャッシュ・グループのキャッシュ表に対してUPDATE文またはDELETE文が発行され、その文のWHERE句の条件を満たす行がキャッシュ表にない場合、キャッシュされたOracle表の一致する行が(存在する場合には)キャッシュ表に動的にロードされます。 ロードされた行は、キャッシュ表で更新または削除されます。 この更新処理または削除処理は、キャッシュ表が動的AWTキャッシュ・グループ、SWTキャッシュ・グループまたはPROPAGATEキャッシュ表属性を使用するユーザー管理キャッシュ・グループにある場合には、キャッシュされたOracle表に伝播されます。

挿入された行のキー値が、キャッシュされたOracle表にすでに存在する場合、動的キャッシュ・グループ内のキャッシュ表に対して発行されたINSERT文は失敗します。

サポートされているタイプの動的キャッシュ・グループのキャッシュ表に対して、キャッシュされたOracle表からTimesTenキャッシュ表にキャッシュ・インスタンスを動的にロードするSELECT文を発行できます。

付随するTimesTenデータベースをキャッシュ・グリッドにアタッチしていないかぎり、動的グローバル・キャッシュ・グループ内のキャッシュ表にキャッシュ・インスタンスを動的にロードすることはできません。 グローバル・キャッシュ・グループの詳細およびTimesTenデータベースのキャッシュ・グリッドへのアタッチの詳細は、「グローバル・キャッシュ・グループ」を参照してください。

動的ロードが利用可能なSQL文のタイプ

動的ロードは、動的キャッシュ・グループのキャッシュ表に対して発行された次のタイプの文にのみ使用できます。

  • 主キー列に等価式が含まれているSELECT、UPDATEまたはDELETE。等価式には、定数またはパラメータのみを含めることができます。例:

    SELECT * FROM oratt.customer WHERE cust_num=50
    

    主キーが複合キーの場合、SELECT文、UPDATE文またはDELETE文にはすべての主キー列の等価式を含める必要があります。例:

    UPDATE oratt.orderdetails SET quantity = 5 WHERE orderid=2280 AND itemid=663
    
  • 外部キー列に等価式が含まれているSELECT、UPDATEまたはDELETE。等価式には、定数またはパラメータのみを含めることができます。例:

    DELETE FROM oratt.cust_interests WHERE custid=364
    

    外部キーが複合キーの場合、SELECT文、UPDATE文またはDELETE文にはすべての外部キー列の等価式を含める必要があります。例:

    SELECT * FROM oratt.orders WHERE ord_num=4955 AND cust_num=716
    

動的ロードを使用できるSELECT文、UPDATE文またはDELETE文では、次の条件が満たされている必要があります。

  • 文に副問合せが含まれている場合、等価式は文の最も外側の問合せに指定する必要があります。 文が参照できるキャッシュ表は1つのキャッシュ・グループにかぎられますが、キャッシュ表以外の表も参照できます。

  • 文には、UNION、INTERSECTまたはMINUS集合演算子を含めることはできません。

キャッシュ・グループの動的ロードの例

動的AWTキャッシュ・グループにキャッシュされるOracle表の定義は、次のとおりです。このOracle表はスキーマ・ユーザーorattによって所有されています。

CREATE TABLE customer
(cust_num NUMBER(6) NOT NULL PRIMARY KEY,
 region   VARCHAR2(10),
 name     VARCHAR2(50),
 address  VARCHAR2(100))

キャッシュされたOracle表oratt.customerのデータは、次のとおりです。

CUST_NUM   REGION    NAME              ADDRESS
--------   -------   ---------------   ---------------------------
       1   West      Frank Edwards     100 Pine St., Portland OR
       2   East      Angela Wilkins    356 Olive St., Boston MA
       3   Midwest   Stephen Johnson   7638 Walker Dr., Chicago IL

次の文では、oratt.customer表をキャッシュする動的AWTキャッシュ・グループnew_customersが作成されます。

CREATE DYNAMIC ASYNCHRONOUS WRITETHROUGH CACHE GROUP new_customers
FROM oratt.customer
 (cust_num NUMBER(6) NOT NULL,
  region   VARCHAR2(10),
  name     VARCHAR2(50),
  address  VARCHAR2(100),
  PRIMARY KEY(cust_num))

TimesTenキャッシュ表oratt.customerは、最初は空になっています。

Command> SELECT * FROM oratt.customer;
0 rows found.

次のSELECT文では、キャッシュされたOracle表からTimesTenキャッシュ表に1つのキャッシュ・インスタンスを動的にロードします。

Command> SELECT * FROM oratt.customer WHERE cust_num = 1;
< 1, West, Frank Edwards, 100 Pine St., Portland OR >

次のUPDATE文では、キャッシュされたOracle表からTimesTenキャッシュ表に1つのキャッシュ・インスタンスを動的にロードし、キャッシュ表のインスタンスを更新して、その更新をキャッシュされたOracle表に自動的に伝播します。

Command> UPDATE oratt.customer SET name = 'Angela Peterson' WHERE cust_num = 2;
Command> SELECT * FROM oratt.customer;
< 1, West, Frank Edwards, 100 Pine St., Portland OR >
< 2, East, Angela Peterson, 356 Olive St., Boston MA >

キャッシュされたOracle表oratt.customerの更新データは、次のとおりです。

CUST_NUM   REGION    NAME              ADDRESS
--------   -------   ---------------   ---------------------------
       1   West      Frank Edwards     100 Pine St., Portland OR
       2   East      Angela Peterson   356 Olive St., Boston MA
       3   Midwest   Stephen Johnson   7638 Walker Dr., Chicago IL

次のDELETE文では、キャッシュされたOracle表からTimesTenキャッシュ表に1つのキャッシュ・インスタンスを動的にロードし、キャッシュ表のインスタンスを削除し、その削除をキャッシュされたOracle表に自動的に伝播します。

Command> DELETE FROM oratt.customer WHERE cust_num = 3;
Command> SELECT * FROM oratt.customer;
< 1, West, Frank Edwards, 100 Pine St., Portland OR >
< 2, East, Angela Peterson, 356 Olive St., Boston MA >

キャッシュされたOracle表oratt.customerの更新データは、次のとおりです。

CUST_NUM   REGION    NAME              ADDRESS
--------   -------   ---------------   ---------------------------
       1   West      Frank Edwards     100 Pine St., Portland OR
       2   East      Angela Peterson   356 Olive St., Boston MA

動的ロードの無効化

特定の接続内でアクセスされる動的キャッシュ・グループのすべてのキャッシュ表に対して動的ロードを無効にするには、次のメカニズムを使用します。

  • DSN属性DynamicLoadEnableを0に設定します

  • TT_DYNAMIC_LOAD_ENABLE接続オプションを指定し、Valueパラメータを0に設定したODBC関数SQLSetConnectOption()をコールします(動的ロードを無効にする同等のJDBC関数またはOCI関数はありません)。

    rc = SQLSetConnectOption(hDbc, TT_DYNAMIC_LOAD_ENABLE, 0)
    

    動的ロードを再度有効にするには、TT_DYNAMIC_LOAD_ENABLE接続オプションを指定し、Valueパラメータを1に設定したODBC関数SQLSetConnectOption()をコールします。

特定のトランザクション内でアクセスされる動的キャッシュ・グループのすべてのキャッシュ表に対して動的ロードを無効にするには、次のメカニズムを使用します。

  • ttIsqlユーティリティのset dynamicloadenable 0コマンドを使用します。

  • DynamicLoadEnableフラグを設定し、オプティマイザ値を0に設定したttOptSetFlag組込みプロシージャをコールします。

    call ttOptSetFlag('DynamicLoadEnable', 0)
    

    動的ロードを再度有効にするには、DynamicLoadEnableフラグを設定し、オプティマイザ値を1に設定したttOptSetFlag組込みプロシージャをコールします。

    DynamicLoadEnableフラグの設定は文の準備時に有効になり、文を準備してから文を実行するまでの間に設定を変更しても、文の実行時に使用されるのは準備時の設定です。トランザクションがコミットまたはロールバックされると、元の接続設定が後続のすべてのプリコンパイルされたSQL文で有効になります。

動的ロード・エラーの表示

動的ロード処理が失敗した場合はエラーを返すようにTimesTenを構成できます。 たとえば、SELECT文、UPDATE文またはDELETE文で「動的ロードが利用可能なSQL文のタイプ」に示した要件が満たされていない場合は、動的ロードが失敗します。

特定の接続内で動的ロード処理が失敗した場合にエラーを返すには、次のメカニズムを使用します。

  • DSN属性DynamicLoadErrorModeを1に設定します

  • TT_DYNAMIC_LOAD_ERROR_MODE接続オプションを指定し、Valueパラメータを1に設定したODBC関数SQLSetConnectOption()をコールします(動的ロード・エラーを表示する同等のJDBC関数またはOCI関数はありません)。

    rc = SQLSetConnectOption(hDbc, TT_DYNAMIC_LOAD_ERROR_MODE, 1)
    

    動的ロード処理が失敗してもエラーを報告しないようにするには、TT_DYNAMIC_LOAD_ERROR_MODE接続オプションを指定し、Valueパラメータを0に設定したODBC関数SQLSetConnectOption()をコールします。

特定のトランザクション内で動的ロード処理が失敗した場合にエラーを返すには、次のメカニズムを使用します。

  • ttIsqlユーティリティのset dynamicloaderrormode 1コマンドを使用します。

  • DynamicLoadErrorModeフラグを設定し、オプティマイザ値を1に設定したttOptSetFlag組込みプロシージャをコールします。

    call ttOptSetFlag('DynamicLoadErrorMode', 1)
    

    動的ロード処理が失敗してもエラーを報告しないようにするには、DynamicLoadErrorModeフラグを設定し、オプティマイザ値を0に設定したttOptSetFlag組込みプロシージャをコールします。

    DynamicLoadErrorModeフラグの設定は文の準備時に有効になり、文を準備してから文を実行するまでの間に設定を変更しても、文の実行時に使用されるのは準備時の設定です。トランザクションがコミットまたはロールバックされると、元の接続設定が後続のすべてのプリコンパイルされたSQL文で有効になります。

ユーザー管理キャッシュ・グループのフラッシュ

FLUSH CACHE GROUP文では、ユーザー管理キャッシュ・グループのTimesTenキャッシュ表にコミットされた挿入および更新をキャッシュされたOracle表に手動で伝播します。 削除はフラッシュされず、手動で伝播されません。 PROPAGATEキャッシュ表属性を使用するキャッシュ表にコミットされた挿入および更新は、すでにOracleに自動的に伝播されているため、キャッシュされたOracle表にフラッシュできません。

自動伝播では、コミットされた挿入、更新および削除が、TimesTenにコミットされた順にOracleに伝播されます。 フラッシュ処理では、キャッシュ表にコミットされた複数のトランザクションをキャッシュされたOracle表に手動で伝播できます。

AUTOREFRESHキャッシュ・グループ属性を使用するユーザー管理キャッシュ・グループはフラッシュできません。

キャッシュ表の少なくとも1つがPROPAGATEとREADONLYのいずれのキャッシュ表属性も使用していない場合には、ユーザー管理キャッシュ・グループをフラッシュできます。

キャッシュされたOracle表にフラッシュされる行を限定するには、FLUSH CACHE GROUP文でWHERE句またはWITH ID句を使用します。 詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のFLUSH CACHE GROUPに関する説明を参照してください。

例5-7 キャッシュ・グループのフラッシュ

次の文では、western_customersキャッシュ・グループのTimesTenキャッシュ表にコミットされた挿入処理および更新処理をキャッシュされたOracle表に手動で伝播します。

FLUSH CACHE GROUP western_customers

キャッシュ・グループのアンロード

UNLOAD CACHE GROUP文を使用すると、一部またはすべてのキャッシュ・インスタンスをキャッシュ・グループのキャッシュ表から削除できます。 DROP CACHE GROUP文とは異なり、キャッシュ・グループをアンロードしてもキャッシュ表自体は削除されません。

自動リフレッシュ・キャッシュ・グループでUNLOAD CACHE GROUP文を使用する場合は注意が必要です。 アンロードした行またはその関連する親行または子行をキャッシュされたOracle表で更新した場合、自動リフレッシュ処理の結果、その行がキャッシュ表に再表示されることがあります。

例5-8 キャッシュ・グループのアンロード

次の文では、customer_ordersキャッシュ・グループのすべてのキャッシュ表からすべてのキャッシュ・インスタンスを削除します。

UNLOAD CACHE GROUP customer_orders

次の同等の文では、new_customersキャッシュ・グループのキャッシュ表から顧客番号227のキャッシュ・インスタンスを削除します。

UNLOAD CACHE GROUP new_customers WITH ID (227)
UNLOAD CACHE GROUP new_customers WHERE (oratt.customer.cust_num = 227)

処理の影響を受けるキャッシュ・インスタンス数の判別

LOAD CACHE GROUP文によってロードされたキャッシュ・インスタンス、REFRESH CACHE GROUP文によってリフレッシュされたキャッシュ・インスタンス、FLUSH CACHE GROUP文によってフラッシュされたキャッシュ・インスタンスまたはUNLOAD CACHE GROUP文によってアンロードされたキャッシュ・インスタンスの数を判別するには、次のメカニズムを使用します。

パススルー・レベルの設定

アプリケーションでは、TimesTen接続に文を発行し、その文をTimesTenデータベースで実行したり、Oracle Databaseにパススルーして実行できます。

文をTimesTenデータベースまたはOracle Databaseのいずれで実行するかは、文の構成およびDSN属性PassThroughの設定によって決まります。 PassThrough属性を設定して、TimesTenでローカルに実行される文およびOracleにリダイレクトして実行される文を定義できます。

PassThrough= 0はデフォルト設定であり、すべての文がTimesTenデータベースで実行されることになります。

図5-1に示すように、PassThrough= 1を設定すると、TimesTenデータベースに存在しない表を参照している文はOracle Databaseに渡されて実行されます。 たとえば、表Aに対する更新は、キャッシュ表Aが存在するため、TimesTenデータベースで実行されます。 一方、表Gに対する更新は、キャッシュ表Gが存在しないため、Oracleにパススルーされて実行されます。

PassThrough= 1の場合、ttCacheStartなどのTimesTen組込みプロシージャ・コールはTimesTenデータベースで実行され、TimesTenに名前が認識されないプロシージャ・コールはOracle Databaseにパススルーされて実行されます。 DDL文はOracleにパススルーされません。 SELECT文を除き、DML文に無効なTimesTen構文が含まれている場合、そのDML文はOracleにパススルーされません。

図5-1 PassThrough= 1を設定した場合の動作

図5-1の説明が続きます。
「図5-1 PassThrough= 1を設定した場合の動作」の説明

読取り専用キャッシュ・グループまたはREADONLYキャッシュ表属性を使用するユーザー管理キャッシュ・グループでは、キャッシュ表に対する更新が禁止されています。 更新処理がこのいずれかのキャッシュ・グループ・タイプのキャッシュ表を参照する場合は、PassThrough= 2を設定し、文をOracle Databaseにパススルーして実行できます。 それ以外の場合、PassThrough= 2の動作はPassThrough= 1と同じです。 たとえば、図5-1のユーザー管理キャッシュ・グループについて考えてみます。 キャッシュ表AがREADONLYキャッシュ表属性を使用し、PassThrough= 2である場合、表Aに対する更新処理はOracle Databaseにパススルーされて実行されます。

PassThrough= 3を指定すると、すべての文がOracle Databaseにパススルーされて実行されます。ただし、動的AWTグローバル・キャッシュ・グループのキャッシュ表に対して発行されたINSERT文、UPDATE文およびDELETE文を除きます。これは、これらの文がTimesTenデータベースで実行されるためです。グローバル・キャッシュ・グループの詳細は、「グローバル・キャッシュ・グループ」を参照してください。

PassThrough= 4を指定すると、PassThrough= 3の場合の動作以外に、動的AWTグローバル・キャッシュ・グループのキャッシュ表に対して発行されたSELECT文のうち、動的ロード処理として処理できないすべての文がOracle Databaseにパススルーされて実行されます。

PassThrough= 5は、PassThrough= 4の動作に似ています。ただし、SELECT文がOracle Databaseにパススルーされて実行されるのは、接続内の以前のトランザクションによって動的AWTグローバル・キャッシュ・グループのキャッシュ表にコミットされたすべての更新がOracleに伝播された後になります。

AWTまたはSWTキャッシュ・グループのキャッシュ表に対して発行する場合は、更新処理をOracle Databaseにパススルーして実行することはお薦めしません。 AWTキャッシュ・グループのキャッシュ表にコミットされた更新は、キャッシュされたOracle表に自動的に非同期で伝播されます。 一方、AWTキャッシュ・グループのキャッシュ表に対する更新と同じトランザクション内で更新処理をOracle Databaseにパススルーして実行すると、キャッシュ表の更新が同期して伝播され、不適切な結果が発生する場合があります。 同じトランザクション内で、同じ表に対する更新がOracle Databaseにパススルーされて実行された場合、SWTキャッシュ・グループのキャッシュ表にコミットされた更新によって自己デッドロックが発生することがあります。

PL/SQLブロックをOracle Databaseにパススルーして実行することはできません。 また、Oracle Databaseには定義されているものの、TimesTenデータベースには定義されていないストアド・プロシージャまたは関数への参照をOracleにパススルーして実行することもできません。

どの文がTimesTenデータベースで実行され、どの文がOracle Databaseにパススルーされて実行されるかがPassThrough属性設定によってどのように決定するか、およびその状況の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のPassThroughに関する説明を参照してください。

接続またはトランザクションのパススルー・レベルの変更

現在のパススルー・レベルを上書きするには、ttIsqlユーティリティのset passthroughコマンドを使用します。このコマンドは、セッションの現在のトランザクションおよび後続のすべてのトランザクションに適用されます。

また、PassThroughフラグを指定したttOptSetFlag組込みプロシージャをコールすることによって、特定のトランザクションの設定を上書きすることもできます。 次のプロシージャ・コールは、パススルー・レベルを3に設定します。

call ttOptSetFlag('PassThrough', 3)

PassThroughフラグの設定は文の準備時に有効になり、文を準備してから文を実行するまでの間に設定を変更しても、文の実行時に使用されるのは準備時の設定です。トランザクションがコミットまたはロールバックされると、元の接続設定が後続のすべてのプリコンパイルされたSQL文で有効になります。

文のパススルー設定の判別

文がTimesTenデータベースで実行されるか、またはOracle Databaseにパススルーされて実行されるかを確認するには、TT_STMT_PASSTHROUGH_TYPE文オプションを指定したODBC関数SQLGetStmtOption()をコールします。

rc = SQLGetStmtOption(hStmt, TT_STMT_PASSTHROUGH_TYPE, &execDB)

ODBC関数SQLGetStmtOption()の出力パラメータにTT_STMT_PASSTHROUGH_NONEが返された場合、文はTimesTenで実行されます。 一方、出力パラメータにTT_STMT_PASSTHROUGH_ORACLEが返された場合、文はOracleにパススルーされて実行されます。

SQL文がTimesTenで実行されるか、またはOracleにパススルーされて実行されるかは、常にはっきりしているわけではありません。 たとえば、PassThrough= 1である場合、SELECT文の構文によって、TimesTenで実行されるか、Oracleにパススルーされるかが決まります。 この場合は、TT_STMT_PASSTHROUGH_TYPE文オプションを指定したSQLGetStmtOption()をコールする前に、SELECT文を準備します。

文のパススルー設定を確認するための同等のJDBC関数またはOCI関数はありません。