静的読取り専用キャッシュ・グループの作成
キャッシュされるOracle Database表の作成
指定したOracle Database表からデータをキャッシュするキャッシュ・グループを作成できます。
この例では、readtab
およびwritetab
という2つの表を含む架空のsales
スキーマを使用します。
SQL*Plusを起動し、sales
スキーマ・ユーザーとしてOracle Databaseに接続します。
% sqlplus sales/orapwd
SQL*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を参照してください。
キャッシュ表に対する索引の作成
キャッシュ・グループ内のキャッシュ表に索引を作成する前に、キャッシュ・グループでの自動リフレッシュを一時停止する必要があります。
これにより、リソースの競合の可能性がなくなり、ロック状態を回避できます。
「自動リフレッシュ状態の管理」を参照してください。