静的読取り専用キャッシュ・グループの作成

読取り専用キャッシュ・グループを作成できます。

この項では、読取り専用キャッシュ・グループを作成します(図12-1を参照)。

図12-1 単一表の読取り専用キャッシュ・グループ

図12-1の説明が続きます。
「図12-1 単一表の読取り専用キャッシュ・グループ」の説明

次のタスクを完了して読取り専用キャッシュ・グループを作成します。

  1. キャッシュされるOracle Database表の作成

  2. TimesTen Scaleoutのキャッシュ・エージェントの起動

  3. キャッシュ・グループの作成

キャッシュされる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の説明が続きます。
「図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のキャッシュ・エージェントの起動

キャッシュ・エージェントにより、キャッシュ・グループのロードや自動リフレッシュの管理などのキャッシュ操作が実行されます。TimesTenにより、様々なキャッシュ・エージェント(それぞれ異なるデータ・インスタンス上で動作)にキャッシュ・タスクが分散されます。その際には、特定の自動リフレッシュ間隔のすべての作業が単一のキャッシュ・エージェントに割り当てられます。 1つのキャッシュ・エージェントで、複数の自動リフレッシュ間隔を管理できます。

アクティブ管理インスタンスで、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表がキャッシュされています。

図12-3 読取り専用キャッシュ・グループの作成

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

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を参照してください。

キャッシュ表に対する索引の作成

キャッシュ・グループ内のキャッシュ表に索引を作成する前に、キャッシュ・グループでの自動リフレッシュを一時停止する必要があります。

これにより、リソースの競合の可能性がなくなり、ロック状態を回避できます。

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