次の各項では、キャッシュ・グループに対して実行できる処理について説明します。
|
ノート: 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句の条件を満たす行のみがキャッシュ表にロードまたはリフレッシュされます。
キャッシュ・グループに時間ベースのエージング・ポリシーが定義されている場合、ルート表の行のタイムスタンプがエージング・ポリシーの存続期間内にあるキャッシュ・インスタンスのみがキャッシュ表にロードまたはリフレッシュされます。
ロード処理またはリフレッシュ処理が単一のトランザクション内で多数のキャッシュ・インスタンスを処理すると同時実行性およびスループットが大幅に低下するため、これを避けるには、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文が実行を終了する前にコミットされます。したがって、ユーザー・トランザクションがロールバックされる場合、動的にロードされたデータはキャッシュ・グループに残ったままになります。
次の各項ではキャッシュ・グループの動的ロードについて説明します。
動的ロードは、次のようにして、DynamicLoadEnable接続属性で構成できます。
0: 現在の接続について、TimesTenの動的キャッシュ・グループへのOracle Databaseデータの動的ロードを無効にします。
1 (デフォルト): 現在の接続について、TimesTenの動的キャッシュ・グループへのOracle Databaseデータの動的ロードを1文ごとに有効にします。文は1つの動的キャッシュ・グループの表のみを参照する必要があり、その表は主問合せのみで参照される必要があります。文はキャッシュ表以外の表を参照することもできます。ロードできるキャッシュ・インスタンスは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集合演算子を含めることはできません。
文はキャッシュ表以外の表を参照することができます。
デフォルトで(DynamicLoadEnable = 1)、文が参照できるキャッシュ表は1つの動的キャッシュ・グループに限られます。詳細は「動的ロード構成」を参照してください。
動的ロードの動作はDynamicLoadEnableの設定により異なります。次に、DynamicLoadEnable = 1の場合に動的ロードが発生するかどうかを判別するために評価されるルールを説明します。
キャッシュ・グループに対する動的ロードは、キャッシュ・グループの任意の表がいずれかのFROM句で複数回指定されている場合には発生しません。
問合せで明示的に指定された条件のみが動的ロードの対象とみなされ、これにはいずれの派生条件も含まれません。
任意のキャッシュ・グループが副問合せでのみ参照される場合、動的ロードの対象とはみなされません。
キャッシュ・グループに時間ベースのエージング・ポリシーが定義されている場合、キャッシュ・インスタンスをロードするには、ルート表の行のタイムスタンプがエージング・ポリシーの存続期間内にある必要があります。キャッシュ・グループにエージング・ポリシーを定義する方法の詳細は、「キャッシュ・グループでのエージングの実装」を参照してください。
アクティブ・スタンバイ・ペア・レプリケーション・スキームを使用するときには、動的ロードはどのサブスクライバでも発生することができません。
次の考慮事項は動的ロードに影響を与える可能性があります。
複数のキャッシュ・グループ内の表またはキャッシュ・グループ以外の表が主問合せで指定された場合は、キャッシュ・インスタンスがロードされるかどうかは結合順序により影響を受けます。問合せの実行中に動的ロードが可能で問合せの結果を出すことが必要な場合、動的ロードが発生します。ただし、返される行がない場合、一部またはすべてのキャッシュ・インスタンスが動的にロードされません。
文がキャッシュ・グループの表に対して複数の動的ロード条件を指定した場合、追加条件がその文に適格ではない場合もキャッシュ・インスタンスが動的にロードされる場合があります。
動的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.
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);
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から3で適切な場合、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は、すべての文がOracle Databaseにパススルーされて実行されるように指定します。
図5-4に、読取り専用キャッシュ・グループまたは更新可能キャッシュ・グループに対してOracle Databaseで更新される表Aを示します。表Gを参照するSELECT文も、Oracle Databaseにパススルーされます。
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フラグの設定は文の準備時に有効になり、文を準備してから文を実行するまでの間に設定を変更しても、文の実行時に使用されるのは準備時の設定です。トランザクションがコミットまたはロールバックされると、元の接続設定が後続のすべてのプリペアド文で有効になります。