次の各項では、キャッシュ・グループに対して実行できる処理について説明します。
注意: SQL文またはSQL Developerを使用すると、この章のほとんどの処理を実行できます。SQL Developerの詳細は、『Oracle SQL Developer TimesTen In-Memory Databaseサポート・ユーザーズ・ガイド』を参照してください。 |
TimesTenキャッシュ表とキャッシュされたOracle Database表間でコミットされた更新を手動で送信するには、次のSQL文を使用します。
SQL文 | 説明 |
---|---|
LOAD CACHE GROUP |
TimesTenキャッシュ表に存在しないキャッシュ・インスタンスをキャッシュされたOracle Database表からロードします。 |
REFRESH CACHE GROUP |
TimesTenキャッシュ表内のキャッシュ・インスタンスをキャッシュされたOracle Database表からの最新データに置き換えます。 |
FLUSH CACHE GROUP |
TimesTenキャッシュ表にコミットされた更新をキャッシュされたOracle Database表に伝播します。ユーザー管理キャッシュ・グループにのみ適用可能です。 |
AWTキャッシュ・グループ、SWTキャッシュ・グループおよびPROPAGATE
キャッシュ表属性を使用するユーザー管理キャッシュ・グループの場合、TimesTenキャッシュ表にコミットされた更新はキャッシュされたOracle Database表に自動的に伝播されます。
AWTキャッシュ・グループの詳細は、「ASYNCHRONOUS WRITETHROUGH(AWT)キャッシュ・グループ」を参照してください。
SWTキャッシュ・グループの詳細は、「SYNCHRONOUS WRITETHROUGH(SWT)キャッシュ・グループ」を参照してください。
ユーザー管理キャッシュ・グループのキャッシュ表にPROPAGATE
キャッシュ表属性を使用する方法の詳細は、「PROPAGATEキャッシュ表属性」を参照してください。
読取り専用キャッシュ・グループまたはユーザー管理キャッシュ・グループにAUTOREFRESH
キャッシュ・グループ属性を使用すると、キャッシュされたOracle Database表にコミットされた更新をTimesTenキャッシュ表に自動的にリフレッシュできます。自動リフレッシュは、明示的にロードされるキャッシュ・グループまたは動的キャッシュ・グループに対して定義できます。
キャッシュ・グループの自動リフレッシュの詳細は、「AUTOREFRESHキャッシュ・グループ属性」を参照してください。
明示的にロードされるキャッシュ・グループのキャッシュ表にはデータを手動で事前ロードします。動的キャッシュ・グループの場合、データはリクエストに応じてキャッシュ表にロードされます。特定の文がキャッシュ表でデータを検出できないと、キャッシュされたOracle Database表からキャッシュ・インスタンスが自動的にロードされます。
動的ロード処理の詳細は、「キャッシュ・インスタンスの動的ロード」を参照してください。
動的キャッシュ・グループは通常、使用されなくなったデータをキャッシュ表から自動的にエージ・アウトするように構成されます。
キャッシュされたOracle Database表からTimesTenキャッシュ表にキャッシュ・インスタンスを手動で挿入または更新するには、LOAD CACHE GROUP
文またはREFRESH CACHE GROUP
文を使用します。キャッシュ・グループのロードとリフレッシュの違いは次のとおりです。
LOAD CACHE GROUP
は、キャッシュされたOracle Database表にコミットされた挿入のみをTimesTenキャッシュ表にロードします。新規キャッシュ・インスタンスはキャッシュ表にロードされますが、キャッシュ表にすでに存在するキャッシュ・インスタンスは、キャッシュされたOracle Database表にある対応する行が更新または削除されても、更新または削除されません。ロード処理は、主に、キャッシュ・グループに最初にデータを移入するために使用します。
REFRESH CACHE GROUP
は、キャッシュ表にすでに存在するキャッシュ・インスタンスを含め、TimesTenキャッシュ表のキャッシュ・インスタンスをキャッシュされたOracle Database表の最新のデータに置き換えます。リフレッシュ処理は、主に、キャッシュ・グループに最初にデータを移入した後、キャッシュされたOracle Database表にコミットされた更新でキャッシュ・グループの内容を更新するために使用します。
明示的にロードされるキャッシュ・グループの場合、リフレッシュ処理はキャッシュ・グループに対してUNLOAD CACHE GROUP
文を発行し、続いてLOAD CACHE GROUP
文を発行することと同じです。事実上、キャッシュされたOracle Database表にコミットされたすべての挿入、更新および削除がキャッシュ表にリフレッシュされます。新しいキャッシュ・インスタンスがキャッシュ表にロードされる場合があります。キャッシュ表にすでに存在するキャッシュ・インスタンスは、キャッシュされたOracle Database表にある対応する行が更新または削除されると、更新または削除されます。UNLOAD CACHE GROUP
文の詳細は、「キャッシュ・グループのアンロード」を参照してください。
動的キャッシュ・グループの場合、キャッシュ表の既存のキャッシュ・インスタンスのみがリフレッシュされるため、リフレッシュ処理はキャッシュされたOracle Database表にコミットされた更新および削除のみをキャッシュ表にリフレッシュします。新規キャッシュ・インスタンスがキャッシュ表にロードされないため、リフレッシュ処理が完了すると、キャッシュ表に含まれるキャッシュ・インスタンスの数は以前と同じか少なくなります。新しいキャッシュ・インスタンスを動的キャッシュ・グループのキャッシュ表にロードするには、LOAD CACHE GROUP
文を使用するか、または動的ロード処理を実行します。動的ロード処理の詳細は、「キャッシュ・インスタンスの動的ロード」を参照してください。
ほとんどのキャッシュ・グループ・タイプで、LOAD CACHE GROUP
文またはREFRESH CACHE GROUP
文のWHERE
句を使用して、キャッシュ表にロードまたはリフレッシュされる行を限定できます。
キャッシュ表定義にWHERE
句が使用されていると、LOAD CACHE GROUP
文またはREFRESH CACHE GROUP
文でWHERE
句が使用されていなくても、WHERE
句の条件を満たす行のみがキャッシュ表にロードまたはリフレッシュされます。
グローバル・キャッシュ・グループに対してREFRESH CACHE GROUP
文を発行できるのは、WITH ID
句が含まれている場合のみです。
キャッシュ・グループに時間ベースのエージング・ポリシーが定義されている場合、ルート表の行のタイムスタンプがエージング・ポリシーの存続期間内にあるキャッシュ・インスタンスのみがキャッシュ表にロードまたはリフレッシュされます。
ロード処理またはリフレッシュ処理が単一のトランザクション内で多数のキャッシュ・インスタンスを処理すると同時実行性およびスループットが大幅に低下するため、これを避けるには、COMMIT EVERY
n
ROWS
句を使用して、コミット頻度を指定します(WITH ID
句を使用していない場合に限る)。COMMIT EVERY 0 ROWS
を指定すると、ロード処理またはリフレッシュ処理は単一のトランザクションで処理されます。
COMMIT EVERY
n
ROWS
句を使用するLOAD CACHE GROUP
文またはREFRESH CACHE GROUP
文は、独自のトランザクションで実行する必要があり、同じトランザクション内で他の処理を実行しないようにします。
次の文では、キャッシュされたOracle Database表からcustomer_orders
キャッシュ・グループのTimesTenキャッシュ表に新しいキャッシュ・インスタンスをロードします。
LOAD CACHE GROUP customer_orders COMMIT EVERY 256 ROWS;
例5-2 WHERE句を使用したキャッシュ・グループのロード
次の文では、キャッシュされたOracle Database表からnew_customers
キャッシュ・グループのTimesTenキャッシュ表に、顧客番号が5000以上の顧客の新しいキャッシュ・インスタンスをロードします。
LOAD CACHE GROUP new_customers WHERE (oratt.customer.cust_num >= 5000) COMMIT EVERY 256 ROWS;
次の文では、キャッシュされたOracle Database表からtop_products
キャッシュ・グループ内のTimesTenキャッシュ表にキャッシュ・インスタンスをリフレッシュします。
REFRESH CACHE GROUP top_products COMMIT EVERY 256 ROWS;
例5-4 WHERE句を使用したキャッシュ・グループのリフレッシュ
次の文では、キャッシュされたOracle Database表から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
に変更されます。
自動リフレッシュを使用する明示的にロードされるキャッシュ・グループを手動でロードまたはリフレッシュする場合は、次の制限が適用されます。
LOAD CACHE GROUP
文を発行できるのはキャッシュ表が空の場合のみです。
LOAD CACHE GROUP
文を発行するには、自動リフレッシュ状態がPAUSED
になっている必要があります。
REFRESH CACHE GROUP
文を発行するには、自動リフレッシュ状態がPAUSED
になっている必要があります。
LOAD CACHE GROUP
文にWHERE
句を含めることはできません。
LOAD CACHE GROUP
文またはREFRESH CACHE GROUP
文にWITH ID
句を含めることはできません。
REFRESH CACHE GROUP
文にWHERE
句を含めることはできません。
キャッシュ・グループのロード時にWHERE
句で参照されるすべての表および列は、完全修飾されている必要があります。例:
user_name
.
table_name
およびuser_name
.
table_name
.
column_name
明示的にロードされるキャッシュ・グループに対して自動リフレッシュ処理が発生すると、前回の自動リフレッシュ・サイクル以降に、キャッシュされたOracle Database表にコミットされたすべての挿入、更新および削除がキャッシュ表にリフレッシュされます。新しいキャッシュ・インスタンスがキャッシュ表にロードされる場合があります。キャッシュ表にすでに存在するキャッシュ・インスタンスは、キャッシュされたOracle Database表にある対応する行が更新または削除されると、更新または削除されます。
動的キャッシュ・グループの自動リフレッシュ状態が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
文が完了します。
動的キャッシュ・グループの場合、キャッシュ表の既存のキャッシュ・インスタンスのみがリフレッシュされるため、自動リフレッシュ処理は前回の自動リフレッシュ・サイクル以降にキャッシュされたOracle Database表にコミットされた更新および削除のみをキャッシュ表にリフレッシュします。新しいキャッシュ・インスタンスはキャッシュ表にロードされません。新しいキャッシュ・インスタンスを動的キャッシュ・グループのキャッシュ表にロードするには、LOAD CACHE GROUP
文を使用するか、または動的ロード処理を実行します。動的ロード処理の詳細は、「キャッシュ・インスタンスの動的ロード」を参照してください。
自動リフレッシュを使用する動的キャッシュ・グループを手動でロードまたはリフレッシュする場合は、次の制限が適用されます。
LOAD CACHE GROUP
文を発行するには、自動リフレッシュ状態がPAUSED
またはON
になっている必要があります。
REFRESH CACHE GROUP
文を発行するには、自動リフレッシュ状態がPAUSED
になっている必要があります。
WHERE
句を含むLOAD CACHE GROUP
文には、WHERE
句の後にCOMMIT EVERY
n
ROWS
句が含まれている必要があります。
REFRESH CACHE GROUP
文にWHERE
句を含めることはできません。
キャッシュ・グループのロード時にWHERE
句で参照されるすべての表および列は、完全修飾されている必要があります。例:
user_name
.
table_name
およびuser_name
.
table_name
.
column_name
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には、(
orderid
, itemid
)
を主キーとするキャッシュ表oratt.orderdetails
が1つ含まれています。顧客が特定の注文の品目に関して問い合せる場合、指定された注文番号および品目番号のキャッシュ・インスタンスをロードすることでその情報を取得できます。
キャッシュされたOracle Database表oratt.orderdetails
のorderid
列の値が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 Database表が更新されている場合は、ttCacheAutorefresh
組込みプロシージャをコールできます。ttCacheAutorefresh
組込みプロシージャにより、即時リフレッシュ処理が開始され、ttCacheAutorefresh
の起動時に開始されるように自動リフレッシュ・サイクルがリセットされます。キャッシュ・グループの構成方法に基づいて、完全リフレッシュ処理または増分リフレッシュ処理が行われます。ttCacheAutorefresh
をコールする場合は、自動リフレッシュの状態がON
である必要があります。
通常、自動リフレッシュ処理では、同じリフレッシュ間隔を共有するすべてのキャッシュ・グループのリフレッシュを、これらのキャッシュ・グループ間のトランザクション一貫性を維持するために、1つのトランザクションで行います。したがって、ttCacheAutorefresh
をコールするときに特定のキャッシュ・グループを指定しても、自動リフレッシュ処理は、指定したキャッシュ・グループと自動リフレッシュ間隔を共有するすべてのキャッシュ・グループに対して1つのトランザクションで発生します。既存のトランザクションに表ロックされているオブジェクトがあり、それらのオブジェクトが対象となるキャッシュ・グループに属している場合、ttCacheAutofresh
は何もアクションを行わずにエラーを返します。
ttCacheAutorefresh
の実行は、非同期(デフォルト)または同期を選択できます。同期モードでは、リフレッシュ処理が失敗すると、ttCacheAutorefresh
はエラーを返します。
ttCacheAutorefresh
のコール後は、トランザクションをコミットまたはロールバックしてから、後続の作業を実行する必要があります。
キャッシュされたOracle Database表が同時に更新されている間に、複数表のキャッシュ・グループをロードまたはリフレッシュする場合は、LOAD CACHE GROUP
文またはREFRESH CACHE GROUP
文を発行する前に、TimesTenデータベースの分離レベルをシリアライズ可能に設定します。これにより、TimesTenはロード処理またはリフレッシュ処理中、キャッシュされたOracle Database表にシリアライズ可能な方法で問い合せるため、キャッシュ表にロードまたはリフレッシュされたキャッシュ・インスタンスはキャッシュされたOracle Database表の対応する行とトランザクション一貫性が確保されます。キャッシュ・グループをロードまたはリフレッシュした後、TimesTenデータベースの要素にアクセスする際の同時実行性を高めるため、分離レベルをコミット読取りに設定しなおします。
LOAD CACHE GROUP
文またはREFRESH CACHE GROUP
文でPARALLEL
句を使用すると、多数のキャッシュ・インスタンスをキャッシュ・グループにロードまたはリフレッシュするときのパフォーマンスを向上できます。ロード処理またはリフレッシュ処理を行う場合に使用するスレッド数を指定します。1から10のスレッドを指定できます。1つのスレッドがキャッシュされたOracle Database表から行をフェッチし、他のスレッドがTimesTenキャッシュ表に行を挿入します。システムで使用可能なCPU数を超えるスレッドを指定すると、PARALLEL
句を使用しなかった場合よりもパフォーマンスが低下することがありますので、このような指定を行わないでください。
注意: WITH ID 句をPARALLEL 句と併用することはできません。COMMIT EVERY n ROWS 句は、n が0より大きな値であるかぎり、PARALLEL 句と併用できます。また、データベース・レベルのロックが有効になっている場合や読取り専用動的キャッシュ・グループに対してはPARALLEL 句を使用できません。詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』の「REFRESH CACHE GROUP」を参照してください。 |
明示的にロードされるAWTキャッシュ・グループにキャッシュされるOracle Database表の定義は、次のとおりです。Oracle Database表は、スキーマ・ユーザーoratt
が所有しています。
CREATE TABLE customer (cust_num NUMBER(6) NOT NULL PRIMARY KEY, region VARCHAR2(10), name VARCHAR2(50), address VARCHAR2(100));
次に、キャッシュされたOracle Database表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 Database表から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 Database表を更新します。
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 Database表の行に一致します。
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 Database表の定義は、次のとおりです。Oracle Database表は、スキーマ・ユーザーoratt
が所有しています。
CREATE TABLE customer (cust_num NUMBER(6) NOT NULL PRIMARY KEY, region VARCHAR2(10), name VARCHAR2(50), address VARCHAR2(100));
次に、キャッシュされたOracle Database表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 Database表から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 Database表を更新します。
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 Database表にコミットされた更新および削除のみをキャッシュ表にリフレッシュします。新しいキャッシュ・インスタンスはキャッシュ表にロードされません。このため、既存のキャッシュ・インスタンスのみがリフレッシュされます。その結果、キャッシュ表のキャッシュ・インスタンスの数は、キャッシュされたOracle Database表の行数より少ないか同じになります。
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 Database表からTimesTenキャッシュ表に1つのキャッシュ・インスタンスがロードされます。このため、新規キャッシュ・インスタンスのみがロードされます。LOAD CACHE GROUP
文によって、すでにキャッシュ表に存在するキャッシュ・インスタンスは変更されません(これは、キャッシュされたOracle Database表の対応する行が更新または削除された場合でも同じです)。
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
文、INSERT
文、UPDATE
文またはDELETE
文がTimesTenキャッシュ表のいずれかに対して発行され、目的のデータがそのキャッシュ表には存在しないもののキャッシュされたOracle Database表には存在すると、そのデータはキャッシュされたOracle Database表からTimesTenキャッシュ表に自動的にロードされます。
注意: ただし、Oracle Databaseが停止している場合は、次のエラーが返されます。5219: Temporary Oracle connection failure error in OCISessionBegin(): ORA-01034: ORACLE not available |
動的ロードは単一のキャッシュ・インスタンスを取得します。このインスタンスはOracle DatabaseからTimesTenデータベースへ自動的にロードされるか、または動的グローバル・キャッシュ・グループの場合はインスタンスを所有するグリッド・メンバーから要求元のグリッド・メンバーに転送されます。キャッシュ・インスタンスは任意のキャッシュ・グループのルート表の行(主キーまたは一意索引によりルート表で一意に識別されます)および外部キー関係で関連付けられた子表のすべての関連行で構成されます。
キャッシュされたOracle Database表の行が文のWHERE
句の条件を満たす場合は、親表および子表の主キーと外部キー間に定義されたリレーションシップを維持するために、関連するキャッシュ・インスタンス全体がロードされます。動的ロード処理では、どのキャッシュ・グループのルート表にも複数の行をロードできません。キャッシュ表定義のWHERE
句の条件を満たす行が含まれているキャッシュ・インスタンスのみがロードされます。
WHERE
句は、動的ロードを発生させるために次のいずれかを指定する必要があります。
キャッシュ・グループのいずれかの表に関する主キーまたは外部キーのすべての列に対して定数またはパラメータ、あるいはその両方を持つ等価条件。複数のキャッシュ・グループの表を参照する場合、各表は主キーおよび外部キーの関係について等価条件で接続される必要があります。
一意索引のすべての列に対する等価条件またはIS NULL
条件の組合せ(最低1つの等価条件を使用する場合)。つまり、一意索引の一部の列がNULL
である動的ロードを実行できます。一意索引は、キャッシュ・グループのルート表で作成する必要があります。
注意: ルート表の主キー検索に基づいた動的ロードの方が、子表に対する主キー検索または子表に対する外部キー検索よりも、パフォーマンスが速くなります。 |
動的ロードは、動的ロードをトリガーするユーザー・トランザクションとは別のトランザクションで実行されます。動的ロード・トランザクションは、動的ロードをトリガーするSQL文が実行を終了する前にコミットされます。したがって、ユーザー・トランザクションがロールバックされる場合、動的にロードされたデータはキャッシュ・グループに残ったままになります。
グローバル・キャッシュ・グループの場合、これらのキャッシュ・グループで動的ロードが可能になるには、TimesTenデータベースがキャッシュ・グリッドへアタッチされている必要があります。グローバル・キャッシュ・グループの詳細およびTimesTenデータベースのキャッシュ・グリッドへのアタッチの詳細は、「グローバル・キャッシュ・グループ」を参照してください。
次の各項ではキャッシュ・グループの動的ロードについて説明します。
動的ロードは、次のようにして、DynamicLoadEnable
接続属性で構成できます。
0: 現在の接続について、TimesTenの動的キャッシュ・グループへのOracle Databaseデータの動的ロードを無効にします。
1 (デフォルト): 現在の接続について、TimesTenの動的キャッシュ・グループへのOracle Databaseデータの動的ロードを1文ごとに有効にします。文は1つの動的キャッシュ・グループの表のみを参照する必要があり、その表は主問合せのみで参照される必要があります。文はキャッシュ表以外の表を参照することもできます。ロードできるキャッシュ・インスタンスは1つだけです。
2: 現在の接続について、1文に対して1つ以上のTimesTen動的キャッシュ・グループへのOracle Databaseデータの動的ロードを有効にします。参照される表は複数のキャッシュ・グループ内に存在することが可能です。主問合せで参照されるすべてのキャッシュ・グループは動的にロードされます。副問合せのみで参照されるいずれのキャッシュ・グループも動的ロードについては無視されます。文はキャッシュ表以外の表を参照することもできます。ロードできるキャッシュ・インスタンスは1つだけです。
DynamicLoadEnable
接続属性に適切な値を設定して、特定の接続内でアクセスされる動的キャッシュ・グループ内のすべてのキャッシュ表の動的ロードのタイプを構成します。
特定のトランザクションについて動的ロードを有効化または無効化するには、DynamicLoadEnable
オプティマイザ・ヒントを設定できます。ただし、DynamicLoadEnable
接続属性はどのタイプの動的ロードを有効にするかを構成する唯一の方法です。
次のいずれかの方法によりDynamicLoadEnable
オプティマイザ・ヒントを設定します。
DynamicLoadEnable
フラグを希望の値に設定し、ttOptSetFlag
組込みプロシージャをコールします。次の例では動的ロードを1に設定しています。
call ttOptSetFlag('DynamicLoadEnable', 1)
注意: 詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のDynamicLoadEnableに関する説明"、ttIsqlに関する説明またはttOptSetFlagに関する説明を参照してください。属性は、 |
動的ロードは主問合せで参照される各キャッシュ・グループについて、最大1つのキャッシュ・インスタンスを取得します。この項では動的ロードが発生する状態のガイドラインの詳細を説明します。
動的ロードは、動的キャッシュ・グループのキャッシュ表に対して発行された次のタイプの文にのみ使用できます。
INSERT
文が、現在TimesTenの表には存在していないキャッシュ・インスタンスのいずれかの子表に値を挿入する場合、新しい行が所属するキャッシュ・インスタンスは動的にロードされます。新しい子の行に対するこの挿入処理は、キャッシュされたOracle Database表に伝播されます。
SELECT
文、UPDATE
文またはDELETE
文では、WHERE
句に「キャッシュ・インスタンスの動的ロード」で説明されている条件が存在する必要があります。
動的ロードを使用できるSELECT
文、UPDATE
文またはDELETE
文では、次の条件が満たされている必要があります。
文に副問合せが含まれていた場合、主問合せで参照される表を持つキャッシュ・グループのみが動的ロードの対象とみなされます。
文がキャッシュ・グループの複数の表を参照する場合、その文にはすべての親子関係の主キーと外部キーの間の等結合条件が含まれている必要があります。
文には、UNION
、INTERSECT
またはMINUS
集合演算子を含めることはできません。
文はキャッシュ表以外の表を参照することができます。
デフォルトで、文が参照できるキャッシュ表は1つの動的キャッシュ・グループに限られます。この動作はDynamicLoadEnable
が1に設定されている場合に有効になります。ただし、DynamicLoadEnable
が2に設定されている場合、文は複数の動的キャッシュ・グループのキャッシュ表を参照できます。詳細は「動的ロード構成」を参照してください。
動的ロードの動作はDynamicLoadEnable
の設定により異なります。次に、動的ロードが発生するかどうかを判別するために評価されるルールを説明します。これらのルールはDynamicLoadEnable
が1または2に設定されている場合に守られます。
キャッシュ・グループに対する動的ロードは、キャッシュ・グループの任意の表がいずれかのFROM
句で複数回指定されている場合には発生しません。
問合せで明示的に指定された条件のみが動的ロードの対象とみなされ、これにはいずれの派生条件も含まれません。
任意のキャッシュ・グループが副問合せでのみ参照される場合、動的ロードの対象とはみなされません。
キャッシュ・グループに時間ベースのエージング・ポリシーが定義されている場合、キャッシュ・インスタンスをロードするには、ルート表の行のタイムスタンプがエージング・ポリシーの存続期間内にある必要があります。キャッシュ・グループにエージング・ポリシーを定義する方法の詳細は、「キャッシュ・グループでのエージングの実装」を参照してください。
アクティブ・スタンバイ・ペア・レプリケーション・スキームを使用するときには、動的ロードはどのサブスクライバでも発生することができません。
DynamicLoadEnable
が2に設定されて動的ロードが有効になっている場合、文に複数の動的キャッシュ・グループを含めることができます。動的ロードが発生するかどうかを決定するこの条件のルールは次のとおりです。
ある問合せ内に複数のキャッシュ・グループが存在している場合、動的ロードの必要条件を満たすキャッシュ・グループが動的ロードの対象とみなされます。動的ロード条件を満たしていないキャッシュ・グループは動的ロードの対象とはみなされません。
いずれかの動的キャッシュ・グループの表が主問合せで参照される場合、それらの表は、副問合せで任意のキャッシュ・グループの他の表が参照されても動的ロードの対象とみなされます。
次の考慮事項は動的ロードに影響を与える可能性があります。
複数のキャッシュ・グループ内の表またはキャッシュ・グループ以外の表が主問合せで指定された場合は、キャッシュ・インスタンスがロードされるかどうかは結合順序により影響を受けます。問合せの実行中に動的ロードが可能で問合せの結果を出すことが必要な場合、動的ロードが発生します。ただし、返される行がない場合、一部またはすべてのキャッシュ・インスタンスが動的にロードされません。
文がキャッシュ・グループの表に対して複数の動的ロード条件を指定した場合、追加条件がその文に適格ではない場合もキャッシュ・インスタンスが動的にロードされる場合があります。
動的AWTキャッシュ・グループにキャッシュされるOracle Database表の定義は、次のとおりです。Oracle Database表は、スキーマ・ユーザーoratt
が所有しています。
CREATE TABLE customer (cust_num NUMBER(6) NOT NULL PRIMARY KEY, region VARCHAR2(10), name VARCHAR2(50), address VARCHAR2(100)); CREATE TABLE orders (ord_num NUMBER(10) NOT NULL PRIMARY KEY, cust_num NUMBER(6) NOT NULL, when_placed DATE NOT NULL, when_shipped DATE NOT NULL); CREATE TABLE orderdetails (orderid NUMBER(10) NOT NULL, itemid NUMBER(8) NOT NULL, quantity NUMBER(4) NOT NULL, PRIMARY KEY (orderid, itemid));
たとえば、次に、キャッシュされたOracle Database表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
、oratt.orders
、およびoratt.orderdetails
表をキャッシュする動的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)), oratt.orders (ord_num NUMBER(10) NOT NULL, cust_num NUMBER(6) NOT NULL, when_placed DATE NOT NULL, when_shipped DATE NOT NULL, PRIMARY KEY(ord_num), FOREIGN KEY(cust_num) REFERENCES oratt.customer(cust_num)), oratt.orderdetails (orderid NUMBER(10) NOT NULL, itemid NUMBER(8) NOT NULL, quantity NUMBER(4) NOT NULL, PRIMARY KEY(orderid, itemid), FOREIGN KEY(orderid) REFERENCES oratt.orders(order_num));
DynamicLoadEnable
が1に設定されている場合は、次の例を使用できます。
TimesTenキャッシュ表oratt.customer
は、最初は空になっています。
Command> SELECT * FROM oratt.customer; 0 rows found.
oratt.customer
表の主キーに対して等価条件を持つ、次のSELECT
文では動的ロードが発生します。
Command> SELECT * FROM oratt.customer WHERE cust_num = 1; < 1, West, Frank Edwards, 100 Pine St., Portland OR >
ただし、主キーに対して等価条件を使用しない場合、動的ロードは発生しません。
Command> SELECT * FROM oratt.customer WHERE cust_num IN (1,2);
次の例では、複合主キーのすべての主キー列に等価式が含まれています。orderdetails
表にはorderid
とitemid
の複合主キーがあります。
UPDATE oratt.orderdetails SET quantity = 5 WHERE orderid=2280 AND itemid=663;
次の例はorders
子表へのINSERT
を示しており、これにより動的ロードが開始されます。ただし、親表であるcustomer
への挿入を試行した場合、動的ロードは発生しません。
INSERT INTO orders VALUES(1,1, DATE '2012-01-25', DATE '2012-01-30');
次のUPDATE
文では、キャッシュされたOracle Database表からTimesTenキャッシュ表に1つのキャッシュ・インスタンスを動的にロードし、キャッシュ表のインスタンスを更新して、その更新をキャッシュされたOracle Database表に自動的に伝播します。
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 Database表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 Database表からTimesTenキャッシュ表に1つのキャッシュ・インスタンスを動的にロードし、キャッシュ表のインスタンスを削除し、その削除をキャッシュされたOracle Database表に自動的に伝播します。
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 Database表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
次に、ルート表で一意索引のすべての列を使用して実行される動的ロードの例を示します。departments
表は、動的AWTキャッシュ・グループで定義されます。manager_id
およびlocation_id
で構成されるこのキャッシュ・グループで一意索引が作成されます。
次のようにして、Oracle Databaseでdepartments表を作成します。
Command> CREATE TABLE departments( > department_id INT NOT NULL PRIMARY KEY, > department_name VARCHAR(10) NOT NULL, > technical_lead INT NOT NULL, > manager_id INT, > location_id INT NOT NULL);
次のようにして、dept_cg
ルート表で動的AWTキャッシュ・グループおよび一意索引を作成します。
Command> CREATE DYNAMIC ASYNCHRONOUS WRITETHROUGH CACHE GROUP dept_cg > FROM departments > (department_id INT NOT NULL PRIMARY KEY, > department_name VARCHAR(10) NOT NULL, > technical_lead INT NOT NULL, > manager_id INT, location_id INT NOT NULL); Command> CREATE UNIQUE INDEX dept_idx ON departments(manager_id, location_id);
次のようにして、Oracle Databaseでdepartments表に3つのレコードを挿入します。
Command> insert into departments values (1, 'acct', 1, 1, 100); 1 row inserted. Command> insert into departments values (2, 'legal', 2, 2, 200); 1 row inserted. Command> insert into departments values (3, 'owner', 3, NULL, 300); 1 row inserted. Command> commit;
TimesTenで、一意索引に基づいてキャッシュ・インスタンスを動的にロードします。
Command> SELECT * FROM departments; 0 rows found. Command> SELECT * FROM departments WHERE manager_id IS NULL AND location_id=300; < 3, owner, 3, <NULL>, 300 > 1 row found. Command> SELECT * FROM departments; < 3, owner, 3, <NULL>, 300 > 1 row found. Command> SELECT * FROM departments WHERE manager_id=2 AND location_id=200; < 2, legal, 2, 2, 200 > 1 row found. Command> SELECT * FROM departments; < 2, legal, 2, 2, 200 > < 3, owner, 3, <NULL>, 300 > 2 rows found.
以降の例は、複数のキャッシュ・グループにわたって表を参照する場合の動的ロードの使用方法を示しています(動的ロードはDynamicLoadEnable
が2に設定されている場合に有効になります)。
次の文では、それぞれのグループがOracle Databaseからキャッシュされる1つ以上の表を持つ、複数の動的AWTキャッシュ・グループが作成されます。
CREATE DYNAMIC CACHE GROUP cachegrp FROM table1(x1 INT PRIMARY KEY, y1 INT); CREATE DYNAMIC CACHE GROUP cachegrp2 FROM table2(x2 INT PRIMARY KEY, y2 INT), table3(x3 INT PRIMARY KEY, y3 INT, FOREIGN KEY(y3) REFERENCES table2(x2); CREATE DYNAMIC CACHE GROUP cachegrp3 FROM table4(x4 INT PRIMARY KEY, y4 INT); CREATE TABLE table5 (x5 INT PRIMAY KEY,y5 INT);
次の例は、オプティマイザがx1
が1と等しくなる必要がある結果を導出する可能性がある場合でも、動的ロードが発生しないことを示しています。
SELECT * FROM table1, table5 WHERE x5=1 AND x5=x1;
cachegrp2
内のtable2
のキャッシュ・インスタンスに対しては、table2
が主問合せで参照されるため、動的ロードが検討されます。
SELECT * FROM table5, table2 WHERE x5 IN (SELECT y2 FROM table2, table3 where x2=1 and x2=y3);
cachegrp2
キャッシュ・グループのキャッシュ・インスタンスは、そのすべての表が副問合せで参照されるため、動的ロードの対象とみなされません。
SELECT * FROM table5 WHERE x5 IN (SELECT y3 FROM table2, table3 WHERE x2=1 AND x2=y3);
次の例で、x1=1
のtable1
から取得される行がまだキャッシュされていなかった場合、table1
のキャッシュ・インスタンスがロードされるかどうかは結合順序に依存します。結合順序が「table5 table1
」である場合、table1
のキャッシュ・インスタンスはx5=1
であるtable5
に行が存在する場合、そしてその場合にのみロードされます。結合順序が「table1 table5
」であれば、table1
のキャッシュ・インスタンスは常にロードされます。
SELECT * FROM table1, table5 WHERE x1=1 AND x5=1;
行(1,1)はtable1
に対してロードされる場合がありますが、SELECT
はどの行も返しません。
SELECT * FROM table1 WHERE x1=1 AND y1>1;
SELECT
文、UPDATE
文またはDELETE
文で「動的ロードのガイドライン」に示した要件が満たされていない場合はエラーを返すようにTimesTenを構成できます。DynamicLoadErrorMode
接続属性は、アプリケーションが動的キャッシュ・グループに対してSQL処理を実行する場合、およびSQL処理で動的ロードが使用できない場合の動作を制御します。
DynamicLoadErrorMode
が値0に設定されている場合、問合せで参照される、動的ロードに適格なすべてのキャッシュ・グループに動的ロードが発生します。適格ではないキャッシュ・グループは動的にロードされず、エラーは返されません。DynamicLoadEnable=1
のとき、問合せが複数のキャッシュ・グループを参照する場合は動的ロードが発生しません。
DynamicLoadErrorMode
が値1に設定されているとき、問合せで参照されるどの動的キャッシュ・グループも動的ロードに適格ではない場合、その問合せは失敗します。このエラーは、動的ロードが発生できない理由を示します。
この接続属性を特定のトランザクションにのみ設定するには、次のいずれかを使用します。
FLUSH CACHE GROUP
文では、ユーザー管理キャッシュ・グループのTimesTenキャッシュ表にコミットされた挿入および更新をキャッシュされたOracle Database表に手動で伝播します。削除はフラッシュされず、手動で伝播されません。PROPAGATE
キャッシュ表属性を使用するキャッシュ表にコミットされた挿入および更新は、すでにOracle Databaseに自動的に伝播されているため、キャッシュされたOracle Database表にフラッシュできません。
自動伝播では、コミットされた挿入、更新および削除が、TimesTenにコミットされた順にOracle Databaseに伝播されます。フラッシュ処理では、キャッシュ表にコミットされた複数のトランザクションをキャッシュされたOracle Database表に手動で伝播できます。
AUTOREFRESH
キャッシュ・グループ属性を使用するユーザー管理キャッシュ・グループはフラッシュできません。
キャッシュ表の少なくとも1つがPROPAGATE
とREADONLY
のいずれのキャッシュ表属性も使用していない場合には、ユーザー管理キャッシュ・グループをフラッシュできます。
キャッシュされたOracle Database表にフラッシュされる行を限定するには、FLUSH CACHE GROUP
文でWHERE
句またはWITH ID
句を使用します。詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のFLUSH CACHE GROUP文に関する説明を参照してください。
UNLOAD CACHE GROUP
文を使用すると、一部またはすべてのキャッシュ・インスタンスをキャッシュ・グループのキャッシュ表から削除できます。DROP CACHE GROUP
文とは異なり、キャッシュ・グループをアンロードしてもキャッシュ表自体は削除されません。
自動リフレッシュ・キャッシュ・グループでUNLOAD CACHE GROUP
文を使用する場合は注意が必要です。アンロードした行またはその関連する親行または子行をキャッシュされたOracle Database表で更新した場合、自動リフレッシュ処理の結果、その行がキャッシュ表に再表示されることがあります。
AWTキャッシュ・グループに対するUNLOAD CACHE GROUP
文の実行は、行に対する更新がOracle Databaseに伝播されるまで待機します。
アンロード処理が単一のトランザクション内で多数のキャッシュ・インスタンスを処理すると同時実行性およびスループットが大幅に低下するため、これを避けるには、COMMIT EVERY
n
ROWS
句を使用して、コミット頻度を指定します。
注意: 詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のUNLOAD CACHE GROUPに関する説明を参照してください。 |
次の文では、customer_orders
キャッシュ・グループのすべてのキャッシュ表からすべてのキャッシュ・インスタンスをアンロードします。コミット頻度が指定されているため、256行ごとにコミットすることにより、複数のトランザクションにわたって処理が実行されます。
UNLOAD CACHE GROUP customer_orders COMMIT EVERY 256 ROWS;
次の文では、単一のトランザクションでcustomer_orders
キャッシュ・グループのすべてのキャッシュ表からすべてのキャッシュ・インスタンスをアンロードします。単一のトランザクションは、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);
キャッシュ・グリッド内にあるすべてのメンバーのキャッシュ・グループをアンロードするには、オプティマイザ・フラグを設定します。UNLOAD CACHE GROUP
文を実行する前に、ttOptSetFlag
組込みプロシージャをコールし、GlobalProcessing
オプティマイザ・フラグを1に設定します。
注意: GlobalProcessing オプティマイザ・フラグの状態には関係なく、COMMIT EVERY n ROWS 句を使用した場合、複数のグリッド・ノード間でアンロード処理は実行されません。 |
CALL ttOptSetFlag('GlobalProcessing', 1);
次の文について考えてみます。
UNLOAD CACHE GROUP customer WHERE customer_id=54321;
ローカル・アンロード処理では、文が実行されるノードに顧客レコードが存在する場合のみ、レコードを削除します。グローバル・アンロード処理では、顧客レコードが含まれているノードに関係なく、レコードを削除します。
LOAD CACHE GROUP
文によってロードされたキャッシュ・インスタンス、REFRESH CACHE GROUP
文によってリフレッシュされたキャッシュ・インスタンス、FLUSH CACHE GROUP
文によってフラッシュされたキャッシュ・インスタンスまたはUNLOAD CACHE GROUP
文によってアンロードされたキャッシュ・インスタンスの数を判別するには、次のメカニズムを使用します。
アプリケーションがTimesTen接続に対して文を発行すると、その文をTimesTenデータベースで実行したり、Oracle Databaseにパススルーして実行できます。文をTimesTenデータベースまたはOracle Databaseのいずれで実行するかは、文の構成およびPassThrough
接続属性の設定によって決まります。PassThrough
接続属性を設定して、TimesTenでローカルに実行される文およびOracle Databaseにリダイレクトして実行される文を定義できます。
パススルー・レベル1から5で適切な場合、TimesTenは、ユーザーの現在の資格証明をユーザー名に、OraclePwd
接続属性をOracleパスワードに使用してOracle Databaseに接続します。
注意: RETURN TWOSAFE を使用してレプリケートされる処理を含むトランザクションでは、0より大きなPassThrough 設定を使用できません。PassThrough が0より大きい場合は、エラーが返され、トランザクションをロールバックする必要があります。
動的ロードの詳細は、「キャッシュ・インスタンスの動的ロード」を参照してください。 |
PassThrough
= 0はデフォルト設定であり、すべての文がTimesTenデータベースで実行されることになります。図5-1に、TimesTenデータベースで更新される表Aを示します。表Fは、TimesTen内に存在しないため更新できません。
PassThrough
= 1を設定して、TimesTenデータベースに存在しない表を参照している文はOracle Databaseにパススルーされて実行されるように指定します。DDL文はOracle Databaseにパススルーされません。
SELECT
文にTimesTen SQLで存在しないキーワードが含まれていることまたは構文エラーが含まれていることが原因でTimesTenにより文を解析できない場合、この文はOracle Databaseに渡されます。TimesTenによりINSERT
文、UPDATE
文またはDELETE
文を解析できない場合は、TimesTenによりエラーが返され、文はOracle Databaseにパススルーされません。
図5-2に、TimesTenデータベースで更新される表Aを示します(表GはTimesTenデータベースに存在しないため、表GはOracle Databaseで更新されます)。
PassThrough
=2は、読取り専用キャッシュ・グループおよびREADONLY
キャッシュ表属性を使用するユーザー管理キャッシュ・グループに対するINSERT
文、UPDATE
文およびDELETE
文がOracle Databaseにパススルーされるように指定します。それ以外の場合は、Passthrough
=1の動作が適用されます。
注意: 別のユーザーがキャッシュされたOracle Database表で更新したのと同じ行をTimesTenキャッシュ表で同時に更新することによる競合が発生しないようにする必要があります。 |
図5-3に、Oracle Databaseにパススルーされる、読取り専用キャッシュ・グループ内の表Aおよび表Gに対する更新を示します。
PassThrough
=3は、TimesTenエラーとなる動的AWTグローバル・キャッシュ・グループのキャッシュ表に対して発行されるINSERT
、UPDATE
およびDELETE
文を除いて、すべての文がOracle Databaseにパススルーされて実行されるように指定します。
図5-4に、読取り専用キャッシュ・グループまたは更新可能キャッシュ・グループに対してOracle Databaseで更新される表Aを示します。表Gを参照するSELECT
文も、Oracle Databaseにパススルーされます。動的AWTグローバル・キャッシュ・グループ内の表Cを参照するSELECT
文は、Oracle Databaseにパススルーされます。
PassThrough
=4は、動的ロードの問合せの基準を満たさない動的AWTグローバル・キャッシュ・グループのキャッシュ表に対して発行されたSELECT
文がOracle Databaseにパススルーされて実行されるように指定します。これ以外の場合、文はTimesTenデータベースで実行されます。動的ロードSELECT
文の基準の詳細は、「動的ロードのガイドライン」を参照してください。
図5-5に、TimesTenデータベースで更新される更新可能キャッシュ・グループ内の表Aを示します。また、この図には、動的ロードSELECT
文の基準を満たさない動的AWTグローバル・キャッシュ・グループに対して発行され、Oracle Databaseにパススルーされて実行されるSELECT
文も示します。
PassThrough
=5は、接続中の以前のトランザクションによって、動的AWTグローバル・キャッシュ・グループのキャッシュ表でコミットされたすべての更新がOracle Databaseに伝播されるときに、動的ロード問合せの基準を満たさない動的AWTグローバル・キャッシュ・グループのキャッシュ表に対して発行されたSELECT
文がOracle Databaseにパススルーされて実行されるように指定します。これ以外の場合、文はTimesTenデータベースで実行されます。動的ロードSELECT
文の基準の詳細は、「動的ロードのガイドライン」を参照してください。
図5-6に、TimesTenデータベースで更新される更新可能キャッシュ・グループ内の表Aを示します。また、この図には、接続中の以前のトランザクションによって、動的AWTグローバル・キャッシュ・グループのキャッシュ表でコミットされたすべての更新がOracle Databaseに伝播された後に、動的ロードSELECT
文の基準を満たさない動的AWTグローバル・キャッシュ・グループに対して発行され、Oracle Databaseにパススルーされて実行されるSELECT
文も示します。
AWTまたはSWTキャッシュ・グループのキャッシュ表に対して発行する場合は、更新処理をOracle Databaseにパススルーして実行することはお薦めしません。
AWTキャッシュ・グループのキャッシュ表にコミットされた更新は、キャッシュされたOracle Database表に自動的に非同期で伝播されます。一方、AWTキャッシュ・グループのキャッシュ表に対する更新と同じトランザクション内で更新処理をOracle Databaseにパススルーして実行すると、キャッシュ表の更新が同期して伝播され、不適切な結果が発生する場合があります。
同じトランザクション内で、同じ表に対する更新がOracle Databaseにパススルーされて実行された場合、SWTキャッシュ・グループのキャッシュ表にコミットされた更新によって自己デッドロックが発生することがあります。
PL/SQLブロックをOracle Databaseにパススルーして実行することはできません。また、Oracle Databaseには定義されているものの、TimesTenデータベースには定義されていないストアド・プロシージャまたは関数への参照をOracle Databaseにパススルーして実行することもできません。
PassThrough
接続属性の設定によって、どの状況で、どの文がTimesTenデータベースで実行され、どの文がOracle Databaseにパススルーされて実行されるのかを決定する方法の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のパススルーに関する説明を参照してください。
注意: パススルー機能では、Oracle Databaseとの通信にOCIを使用します。OCI診断フレームワークではシグナル・ハンドラをインストールしますが、このハンドラはアプリケーションで使用するシグナル処理に影響を与える可能性があります。OCIシグナル処理を無効化するには、sqlnet.ora ファイルでDIAG_SIGHANDLER_ENABLED=FALSE を設定します。詳細は、Oracle Call Interfaceプログラマーズ・ガイドのOCIでの障害診断に関する説明を参照してください。 |
現在のパススルー・レベルを上書きするには、現在のトランザクションに適用されるttIsql
ユーティリティのset passthrough
コマンドを使用します。
また、PassThrough
フラグを指定したttOptSetFlag
組込みプロシージャをコールすることによって、特定のトランザクションの設定を上書きすることもできます。次のプロシージャ・コールは、パススルー・レベルを3に設定します。
CALL ttOptSetFlag('PassThrough', 3);
PassThrough
フラグの設定は文の準備時に有効になり、文を準備してから文を実行するまでの間に設定を変更しても、文の実行時に使用されるのは準備時の設定です。トランザクションがコミットまたはロールバックされると、元の接続設定が後続のすべてのプリコンパイルされたSQL文で有効になります。