CREATE CACHE GROUP

CREATE CACHE GROUP文は、次の処理を実行します。

  • キャッシュ・グループで定義される表を作成します。

  • キャッシュ・グループに関連付けられたすべての新しい情報を、適切なシステム表にロードします。

キャッシュ・グループとは、Oracle Databaseの表からデータをキャッシュする表のセットのことで、外部キーを介して関連付けられます。ルート表は1つで、この表は他の表を参照しません。キャッシュ・グループに含まれる他のすべてのキャッシュ表は、キャッシュ・グループ内の表を1つのみ参照します。つまり、外部キーのリレーションシップによってツリーが形成されます。

キャッシュ表は、次の条件を満たす行の集合です。

  • Oracle Database表の垂直パーティションの行のサブセットで構成されている。

  • Oracle Database表と同じ名前でTimesTen表に格納されている。

データベースに2つ以上のキャッシュ・グループがある場合、キャッシュ・グループは別々のOracle Database(およびTimesTen)表に対応している必要があります。

キャッシュ・グループ・インスタンスは、ルート表の1つの行と、ルート表の行に直接的または間接的に関連付けられている子表のすべての行を参照します。

キャッシュ・グループは、システム管理またはユーザー管理のいずれかになります。

システム管理キャッシュ・グループは、TimesTenによって完全に管理され、プロパティは固定されています。システム管理キャッシュ・グループには、次のタイプがあります。

  • 読取り専用キャッシュ・グループはOracle Databaseで更新され、Oracle Databaseからキャッシュに更新が伝播されます。

  • ASYNCHRONOUS WRITETHROUGH(AWT)キャッシュ・グループはキャッシュで更新され、Oracle Databaseに更新が伝播されます。トランザクションはOracle Databaseでのコミットを待機せずに、キャッシュ上で続行します。

  • SYNCHRONOUS WRITETHROUGH(SWT)キャッシュ・グループはキャッシュで更新され、Oracle Databaseに更新が伝播されます。トランザクションは、Oracle Databaseでコミットが発生したことを通知した後、キャッシュ上でコミットされます。

ローディングやアンローディングなど、システム管理のキャッシュ・グループはTimesTenによって管理されるため、これらのキャッシュ・グループの定義では、次のような特定の文や句は使用できません。

  • AWTおよびSWTキャッシュ・グループ定義でのWHERE

  • キャッシュ表定義でのREADONLYPROPAGATEおよびNOT PROPAGATE

  • AWTおよびSWTキャッシュ・グループ定義でのAUTOREFRESH

FLUSH CACHE GROUPおよびREFRESH CACHE GROUP操作は、AWTおよびSWTキャッシュ・グループでは使用できません。

AWTキャッシュ・グループを作成する前に、レプリケーション・エージェントを停止する必要があります。

ユーザー管理キャッシュ・グループは、アプリケーションまたはユーザーによって管理される必要があります。ユーザー管理キャッシュ・グループのPROPAGATEは、同期型です。表レベルのREADONLYキーワードは、ユーザー管理キャッシュ・グループでのみ使用できます。

さらに、TimesTenおよびOracle Databaseの両方ですべてのWHERE句を解析できる必要があります。

キャッシュ・グループは、明示的または動的にロードできます。

明示的にロードされるキャッシュ・グループでは、LOAD CACHE GROUPまたはREFRESH CACHE GROUP文を使用してOracle Database表からTimesTenキャッシュ表に手動で新しいキャッシュ・インスタンスをロードするか、または自動リフレッシュ操作を使用して自動でロードします。

動的キャッシュ・グループでは、LOAD CACHE GROUPを使用してTimesTenキャッシュ表に手動で新しいキャッシュ・インスタンスをロードするか、または動的ロード操作を使用して要求時にロードできます。動的ロード操作では、いずれかのキャッシュ表でSELECTUPDATEDELETE、またはINSERT文が発行され、データがキャッシュ表に存在しないもののキャッシュされたOracle Database表には存在すると、キャッシュされたOracle Database表からTimesTenキャッシュ表にデータが自動的にロードされます。動的キャッシュ・グループでの手動リフレッシュ操作または自動リフレッシュ操作では、既存のキャッシュ・インスタンスの更新または削除はできますが、新しいキャッシュ・インスタンスのロードはできません。

どのキャッシュ・グループ・タイプ(読取り専用、ASYNCHRONOUS WRITETHROUGH、SYNCHRONOUS WRITETHROUGH、ユーザー管理)でも、明示的にロードされるキャッシュ・グループとして定義できます。

AUTOREFRESHキャッシュ・グループ属性とPROPAGATEキャッシュ表属性の両方を持つユーザー管理キャッシュ・グループを除いて、どのキャッシュ・グループ・タイプでも動的キャッシュ・グループとして定義できます。

LRUエージングがデフォルトで定義されているため、動的キャッシュ・グループのデータはエージ・アウトされます。組込みプロシージャのttAgingLRUConfigまたはttAgingTableLRUConfigのどちらか(あるいは両方)を使用して、LRUエージングの領域使用しきい値を上書きします。また、動的キャッシュ・グループに時間ベースのエージングを定義して、LRUエージングを上書きすることもできます。

静的および動的キャッシュ・グループの詳細は、『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』「キャッシュ・グループおよびキャッシュ表」を参照してください。

必要な権限

CREATE CACHE GROUPまたはCREATE ANY CACHE GROUPおよびCREATE TABLE(キャッシュ・グループ内のすべての表が現在のユーザーによって所有されている場合)またはCREATE ANY TABLE(キャッシュ・グループ内の1つ以上の表が現在のユーザーによって所有されていない場合)。

TimesTen Scaleoutでの使用

増分自動リフレッシュを使用した静的読取り専用キャッシュ・グループがサポートされています。

SQL構文: TimesTen Scaleout

TimesTen Scaleoutの静的読取り専用キャッシュ・グループの場合:
CREATE READONLY CACHE GROUP [Owner.]CacheGroupName
 [AUTOREFRESH 
    [MODE INCREMENTAL]
    [INTERVAL IntervalValue {MINUTE[S] | SECOND[S] | MILLISECOND[S]}]
    [STATE {ON|OFF|PAUSED}]
  ]
  FROM
    [Owner.]TableName (ColumnDefinition[,...][,PRIMARY KEY(ColumnName[,...])])
  [UNIQUE HASH ON (HashColumnName[,...]) PAGES=PrimaryPages]
  [ParentDistributionClause]
    [WHERE ExternalSearchCondition]
  [,[Owner.]TableName (ColumnDefinition[,...]
    [,PRIMARY KEY(ColumnName[,...])]
    [,FOREIGN KEY(ColumnName[,...])
        REFERENCES RefTableName (ColumnName [,...])[ON DELETE CASCADE]])
 [UNIQUE HASH ON (HashColumnName[,...]) PAGES=PrimaryPages]
 [ChildDistributionClause]
   [WHERE ExternalSearchCondition]
 [,...]
 ]

The syntax for the distribution clause for a parent:
ParentDistributionClause::= DISTRIBUTE BY HASH [(ColumnName [,...])] | DUPLICATE

The syntax for the distribution clause for a child:
ChildDistributionClause::= DISTRIBUTE BY HASH [(ColumnName [,...])] |
 DISTRIBUTE BY REFERENCE [(ForeignKeyConstraint)] | DUPLICATE

SQL構文: TimesTen Classic

読取り専用キャッシュ・グループの場合:

CREATE [DYNAMIC] [HYBRID] READONLY CACHE GROUP [Owner.]CacheGroupName
 [AUTOREFRESH
  [MODE {INCREMENTAL | FULL}]
  [INTERVAL IntervalValue {MINUTE[S] | SECOND[S] | MILLISECOND[S] }]
  [STATE {ON|OFF|PAUSED}]
 ]
 FROM
  {[Owner.]TableName (
    {ColumnDefinition[,...]}
    [,PRIMARY KEY(ColumnName[,...])]
    [,FOREIGN KEY(ColumnName [,...])
            REFERENCES RefTableName (ColumnName [,...])]
                    [ON DELETE CASCADE])
 [UNIQUE HASH ON (HashColumnName[,...]) PAGES=PrimaryPages]
 [AGING {LRU|
         USE ColumnName
         LIFETIME Num1 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]}
         [CYCLE Num2 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]}]
        }[ON|OFF]
 ]
 [WHERE ExternalSearchCondition]
} [,...]

非同期ライトスルー・キャッシュ・グループの場合:

CREATE [DYNAMIC] [ASYNCHRONOUS] WRITETHROUGH CACHE GROUP   [Owner.]CacheGroupName
  FROM
   {[Owner.]TableName (
     {ColumnDefinition[,...]}
    [,PRIMARY KEY(ColumnName[,...])]
     [FOREIGN KEY(ColumnName [,...])
          REFERENCES RefTableName (ColumnName [,...])]
      [ON DELETE CASCADE])
 [UNIQUE HASH ON (HashColumnName[,...]) PAGES=PrimaryPages]
 [AGING {LRU|
     USE ColumnName
          LIFETIME Num1 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]}
         [CYCLE Num2 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]}]
     }[ON|OFF]
 ]
} [,...]

同期ライトスルー・キャッシュ・グループの場合:

CREATE [DYNAMIC] SYNCHRONOUS WRITETHROUGH
CACHE GROUP [Owner.]CacheGroupName
 FROM 
   {[Owner.]TableName (
     {ColumnDefinition[,...]}
    [,PRIMARY KEY(ColumnName[,...])]
     [FOREIGN KEY(ColumnName [,...])
            REFERENCES RefTableName (ColumnName [,...])]
   [ON DELETE CASCADE])
 [UNIQUE HASH ON (HashColumnName[,...]) PAGES=PrimaryPages]
 [AGING {LRU|
     USE ColumnName
         LIFETIME Num1 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]}
         [CYCLE Num2 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]}]
     }[ON|OFF]
 ]
} [,...]

ユーザー管理キャッシュ・グループの場合:

CREATE [DYNAMIC][USERMANAGED] CACHE GROUP [Owner.]CacheGroupName
 [AUTOREFRESH
   [MODE {INCREMENTAL | FULL}]
   [INTERVAL IntervalValue {MINUTE[S] | SECOND[S] | MILLISECOND[S] }]
   [STATE {ON|OFF|PAUSED}]
 ]
  FROM 
   {[Owner.]TableName (
    {ColumnDefinition[,...]}
    [,PRIMARY KEY(ColumnName[,...])]
    [FOREIGN KEY(ColumnName[,...])
          REFERENCES RefTableName (ColumnName [,...])]
    [ON DELETE CASCADE]
    [,{READONLY | PROPAGATE | NOT PROPAGATE}])
 [UNIQUE HASH ON (HashColumnName[,...]) PAGES=PrimaryPages]
 [AGING {LRU|
         USE ColumnName
             LIFETIME Num1 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]}
             [CYCLE Num2 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]}]
        }[ON|OFF]
 ]
 [WHERE ExternalSearchCondition]
} [,...]

パラメータ

キャッシュ・グループ定義のFROMキーワードより前のパラメータは次のとおりです。

パラメータ 説明

[Owner.]CacheGroupName

新しいキャッシュ・グループに割り当てられる所有者および名前です。

DYNAMIC

TimesTen Classicのみでサポートされています。

指定すると、動的キャッシュ・グループが作成されます。

HYBRID

TimesTen Classicのみでサポートされています。

指定すると、Oracleデータベースにルート表が存在しない動的な読取り専用キャッシュ・グループになります。

AUTOREFRESH

AUTOREFRESHパラメータは、Oracle Databaseからキャッシュ・グループに自動的に変更を伝播します。

MODE [INCREMENTAL | FULL]

自動リフレッシュ時に更新されるキャッシュ内の行を指定します。INCREMENTAL句が指定された場合、TimesTenは前回の伝播以降にOracle Databaseに加えられた変更のみをリフレッシュします。FULL句が指定された場合、TimesTenは自動リフレッシュのたびにキャッシュ内のすべての行を更新します。デフォルトの自動リフレッシュ・モードはINCREMENTALです。

TimesTen Scaleoutでは、MODE INCREMENTALがサポートされています。

INTERVAL IntervalValue

自動リフレッシュを行う時間隔を分、秒またはミリ秒の単位で指定します。IntervalValueには、自動リフレッシュを実行する頻度を分、秒またはミリ秒の単位の整数値で指定します。IntervalValueのデフォルト値は5分です。自動リフレッシュ間隔を0ミリ秒に設定すると、連続的な自動リフレッシュが可能になり、最後の自動リフレッシュ・サイクルが終了した直後に次の自動リフレッシュ・サイクルがスケジュールされます。詳細は、『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』「キャッシュ・グループの自動リフレッシュ」を参照してください。

指定した時間隔でAUTOREFRESHを完了できない場合は、実行時に警告が生成され、現在の処理が終了するまで次回のAUTOREFRESHを待機します。待機キューが10に達すると、サポート・ログに通知メッセージが生成されます。

STATE [ON | OFF | PAUSED]

キャッシュ・グループの作成時に自動リフレッシュをONOFFまたはPAUSEDのいずれにするかを設定します。この設定は、ALTER CACHE GROUP文を使用して後で変更できます。デフォルトでは、AUTOREFRESHの状態はPAUSEDです。

FROM

キャッシュ・グループに1つ以上の表定義を指定します。

FROMキーワード以降のすべての記述は、キャッシュ・グループがキャッシュするOracle Database表の定義で構成されています。各表定義の構文は、CREATE TABLE文と同様です。ただし、キャッシュ・グループ表には、主キー制約が必要です。

表定義には次のパラメータがあります。

パラメータ 説明

[Owner.]TableName

新しい表に割り当てる所有者および名前です。 所有者名を指定しない場合は、新しい表の所有者名としてログイン名が使用されます。

ColumnDefinition

表の個々の列の名前、データ型およびNULL値可能かどうかを指定します。各表には、列が少なくとも1つ必要です。

PRIMARY KEY (ColumnName[,...])

表に主キーを指定します。キャッシュ・グループには、主キー制約が必要です。ColumnNameは、作成される表の主キー列の名前です。主キーには最大16列を指定できます。1つの指定内でUNIQUEとともに指定することはできません。

FOREIGN KEY (ColumnName[,...])

表に外部キーを指定します。ColumnNameは、作成される表の外部キー列の名前です。

REFERENCES RefTableName (ColumnName[,...])

外部キーを関連付ける表を指定します。RefTableNameは参照される表の名前で、ColumnNameはその表の参照される列の名前です。

[ON DELETE CASCADE]

ON DELETE CASCADE参照アクションを有効にします。指定されている場合、参照先キーの値を含む行が親表から削除されると、依存する外部キーの値を持つ子表の行も削除されます。

READONLY

キャッシュされた表に対する変更の禁止を指定します。

PROPAGATE|NOT PROPAGATE

TimesTen Classicのみでサポートされています。

キャッシュされた表への変更が、コミット時に自動的に対応するOracle Database表に伝播されるかどうかを指定します。

UNIQUE HASH ON (HashColumnName)

この表にハッシュ索引を作成することを指定します。HashColumnNameには、この表のハッシュ・キーに含める列を指定します。ハッシュ索引に指定される列は、主キーの列と同じである必要があります。

PAGES = PrimaryPages

表の想定ページ数に基づいてハッシュ索引のサイズを設定します。PrimaryPagesの値は、表の想定行数を256で除算して決定します。たとえば、表に256,000行ある場合は、PrimaryPagesに1000を指定します(256000/256=1000)。

PrimaryPagesの値は、0を含まない正の定数である必要があります。

PrimaryPagesの推定値が小さすぎると、パフォーマンスが悪化します。

ハッシュ索引の詳細は、「CREATE TABLE」を参照してください。

WHERE ExternalSearchCondition

Oracle Databaseでキャッシュ・グループに対して評価されるWHERE句。このWHERE句は、キャッシュ・グループに対するすべてのLOADREFRESH処理に追加されます。他の表を直接参照することはできません。TimesTenとOracle Databaseの両方で解析されます。『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』「WHERE句の使用」を参照してください。

ParentDistributionClause

TimesTen Scaleoutの場合は、増分自動リフレッシュを使用した静的読取り専用キャッシュ・グループ内の親表に対する分散句です。次の分散スキームが親表でサポートされています。

  • DISTRIBUTE BY HASH [(ColumnName [,...])]

  • DUPLICATE

ChildDistributionClause

TimesTen Scaleoutの場合は、増分自動リフレッシュを使用した静的読取り専用キャッシュ・グループ内の子表に対する分散句です。次の分散スキームが子表でサポートされています。

  • DISTRIBUTE BY HASH [(ColumnName [,...])]

  • DISTRIBUTE BY REFERENCE [(ForeignKeyConstraint)]

  • DUPLICATE

AGING LRU [ON | OFF]

TimesTen Classicのみでサポートされています。

指定する場合、ルート表にLRUエージング・ポリシーを定義します。LRUエージング・ポリシーはキャッシュ・グループのすべての表に適用します。LRUエージング・ポリシーでは、エージングのタイプ(LRU)、エージング状態(ONまたはOFF)およびLRUエージング属性を定義します。

エージング状態をONまたはOFFのいずれかに設定します。ONはエージング状態が有効であり、エージングが自動的に実行されることを示します。OFFはエージング状態が無効であり、エージングが自動的に実行されないことを示します。両方の場合、エージング・ポリシーが定義されます。デフォルトはONです。

動的キャッシュ・グループでは、LRUエージングはデフォルトでONになります。ただし、時間ベースのエージングを指定したり、LRUエージングを構文レベルでOFFに設定することができます。

キャッシュ・グループが動的でないかぎり、自動リフレッシュ属性が指定されたキャッシュ・グループにはLRUエージングを指定できません。

LRU属性は、組込みプロシージャのttAgingLRUConfigまたはttAgingTableLRUConfigのどちらか(あるいはその両方)をコールすることで定義します。LRU属性はSQLレベルでは定義できません。詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』「ttAgingLRUConfig」および「ttAgingTableLRUConfig」と、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』「表へのエージング・ポリシーの実装」を参照してください。

AGING USE ColumnName...[ON|OFF]

TimesTen Classicのみでサポートされています。

指定する場合、ルート表に時間ベースのエージング・ポリシーを定義します。時間ベースのエージング・ポリシーはキャッシュ・グループのすべての表に適用します。時間ベースのエージング・ポリシーでは、エージングのタイプ(時間ベース)、エージング状態(ONまたはOFF)および時間ベースのエージング属性を定義します。

エージング状態をONまたはOFFのいずれかに設定します。ONはエージング状態が有効であり、エージングが自動的に実行されることを示します。OFFはエージング状態が無効であり、エージングが自動的に実行されないことを示します。両方の場合、エージング・ポリシーが定義されます。デフォルトはONです。

時間ベースのエージング属性はSQLレベルで定義され、LIFETIME句およびCYCLE句で指定します。

時間ベース・エージングに使用する列の名前としてColumnNameを指定します。列は、NOT NULLTIMESTAMPデータ型またはDATEデータ型として定義します。この列の値がSYSDATEから差し引かれ、指定した単位(秒、分、時間、日数)を使用して切り捨てられた後、LIFETIME値との比較が行われます。結果がLIFETIME値より大きい場合、その行はエージングの候補となります。

エージングに使用される列の値は、アプリケーションによって更新されます。この列の値が不明な行がある場合、その行がエージ・アウトされないようにするには、列に大きなデフォルト値を定義します(この列はNULLにはできません)。

時間ベースのエージングの詳細は、『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』「TimesTen Classicのキャッシュ・グループでのエージングの実装」を参照してください。

LIFETIME Num1 {SECOND[S]|MINUTE[S]|HOUR[S]DAY[S]}

TimesTen Classicのみでサポートされています。

LIFETIMEは時間ベースのエージング属性で、必須の句です。

AGING USE ColumnName句の後にLIFETIME句を指定します。

LIFETIME句には、データがキャッシュに保持されることが保証される時間を指定します。

Num1には、行がキャッシュに保持される時間の長さを、秒、分、時間または日数で表す正の整定数を指定します。LIFETIME値を超えた行はエージ・アウト(表から削除)されます。

時間の単位の概念がサポートされています。時間の単位にDAYSを指定した場合、タイムスタンプの日付が同じ日になっているすべての行が同時にエージ・アウトされます。また、HOURSを時間の単位に指定した場合は、タイムスタンプ値の時間が同じ行が、すべて同時にエージ・アウトされます。LIFETIMEの3 DAYSは、LIFETIMEの72 HOURS(3×24)やLIFETIMEの432 MINUTES(3×24×60)とは異なります。

[CYCLE Num2 {SECOND[S] | MINUTE[S] |HOUR[S]|DAY[S]}]

TimesTen Classicのみでサポートされています。

CYCLEは時間ベースのエージング属性で、オプションです。LIFETIME句の後にCYCLE句を指定します。

CYCLE句は、データが指定したLIFETIME値を超えているかどうか、その結果エージ・アウト(削除)する必要があるかどうかを確認するために、システムで行をチェックする頻度を指定します。

Num2には、正の整数を指定します。

CYCLE句を指定しない場合、デフォルト値は5分です。Num2に0を指定した場合、エージング・スレッドは1秒ごとに起動します。

エージング状態がOFFの場合、エージングは自動的に実行されず、CYCLE句は無視されます。

TimesTen Scaleoutのキャッシュ・グループ

TimesTen Scaleoutは、増分自動リフレッシュを使用した静的読取り専用キャッシュ・グループがサポートしています。分散スキームは、親表と1つ以上の子表に指定できます。分散スキームでは、データベースの要素間にデータを分散する方法を指定します。

分散スキームは、DISTRIBUTE BY句によって示されます。
  • 単一表キャッシュ・グループの場合、デフォルトの分散スキームはHASHです。
  • DISTRIBUTE BY句で列を指定しない場合は、主キー列が分散スキームのキー列として使用されます。
  • 複数表キャッシュ・グループの場合は、親表にHASHまたはDUPLICATEの分散スキームを指定できます。DUPLICATE分散スキームを定義する場合は、子表にHASHまたはDUPLICATEのみを指定できます。
  • 複数表キャッシュ・グループの場合は、HASHが親表のデフォルト分散スキームになり、すべての子表はREFERENCE分散スキームにデフォルト設定されます。親表にDUPLICATEを指定して、子表に分散スキームを指定しない場合、子表のデフォルト分散スキームはDUPLICATEになります。
  • 子表の外部キーと親表の主キーが同じ場合、子表には最適化としてHASH分散スキームが使用されます。
  • 子表は参照によって分散することをお薦めします。
次のものはサポートされません。
  • 完全自動リフレッシュ・モード
  • エージング
  • マテリアライズド・ビュー
  • グローバル索引

TimesTen Classicのキャッシュ・グループ

動的ハイブリッド読取り専用キャッシュ・グループ

動的ハイブリッド読取り専用キャッシュ・グループとは、Oracleデータベースにルート表が存在しない動的な読取り専用キャッシュ・グループのことです。ルート表は、キャッシュ・グループ定義から自動的にTimesTenデータベースに作成されます。キャッシュ・グループ定義には、このルート表がOracleデータベースに存在するかのような記述が含まれています。

説明および制限:
  • ルート表は、Oracleデータベースに存在していないことが必要です。
  • TimesTenデータベース内のルート表には、主キーが必要です。
  • ルート表には、主キーの列のみを含めることができます。主キーは、少なくとも1つの子表から参照される必要があります。
  • 動的ロードのトリガーには、SELECT文のFROM句で導出表を使用できます。SELECT問合せでは、同じハイブリッド・キャッシュ・グループの複数の表を指定することもできます。
  • TimesTenデータベース内のルート表に対してSELECT問合せを発行した場合は、このSELECT操作が動的ロードをトリガーすることはありません。
  • このタイプのキャッシュ・グループには、時間ベースのエージングを指定できません。LRUエージングは、デフォルトで有効になっています。
  • キャッシュ・グループ定義では、WHERE句はサポートされません。
  • LOAD CACHE GROUP文を使用して、手動でキャッシュ・グループをロードすることはできません。
  • UNLOAD CACHE GROUP ...WITH ID文はサポートされません。

動的ハイブリッド読取り専用キャッシュ・グループの詳細は、『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』「ハイブリッド・キャッシュ・グループ」を参照してください。

キャッシュ・グループの説明

  • 2つのキャッシュ・グループで所有者名とグループ名を同じにすることはできません。所有者名を指定しない場合、スキーマは新しいキャッシュ・グループの所有者名になります。

  • キャッシュ表名およびキャッシュ・グループ名のどちらにも、#を含めることはできません。

  • WHERE句に動的パラメータを指定することはできません。

  • Oracle Databaseの一時表はキャッシュできません。

  • 各表は、Oracle Databaseの表と対応している必要があります。

  • Oracle Databaseでは、親子関係を定義して、子表の外部キー列にNULL値を挿入できます。子表の該当行は、NULL親を参照していることになります。この状態で、キャッシュ・グループを作成して、Oracle Database表の親子関係をキャッシュできます。ただし、Oracle Database表からキャッシュ・グループにデータをロードする場合は、外部キー列にNULL値を持つ行はロードされません。TimesTenでは、キャッシュする表で、外部キーがNULL親を表す親子関係が定義された場合は、キャッシュ・グループを作成しないことをお薦めします。

  • 小文字のデリミタ付き識別子を使用してキャッシュ表に名前を付けることはできません。TimesTenの表の名前は大文字と小文字が区別されず、大文字として格納されます。キャッシュ表の名前はOracle Database表の名前と同じである必要があります。TimesTenの大文字の表名は、大文字と小文字が混在するOracle Databaseの表の名前と一致しません。解決方法として、Oracle Databaseの表のシノニムを作成し、そのシノニムをキャッシュ・グループの表名として使用します。この解決方法は、読取り専用キャッシュ・グループまたはAUTOREFRESHパラメータが設定されたキャッシュ・グループには適用できません。

  • キャッシュ表の各列の名前およびデータ型は、Oracle Databaseの表の各列と一致する必要があります。『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』「Oracle Databaseデータ型とTimesTenデータ型の間のマッピング」を参照してください。また、WHERE句内で列名を参照する場合は、各列名を所有者と表名で完全に修飾する必要があります。

  • WHERE句は、キャッシュ・グループ表のみ直接参照できます。キャッシュ・グループ外の表は、副問合せでのみ参照できます。

  • 一般的には、CREATE CACHE GROUPLOAD CACHE GROUPUNLOAD CACHE GROUPREFRESH CACHE GROUPまたはFLUSH CACHE GROUP文のWHERE句の列名を完全に修飾する必要はありません。ただし、同一キャッシュ・グループ内の複数の表を結合する問合せがTimesTenによって自動的に生成されるため、キャッシュ・グループ内に同じ名前の列を持つ表が複数ある場合は、列を完全に修飾する必要があります。

  • デフォルトでは、キャッシュ・グループ表で主キーを使用するために範囲索引が作成されます。主キーに対してハッシュ索引を指定する場合は、UNIQUE HASH句を使用します。

    • アプリケーションでキャッシュ・グループ表の主キーに対して範囲問合せを実行する場合は、UNIQUE HASH句を省略して、そのキャッシュ・グループ表に対して範囲索引を選択してください。

    • ただし、主キーの完全一致検索のみをアプリケーションで実行する場合は、ハッシュ索引の方がレスポンス時間およびスループットが優れている場合があります。その場合は、UNIQUE HASH句を指定します。UNIQUE HASH句の詳細は、「CREATE TABLE」を参照してください。

    • 表の主キーで使用する索引を変更するには、ALTER TABLEを使用します。

  • PROPAGATE属性が指定されたキャッシュ・グループ表と、SWTキャッシュ・グループおよびAWTキャッシュ・グループの表の場合、ON DELETE CASCADEで指定する外部キーは、Oracle Database表のON DELETE CASCADEで指定されている外部キーの適切なサブセットであることが必要です。

  • CREATE CACHE GROUP文はシリアライズ可能分離レベルでは実行できません。実行しようとするとエラー・メッセージが返されます。

AUTOREFRESHパラメータは、Oracle DatabaseからTimesTenキャッシュ・グループに自動的に変更を伝播します。静的なキャッシュ・グループの場合、削除、更新および挿入がOracle Databaseからキャッシュ・グループに自動的に伝播されます。動的キャッシュ・グループの場合、削除と更新のみが伝播されます。指定されたOracle Database表への挿入は動的キャッシュ・グループには伝播されません。これらは、アプリケーションで参照されたときに、動的にTimesTen Cacheにロードされます。また、アプリケーションで明示的にロードすることもできます。

キャッシュ・グループで自動リフレッシュを使用するには、キャッシュ・グループを作成する際にAUTOREFRESHを指定する必要があります。MODESTATEおよびINTERVAL AUTOREFRESHの設定は、ALTER CACHE GROUP文を使用することによって、キャッシュ・グループが作成された後で変更できます。キャッシュ・グループをAUTOREFRESHまたはPROPAGATEに指定した後は、これらの属性を変更することはできません。読取り専用キャッシュ・グループを作成する場合は、自動リフレッシュ句を指定する必要はありません。読取り専用キャッシュ・グループは、デフォルトで増分自動リフレッシュに設定されます。

TimesTenでは、FULLまたはINCREMENTAL AUTOREFRESHがサポートされています。FULLモードでは、キャッシュ全体が定期的にアンロードされてから再ロードされます。INCREMENTALモードでは、Oracle Databaseにトリガーがインストールされて変更の追跡が行われ、特定のOracle表で変更された行のみが定期的に更新されます。自動リフレッシュの状態がPAUSEDになっている場合を除き、最初の増分リフレッシュは常に完全リフレッシュになります。デフォルトのモードはINCREMENTALです。

FULL AUTOREFRESHは、Oracle Database表でほとんどの行が変更されている場合に効果的です。変更が少ない場合は、INCREMENTAL AUTOREFRESHがより有効です。

TimesTenは、AUTOREFRESHを指定した文を含むトランザクションがコミットされたときに、自動リフレッシュ操作をスケジュールします。自動リフレッシュをスケジュールする文は、次のとおりです。

自動リフレッシュの頻度は、指定した時間隔によって決まります。

AUTOREFRESHSTATEには、ONOFFまたはPAUSEDが指定できます。デフォルトでは、自動リフレッシュの状態はPAUSEDです。

NOT PROPAGATE属性とAUTOREFRESH属性を同時に使用することはできません。

キャッシュ・グループでのエージング:

  • 時間ベースのエージングでは、スライド期間を指定できます。『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』「TimesTen Classicでのスライド期間の構成」を参照してください。

  • 表のエージング・ポリシーを定義した後に、エージング・ポリシーをLRUから時間ベースに、または時間ベースからLRUに変更できません。最初にエージングを削除し、表を変更して新しいエージング・ポリシーを追加する必要があります。

  • エージング・ポリシーは、エージング状態を変更するように定義する必要があります。

  • 1つのシステムでLRUエージングと時間ベースのエージングの両方を組み合せて使用できます。LRUエージングのみを使用する場合、エージング・スレッドはデータベース全体に指定されたサイクルに基づいて起動します。一方、時間ベースのエージングのみを使用する場合、エージング・スレッドは最適な頻度に基づいて起動します。この頻度は、データベースに対するCYCLE句で指定された値によって決定されます。LRUエージングと時間ベースのエージングの両方を使用する場合は、両方のタイプを組み合せて考慮した上でスレッドが起動します。

  • エージング状態がONOFFかにかかわらずエージング処理をすぐにスケジュールするには、ttAgingScheduleNowプロシージャをコールします。

  • LRUエージングでは、行がアクセスされているかまたは参照されているかどうかを、次のルールで判断します。

    • SELECT文の結果セットを構築するために使用された行。

    • INSERT...SELECT文の結果セットを構築するために使用された行。

    • 更新または削除対象の行。

  • コマンドで参照される表に対してLRUエージングの削除や追加を行うと、コンパイルされたコマンドは無効と指定され、再コンパイルが必要になります。

  • 使用

    LRUエージングでは、子行がエージングの対象でない場合、この子行とその親行は削除されません。ON DELETE CASCADEの設定は無視されます。

  • 時間ベースのエージングでは、親行がエージングの対象である場合、すべての子行が削除されます。ON DELETE CASCADEは、設定の有無にかかわらず無視されます。

  • ルート表にLRUエージング・ポリシーまたは時間ベースのエージング・ポリシーを指定します。ポリシーはキャッシュ・グループのすべての表に適用します。

  • 時間ベースのエージング・ポリシーの場合、エージング列を追加または変更できません。これは、NOT NULL列を追加または変更できないためです。

  • キャッシュ・グループのエージングを定義する場合の制限:

    • 動的キャッシュ・グループでないかぎり、LRUエージングは自動リフレッシュ属性が設定されたキャッシュ・グループではサポートされません。

    • キャッシュ・エージェントがアクティブの間は、読取り専用キャッシュ・グループまたはAUTOREFRESH属性を持つキャッシュ・グループに対するエージング・ポリシーの追加、変更または削除はできません。まず、キャッシュ・エージェントを停止してください。

    • 時間ベースのエージングに使用されている列は削除できません。

例: TimesTen Classic

次に示す例は、TimesTen Classicに固有です。TimesTen Scaleoutのキャッシュ・グループの使用の詳細および例は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』「TimesTen Scaleoutでのキャッシュ・グループの使用」を参照してください。

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

CREATE READONLY CACHE GROUP customerorders
AUTOREFRESH INTERVAL 10 MINUTES
FROM
customer (custid INT NOT NULL,
       name CHAR(100) NOT NULL,
       addr CHAR(100),
       zip INT,
       region CHAR(10),
       PRIMARY KEY(custid)),
ordertab (orderid INT NOT NULL,
       custid INT NOT NULL,
       PRIMARY KEY (orderid),
       FOREIGN KEY (custid) REFERENCES customer(custid));

ASYNCHRONOUS WRITETHROUGHキャッシュ・グループを作成します。

CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP cstomers
FROM
customer (custid INT NOT NULL,
       name CHAR(100) NOT NULL,
       addr CHAR(100),
       zip INT,
       PRIMARY KEY(custid));

SYNCHRONOUS WRITETHROUGHキャッシュ・グループを作成します。

CREATE SYNCHRONOUS WRITETHROUGH CACHE GROUP customers
FROM
customer (custid INT NOT NULL,
       name CHAR(100) NOT NULL,
       addr CHAR(100),
       zip INT,
       PRIMARY KEY(custid));

ユーザー管理キャッシュ・グループを作成します。

CREATE USERMANAGED CACHE GROUP updateanywherecustomers
AUTOREFRESH
       MODE INCREMENTAL
       INTERVAL 30 SECONDS
       STATE ON
FROM
customer (custid INT NOT NULL,
       name CHAR(100) NOT NULL,
       addr CHAR(100),
       zip INT,
       PRIMARY KEY(custid),
       PROPAGATE);

時間ベースのエージングが指定されたキャッシュ・グループを作成します。エージング用の列として、agetimestampを指定します。LIFETIMEは2時間、CYCLEは30分を指定します。エージング状態は指定しないため、デフォルト設定(ON)が使用されます。

CREATE READONLY CACHE GROUP agingcachegroup
AUTOREFRESH
       MODE INCREMENTAL
       INTERVAL 5 MINUTES
       STATE PAUSED
FROM
customer (customerid NUMBER NOT NULL,
       agetimestamp TIMESTAMP NOT NULL,
       PRIMARY KEY (customerid))
       AGING USE agetimestamp LIFETIME 2 HOURS CYCLE 30 MINUTES;

Command> DESCRIBE customer;
Table USER.CUSTOMER:
  Columns:
   *CUSTOMERID                      NUMBER NOT NULL
    AGETIMESTAMP                    TIMESTAMP (6) NOT NULL
  AGING USE AgeTimestamp LIFETIME 2 HOURS CYCLE 30 MINUTES ON
1 table found.
(primary key columns are indicated with *)

Oracle Databaseで大文字と小文字が混在するデリミタ付き識別子の表名にシノニムを使用すると、大文字と小文字が混在する表名をTimesTenでキャッシュできます。まず、大文字と小文字が混在するOracle Database表名のキャッシュを試みます。"Could not find 'NameofTable' in Oracle"というエラーが表示されます。

Command> AUTOCOMMIT 0;
Command> PASSTHROUGH 3;
Command> CREATE TABLE "MixedCase" (col1 NUMBER PRIMARY KEY NOT NULL);
Command> INSERT INTO "MixedCase" VALUES (1);
1 row inserted.
Command> COMMIT;
Command> CREATE CACHE GROUP MixedCase1 from "MixedCase" 
        (col1 NUMBER PRIMARY KEY NOT NULL);
 5140: Could not find SAMPLEUSER.MIXEDCASE in Oracle.  May not have privileges.
The command failed.

ここで、PassThrough属性を使用して、シノニム"MIXEDCASE"をOracle Databaseに作成し、そのシノニムを表名として使用します。

Command> AUTOCOMMIT 0;
Command> PASSTHROUGH 3;
Command> CREATE SYNONYM "MIXEDCASE" FOR "MixedCase";
Command> COMMIT;
Command> CREATE CACHE GROUP MixedCase2 FROM "MIXEDCASE" 
         (col1 NUMBER PRIMARY KEY NOT NULL);
Warning  5147: Cache group contains synonyms
Command> COMMIT;

読取り専用キャッシュ・グループまたはAUTOREFRESH属性を持つキャッシュ・グループでシノニムの名前を使用してみます。次のエラーが表示されます。

Command> AUTOCOMMIT 0;
Command> PASSTHROUGH 3;
Command> CREATE SYNONYM "MIXEDCASE_AUTO" FOR "MixedCase";
Command> COMMIT;
Command> CREATE READONLY CACHE GROUP MixedCase3 AUTOREFRESH MODE
         INCREMENTAL INTERVAL 10 MINUTES FROM "MIXEDCASE_AUTO" 
         (Col1 NUMBER PRIMARY KEY NOT NULL);
 5142: Autorefresh is not allowed on cache groups with Oracle synonyms
The command failed.