読取り専用キャッシュ・グループに対する処理の実行

キャッシュされたOracleデータベース表にコミット済の変更がある、読取り専用キャッシュ・グループを、手動ロードまたは自動リフレッシュする方法を示します。

キャッシュされたOracleデータベース表に対する更新の自動リフレッシュ

CREATE CACHE GROUP文を使用して読取り専用キャッシュ・グループを作成するときに、AUTOREFRESH INTERVALキャッシュ・グループ属性を使用して増分自動リフレッシュを指定します。デフォルトでは、読取り専用キャッシュ・グループには自動リフレッシュが定義されます。

この例では、readcacheキャッシュ・グループに5秒の自動リフレッシュ間隔が定義されています。デフォルトのモードはINCREMENTALで、デフォルトの状態はPAUSEDです。

Command> CREATE READONLY CACHE GROUP readcache
        AUTOREFRESH INTERVAL 5 SECONDS
        FROM sales.readtab
        (keyval NUMBER NOT NULL PRIMARY KEY, str VARCHAR2(32));

自動リフレッシュの考慮事項:

  • 自動リフレッシュ状態: 自動リフレッシュ状態はデフォルトでPAUSEDに設定されているため、キャッシュ・グループの初期ロードとして手動ロードを実行できます。これがお薦めの方法です。『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』キャッシュ・グループの手動ロードを参照してください。

    ただし、キャッシュ・グループ作成時に、またはキャッシュ・グループ作成後かつ手動ロードの前の任意の時点で、自動リフレッシュ状態をONに設定した場合は、キャッシュ・グループの初期ロードの実行のために、自動的に完全自動リフレッシュがリクエストされます。大きなキャッシュ・グループに対して完全自動リフレッシュを実行すると問題が発生する可能性があります。『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』完全自動リフレッシュの無効化を参照してください。

  • 自動リフレッシュのモードおよび間隔: AUTOREFRESH MODE INCREMENTAL INTERVALが定義されている場合、キャッシュ・グループの自動リフレッシュ間隔に基づいて、キャッシュされたOracleデータベース表に対するコミット済の変更が自動的にTimesTenキャッシュ表に反映されます。増分自動リフレッシュでは、Oracleデータベース・オブジェクトを使用して、キャッシュされたOracleデータベース表に対するコミット済の変更が追跡されます。トランザクション一貫性は、同じ自動リフレッシュ間隔に属するキャッシュ・グループの場合は保持されます。

自動リフレッシュ間隔では、自動リフレッシュ処理の実行頻度を分、秒またはミリ秒の単位で指定します。自動リフレッシュ間隔は、キャッシュ・グループの作成中にのみ設定できます。自動リフレッシュ間隔が同一のキャッシュ・グループは、同じトランザクション内でリフレッシュされ、単一のキャッシュ・エージェントによって管理されます。複数のキャッシュ・グループを別々の自動リフレッシュ間隔にすることで、並列化が実現されて、パフォーマンスを向上させることができます。

自動リフレッシュ間隔を0ミリ秒に設定すると、自動リフレッシュを連続するよう指定できます。連続自動リフレッシュを指定している場合、次の自動リフレッシュ・サイクルは、最後の自動リフレッシュ・サイクルの終了後、可能なかぎり早くスケジュールされます。

自動リフレッシュ属性のデフォルト設定は、次のとおりです。

  • 自動リフレッシュ・モードはINCREMENTALです。

  • 自動リフレッシュの間隔は5分です。

  • 自動リフレッシュの状態はPAUSEDです。

「自動リフレッシュ状態の管理」を参照してください。

次の例では、Oracleデータベース・キャッシュ表に対する変更がどのようにTimesTen上のキャッシュ・グループに自動反映されるかを示します。

Oracleデータベース・スキーマ・ユーザーとしてSQL*Plusを使用して、Oracle Database表readtabを対象に、新規行の挿入、既存行の削除および既存行の更新を実行し、これらの変更をコミットします。

SQL> INSERT INTO readtab VALUES (3, 'Welcome');
1 row created.
SQL> DELETE FROM readtab WHERE keyval=2;
1 row deleted.
SQL> UPDATE readtab SET str='Hi' WHERE keyval=1;
1 row updated.
SQL> COMMIT;
Commit complete.

この読取り専用キャッシュ・グループは5秒間隔の増分自動リフレッシュを指定して作成されているため、readcacheキャッシュ・グループ内のsales.readtabキャッシュ表は、キャッシュされたOracleデータベース表sales.readtab対するコミット済の変更を反映するように、5秒後に自動的にリフレッシュされます。これを図12-4に示します。

図12-4 Oracle Database更新でのTimesTenキャッシュ表の自動リフレッシュ

図12-4の説明が続きます
「図12-4 Oracle Database更新でのTimesTenキャッシュ表の自動リフレッシュ」の説明

キャッシュされたOracleデータベース表にコミットされた変更でreadcacheキャッシュ・グループが自動的にリフレッシュされた後、TimesTenキャッシュ管理ユーザーとして、ttIsqlユーティリティを使用してsales.readtabキャッシュ表の内容を問い合せます:

Command> SELECT * FROM sales.readtab;
< 1, Hi >
< 3, Welcome >
2 rows found.

『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』キャッシュ・グループの自動リフレッシュを参照してください。

自動リフレッシュ状態の管理

自動リフレッシュ状態はONOFFまたはPAUSEDに設定できます。

  • ON: キャッシュ・グループの自動リフレッシュ状態がONの場合は、自動リフレッシュ処理は、TimesTenによってスケジュールされます。

  • OFF: キャッシュ・グループの自動リフレッシュ状態がOFFの場合、キャッシュされたOracleデータベース表に対するコミット済の変更は追跡されません。

  • PAUSED: キャッシュ・グループの自動リフレッシュ状態がPAUSEDの場合、キャッシュされたOracleデータベース表に対するコミット済の変更は、Oracleデータベース内で追跡されますが、状態がONに変更されるまで、TimesTenキャッシュ表に自動的に反映されることはありません。

キャッシュ・グループを作成または変更するときに、自動リフレッシュ状態を設定できます。次の例では、ALTER CACHE GROUP文を使用して自動リフレッシュ状態を変更します。

Command> ALTER CACHE GROUP readcache SET AUTOREFRESH STATE PAUSED;
Command> cachegroups;
 
Cache Group CACHEADMIN.READCACHE:
 
  Cache Group Type: Read Only
  Autorefresh: Yes
  Autorefresh Mode: Incremental
  Autorefresh State: Paused
  Autorefresh Interval: 5 Seconds
  Autorefresh Status: ok
  Aging: No aging defined
 
  Root Table: SALES.READTAB
  Table Type: Read Only
 
1 cache group found.

Command> ALTER CACHE GROUP readcache SET AUTOREFRESH STATE ON;
Command> cachegroups;
 
Cache Group CACHEADMIN.READCACHE:
 
  Cache Group Type: Read Only
  Autorefresh: Yes
  Autorefresh Mode: Incremental
  Autorefresh State: On
  Autorefresh Interval: 5 Seconds
  Autorefresh Status: ok
  Aging: No aging defined
 
  Root Table: SALES.READTAB
  Table Type: Read Only
 
1 cache group found.

『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』キャッシュ・グループの自動リフレッシュを参照してください。

完全自動リフレッシュの無効化

大量のデータをロードすると一時領域またはOracleキャッシュ管理ユーザー表領域のいずれかに過剰な負荷がかかる場合があるため、大きなキャッシュ・グループに対して完全自動リフレッシュを実行すると問題が発生する可能性があります。

次の場合には、TimesTenによって完全自動リフレッシュがリクエストされます。

  • キャッシュ・グループ作成時に、またはキャッシュ・グループ作成後かつ手動ロードの前の任意の時点で、自動リフレッシュ状態をONに設定した場合は、キャッシュ・グループの初回ロードが完全自動リフレッシュになります。

  • TimesTenでは、リカバリがリクエストされると、自動的に完全自動リフレッシュが実行されます。

ただし、パフォーマンスに懸念がある場合は、DisableFullAutorefreshキャッシュ構成パラメータを1に設定することで、増分自動リフレッシュありで定義されたすべてのキャッシュ・グループに対する完全自動リフレッシュ・リクエストを禁止できます。そのようにする場合は、初期ロードとリカバリの両方で手動ロードが必要になります。

Command> call ttCacheConfig('DisableFullAutorefresh',,,'1');
< DisableFullAutorefresh, <NULL>, <NULL>, 1 >
1 row found.

『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』自動リフレッシュ・キャッシュ・グループ用の変更ログ表の手動による最適化を参照してください。

キャッシュ・グループの手動によるロード

TimesTenキャッシュ管理ユーザーとして、LOAD CACHE GROUP文を使用してキャッシュ・グループの初期ロードを実行します。LOAD CACHE GROUP文では、キャッシュされたOracleデータベース表に対するコミット済の挿入のみがTimesTenキャッシュ表にロードされます。

新規キャッシュ・インスタンスはキャッシュ表にロードされますが、キャッシュ表にすでに存在するキャッシュ・インスタンスは、キャッシュされたOracleデータベース表にある対応する行が更新または削除されても、更新または削除されません。手動ロード操作は、主に、キャッシュ・グループに最初にデータを移入するために使用します。

自動リフレッシュありの読取り専用キャッシュ・グループへの手動ロードは、自動リフレッシュ状態がPAUSEDの場合にのみ実行できます。手動ロードが完了すると、自動リフレッシュ状態は自動的にPAUSEDからONに変更されます。その後、増分自動リフレッシュが開始されます。

ロードするデータが大量にあることがわかっている場合は、COMMIT EVERY n ROWS句を指定してデータを分割し、PARALLEL句を指定して複数のスレッドにわたるパラレル・ロードをリクエストできます。

次の例では、Oracleデータベースのsales.readtab表の内容をTimesTenのreadcacheキャッシュ・グループ内のsales.readtabキャッシュ表にロードします。この例では、256行ごとにコミットし、3つのスレッドを同時実行するように指定します。

Command> LOAD CACHE GROUP readcache COMMIT EVERY 256 ROWS PARALLEL 3;
2 cache instances affected.

図12-5に、Oracle Databaseのデータがsales.readtabキャッシュ表にロードされる様子を示します。

図12-5 読取り専用キャッシュ・グループのロード

図12-5の説明が続きます
「図12-5 読取り専用キャッシュ・グループのロード」の説明

sales.readtabキャッシュ表に対するSELECT権限をTimesTenキャッシュ管理ユーザーに付与して、このユーザーがこの表に対してSELECT問合せを発行できるようにします。

Command> GRANT SELECT ON sales.readtab TO cacheadmin;

sales.readtabキャッシュ表の内容を問い合せます。

Command> SELECT * FROM sales.readtab;
< 1, Hello >
< 2, World >
2 rows found.

『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』キャッシュ・グループの手動によるロードおよびリフレッシュを参照してください。

読取り専用キャッシュ・グループの手動リフレッシュ

REFRESH CACHE GROUP SQL文を使用して、読取り専用キャッシュ・グループを手動でリフレッシュすることもできます。REFRESH CACHE GROUPは、キャッシュ表にすでに存在するキャッシュ・インスタンスを含め、TimesTenキャッシュ表内のキャッシュ・インスタンスを、キャッシュされたOracleデータベース表内の最新のデータに置き換えます。

リフレッシュ処理は、主に、キャッシュ・グループに最初にデータが移入された後、キャッシュされたOracleデータベース表に対するコミット済の変更でキャッシュ・グループの内容を更新するために使用されます。

静的キャッシュ・グループの場合、リフレッシュ処理は、キャッシュ・グループに対してUNLOAD CACHE GROUP文を発行し、続いてLOAD CACHE GROUP文を発行することと同じです。事実上、キャッシュされたOracleデータベース表に対するコミット済の挿入、更新および削除がすべて、キャッシュ表に反映されます。新しいキャッシュ・インスタンスがキャッシュ表にロードされる場合があります。キャッシュ表にすでに存在するキャッシュ・インスタンスは、キャッシュされたOracleデータベース表にある対応する行が更新または削除されると、更新または削除されます。

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

Command> REFRESH CACHE GROUP readcache COMMIT EVERY 256 ROWS;
2 cache instances affected.

『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』キャッシュ・グループの手動によるロードおよびリフレッシュ、および「キャッシュ・グループのアンロード」を参照してください。

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

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

次の例では、readcacheキャッシュ・グループ内のすべてのキャッシュ表から、すべてのキャッシュ・インスタンスをアンロードします。コミット頻度が指定されているため、256行ごとにコミットすることにより、複数のトランザクションにわたって処理が実行されます。

Command> UNLOAD CACHE GROUP readcache COMMIT EVERY 256 ROWS;
2 cache instances affected.

『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』キャッシュ・グループのアンロードを参照してください。