静的読取り専用キャッシュ・グループの作成
キャッシュされるOracle Database表の作成
指定したOracle Database表からデータをキャッシュするキャッシュ・グループを作成できます。
この例では、readtabおよびwritetabという2つの表を含む架空のsalesスキーマを使用します。
SQL*Plusを起動し、salesスキーマ・ユーザーとしてOracle Databaseに接続します。
% sqlplus sales/orapwdSQL*Plusを使用して、表readtabを作成します(図12-2を参照)。
SQL> CREATE TABLE readtab (keyval NUMBER NOT NULL PRIMARY KEY, str VARCHAR2(32));
Table created.図12-2 読取り専用キャッシュ・グループにキャッシュされるOracle Database表の作成

「図12-2 読取り専用キャッシュ・グループにキャッシュされるOracle Database表の作成」の説明
次に、SQL*Plusを使用して、数行をreadtab表に挿入し、変更をコミットします。
SQL> INSERT INTO readtab VALUES (1, 'Hello');
1 row created.
SQL> INSERT INTO readtab VALUES (2, 'World');
1 row created.
SQL> COMMIT;
Commit complete.次に、SQL*Plusを使用して、readtab表に対するSELECT権限をcacheadmin Oracleキャッシュ管理ユーザーに付与します。
SQL> GRANT SELECT ON readtab TO cacheadmin;
Grant succeeded.readtab表に対するSELECT権限は、この表をキャッシュする読取り専用キャッシュ・グループの作成と、キャッシュされたOracleデータベース表からTimesTenキャッシュ表への自動リフレッシュ処理の実行に必要です。
『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』のOracleキャッシュ管理ユーザーへの権限の付与を参照してください。
TimesTen Scaleoutのキャッシュ・エージェントの起動
アクティブ管理インスタンスで、ttGridAdmin dbCacheStartコマンドを使用して、データベース内のすべてのデータ・インスタンスでキャッシュ・エージェントを起動します。その後、ttGridAdmin dbStatusコマンドを使用して、すべてのデータ・インスタンス上のキャッシュ・エージェントが起動された時間を表示します。
% ttGridAdmin dbCacheStart database1
Database database1 : Starting cache agents.
% ttGridAdmin dbStatus -element
Database database1 element level status as of Thu Dec 24 09:59:14 PST 2020
Host Instance Elem Status CA Status Date/Time of Event Message
----- --------- ---- ------ --------- ------------------- -------
host3 instance1 1 opened started 2020-11-23 08:37:35
host4 instance1 2 opened started 2020-11-23 08:37:35
host5 instance1 3 opened started 2020-11-23 08:37:35
host6 instance1 4 opened started 2020-11-23 08:37:35
host7 instance1 5 opened started 2020-11-23 08:37:35
host8 instance1 6 opened started 2020-11-23 08:37:35 -instanceオプションを指定すると、特定のデータ・インスタンスのキャッシュ・エージェントを起動できます。
% ttGridAdmin dbCacheStart database1 -instance host4.instance1
Database database1 : Starting cache agents.
% ttGridadmin dbStatus database1 -element
Database database1 element level status as of Mon Dec 7 14:52:51 PST 2020
Host Instance Elem Status CA Status Date/Time of Event Message
----- --------- ---- ------ --------- ------------------- -------
host3 instance1 1 opened stopped 2020-11-23 08:37:35
host4 instance1 2 opened started 2020-11-23 08:37:35
host5 instance1 3 opened stopped 2020-11-23 08:37:35
host6 instance1 4 opened stopped 2020-11-23 08:37:35
host7 instance1 5 opened stopped 2020-11-23 08:37:35
host8 instance1 6 opened stopped 2020-11-23 08:37:35 すべてのデータ・インスタンスまたは単一データ・インスタンスでのキャッシュ・エージェントの停止方法は、「TimesTen Scaleoutのキャッシュ・エージェントの停止」を参照してください。パフォーマンスに関する考慮事項は、「Oracleデータベースへのキャッシュ・エージェント接続の制限」を参照してください。
キャッシュ・グループの作成
TimesTen Scaleoutでは、増分自動リフレッシュありの静的読取り専用キャッシュ・グループを作成できます。読取り専用キャッシュ・グループでは、Oracleデータベース内の表に対するコミット済の変更が自動的にTimesTenデータベース内のキャッシュ表に反映されます。
キャッシュ・グループを作成するときに、AUTOREFRESH INTERVALを使用して増分自動リフレッシュを指定します。「キャッシュされたOracle Database表に対する更新の自動リフレッシュ」を参照してください。
TimesTen Scaleoutでキャッシュ・グループを作成する場合の主な相違は、データベースの要素間でデータをどのように分散するかを指定するという点です。分散スキームは、CREATE CACHE GROUP文のDISTRIBUTE BY句で指定します。「TimesTen Scaleoutのキャッシュ・グループの分散スキーム」を参照してください。
次の例では、TimesTenキャッシュ管理ユーザーとして、自動リフレッシュ間隔が5秒の増分自動リフレッシュを使用してOracleデータベースのsales.readtab表をキャッシュする静的読取り専用キャッシュ・グループreadcacheを作成します。分散スキームとして、HASH分散スキームが指定されます。HASH分散スキームはデフォルトです(通常はSQL文に含める必要はありません)。
TimesTenキャッシュ管理ユーザーとして接続するには、ttIsqlユーティリティを起動し、database1 TimesTenデータベース(キャッシュ管理ユーザーおよび両方のキャッシュ管理ユーザーの資格証明を含むウォレットを含む)に接続します。『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』のOracle Walletでのキャッシュ管理ユーザー名およびパスワードの指定を参照してください。
ttIsql "DSN=database1;UID=cacheadmin;PwdWallet=/wallets/cacheadminwallet" Copyright (c) 1996, 2021, Oracle and/or its affiliates. All rights reserved. Type ? or "help" for help, type "exit" to quit ttIsql. connect "DSN=database1;UID=cacheadmin;PwdWallet=/wallets/cacheadminwallet; Connection successful: DSN=database1;UID=cacheadmin; DataStore=/timesten/datastores/database1;DatabaseCharacterSet=WE8ISO8859P1; ConnectionCharacterSet=AL32UTF8;PermSize=512;TempSize=512;Connections=100; OracleNetServiceName=inst1;CacheAdminWallet=1;EpochInterval=1; (Default setting AutoCommit=1) Command> CREATE READONLY CACHE GROUP readcache AUTOREFRESH INTERVAL 5 SECONDS FROM sales.readtab (keyval NUMBER NOT NULL PRIMARY KEY, str VARCHAR2(32)) DISTRIBUTE BY HASH; Command>
readcacheキャッシュ・グループとそのそれぞれのsales.readtabキャッシュ表(その所有者および名前は、キャッシュされたOracleデータベース表と同じ)が、TimesTenデータベースに作成されます。
図12-3では、readcacheキャッシュ・グループでsales.readtab表がキャッシュされています。
ttIsql cachegroupsコマンドを使用して、readcacheキャッシュ・グループの定義を表示します。
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.
『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』の読取り専用キャッシュ・グループを参照してください。
TimesTen Scaleoutのキャッシュ・グループの分散スキーム
キャッシュ・グループの分散スキームは、DISTRIBUTE BY句で指定します。ベスト・プラクティスは、すべての子表を参照によって分散することです。
次に、TimesTen Scaleout内で定義されているキャッシュ・グループのデフォルト分散スキームを示します。
-
単一表キャッシュ・グループでは、デフォルトで
HASH分散スキームが使用されます。 -
列が
DISTRIBUTE BY HASH句で指定されていない場合は、TimesTen Scaleoutにより、分散スキームのキー列として主キー列が選択されます。主キーが定義されていない場合は、TimesTen Scaleoutにより、ハッシュ・キーとして非表示列が作成されます。 -
複数表キャッシュ・グループでは、親キャッシュ・グループ表で使用できるのは
HASHまたはDUPLICATE分散スキームのみです。DUPLICATE分散スキームを使用するように親キャッシュ表を定義した場合、子表で使用できるのはHASHまたはDUPLICATEのみです。 -
複数表キャッシュ・グループがある場合、その親キャッシュ表にはデフォルトで
HASH分散スキームが使用され、すべての子キャッシュ表にはデフォルトでREFERENCE分散スキームが使用されます。複数表キャッシュ・グループがあり、その親キャッシュ表をDUPLICATE分散スキームを使用するように設定し、その子表の分散スキームを設定しなかった場合は、すべての子キャッシュ表でデフォルトでHASH分散スキームが使用されます。 -
子表については、その外部キーが親表の主キーと同一だと、最適化として分散スキームが
HASH分散スキームに変更されます。
次の例では、親表がハッシュ分散スキームを使用して分散され、子表が参照分散スキームを使用する、複数表キャッシュ・グループを示します。
次のように、Oracleデータベースでcustomers表およびaccounts表を定義します。
SQL> CREATE TABLE customers
(
cust_id NUMBER(10,0) NOT NULL,
first_name VARCHAR2(30) NOT NULL,
last_name VARCHAR2(30) NOT NULL,
addr1 VARCHAR2(64),
addr2 VARCHAR2(64),
zipcode VARCHAR2(5),
member_since DATE NOT NULL,
PRIMARY KEY (cust_id));
Table created.
SQL> CREATE TABLE accounts
(
account_id NUMBER(10,0) NOT NULL PRIMARY KEY,
phone VARCHAR2(16) NOT NULL,
account_type CHAR(1) NOT NULL,
status NUMBER(2,0) NOT NULL,
current_balance NUMBER(10,2) NOT NULL,
prev_balance NUMBER(10,2) NOT NULL,
date_created DATE NOT NULL,
cust_id NUMBER(10,0) NOT NULL,
CONSTRAINT fk_customer
FOREIGN KEY (cust_id)
REFERENCES customers(cust_id));
Table created.次に、sales親表とaccounts子表がある、複数表キャッシュ・グループを定義します。
Connect> CREATE READONLY CACHE GROUP customer_orders
FROM sales.customer
( cust_id NUMBER(10,0) NOT NULL,
first_name VARCHAR2(30) NOT NULL,
last_name VARCHAR2(30) NOT NULL,
addr1 VARCHAR2(64),
addr2 VARCHAR2(64),
zipcode VARCHAR2(5),
member_since DATE NOT NULL,
PRIMARY KEY(cust_id))
DISTRIBUTE BY HASH
WHERE (sales.customer.cust_id < 100),
sales.accounts
(account_id NUMBER(10,0) NOT NULL,
phone VARCHAR2(16) NOT NULL,
account_type CHAR(1) NOT NULL,
status NUMBER(2,0) NOT NULL,
current_balance NUMBER(10,2) NOT NULL,
prev_balance NUMBER(10,2) NOT NULL,
date_created DATE NOT NULL,
cust_id NUMBER(10,0) NOT NULL,
PRIMARY KEY(account_id),
FOREIGN KEY(cust_id) REFERENCES oratt.customer(cust_id))
DISTRIBUTE BY REFERENCE;作成後は、キャッシュ表の分散スキームを変更できません。そうするかわりに、キャッシュ・グループを削除してから、再作成してキャッシュ表の分散スキームを変更する必要があります。
TimesTen Scaleoutでの分散スキームの詳細は、「表の分散スキームの定義」を参照してください。完全な構文は、『Oracle TimesTen In-Memory Database SQLリファレンス』のCREATE CACHE GROUPを参照してください。
キャッシュ表に対する索引の作成
キャッシュ・グループ内のキャッシュ表に索引を作成する前に、キャッシュ・グループでの自動リフレッシュを一時停止する必要があります。
これにより、リソースの競合の可能性がなくなり、ロック状態を回避できます。
「自動リフレッシュ状態の管理」を参照してください。

