一時グローバルと IRISTEMP データベース
特定の処理に対して、データを無期限に保存する必要なく、グローバルの強力な性能が必要になる場合もあります。例えば、グローバルを使用して、ディスクに保存する必要のないデータをソートするとします。このような処理に備え、InterSystems IRIS® データ・プラットフォームには一時グローバルのメカニズムが用意されています。
一時グローバルには、以下のような特性があります。
-
一時グローバルは IRISTEMP データベース内に保存されます。このデータベースは常にローカル・データベース (つまり、非ネットワーク・データベース) として定義されます。IRISTEMP データベースにマッピングされるグローバルはすべて一時グローバルとして扱われます。
-
一時グローバルに対する変更はディスクに書き込まれません。代わりに、それらの変更はメモリ内バッファ・プールに保持されます。バッファ・プール内に十分な容量がない場合、サイズの大きい一時グローバルはディスクに書き込まれることがあります。
-
効率性を最大限にするために、一時グローバルに対する変更はジャーナル・ファイルに記録されません。
-
一時グローバルは、InterSystems IRIS の再起動時に常に自動的に削除されます (注意:ライブ・システムを再起動する時間がなかなか取れない場合があります。このため、一時グローバルを削除するためにこの方法に頼らないようにしてください)。
一時グローバルは、複数のプロセスによって使用される一時データを必要とする場合に便利です。単独のプロセス内でのみ使用される一時データを必要とする場合は、プロセス・プライベート・グローバルを使用することを検討してください。これは、そのグローバルを作成したプロセス内でのみ使用可能で、プロセスの終了時に自動的に削除される特殊な形式の変数です。
一時グローバルの使用法
一時グローバルを使用するための仕組みは以下のように機能します。
-
アプリケーション・ネームスペースでは、特定の命名規則を持つグローバルが IRISTEMP データベースにマッピングされるように、グローバル・マッピングを定義します。このデータベースは、後述するように特別なデータベースです。
例えば、^AcmeTemp* という形式の名前を持つすべてのグローバルが IRISTEMP データベースにマッピングされるように、グローバル・マッピングを定義することができます。
-
コードで、一時的にデータを格納して再度読み取る必要がある場合、そのコードは、この命名規則を使用するグローバルとの間で読み書きを行います。
例えば、値を保存する場合、コードで以下を実行します。
set ^AcmeTempOrderApp("sortedarray")=some value
その後、以下を実行します。
set somevariable = ^AcmeTempOrderApp("sortedarray")
一時グローバルを使用することにより、IRISTEMP データベースがジャーナルされないという事実を利用します。データベースはジャーナルされないので、データベースを使用する操作では、ジャーナル・ファイルは作成されません。ジャーナル・ファイルは大きくなり、スペースの問題を引き起こす可能性があります。ただし、以下の点について注意してください。
-
IRISTEMP データベースでグローバルを変更するトランザクションをロールバックすることはできません。この動作は IRISTEMP に固有です。トランザクションを介して一時的な作業を管理する必要がある場合は、その目的のために IRISTEMP でグローバルを使用しないでください。
-
IRISTEMP は、保存する必要のない作業にのみ使用するようにしてください。
-
IRISTEMP データベースでより多くのメモリが必要な場合は、データベースのサイズが増えます。MaxIRISTempSizeAtStart パラメータを使用して IRISTEMP のサイズを管理できます。
一時グローバルのマッピングの定義
一時グローバルのマッピングを定義するには、以下の操作を実行します。
-
命名規則を選択し、すべての開発者がそれを認識していることを確認します。以下の点に注意してください。
-
多数の一時グローバルを用意するか、複数のノードを持つ少数の一時グローバルを用意するかを検討してください。InterSystems IRIS は、同等の数の別個のグローバルを読み書きするのと比べて、同じグローバル内の異なるノードを効率的に読み書きする方が簡単です。この効率の差は、グローバルの数が少ない場合は無視できますが、数百の別個のグローバルがある場合には顕著になります。
-
複数のネームスペースで同じグローバル・マッピングを使用する場合は、あるネームスペースの作業が別のネームスペースの作業を妨げないようにシステムを開発してください。例えば、グローバル内のサブスクリプトとしてネームスペース名を使用できます。
-
同様に、1 つのネームスペース内であっても、干渉を避けるために、コードの各部分が、異なるグローバルを使用するか、または同じグローバル内で異なるサブスクリプトを使用するようにシステムを開発してください。
-
システム予約グローバル名は使用しないでください。"回避する必要があるグローバル変数名" を参照してください。
-
-
管理ポータルで、[ネームスペース] ページに移動します ([システム管理]→[構成]→[システム構成]→[ネームスペース])。
-
アプリケーション・ネームスペースの行で、[グローバルマッピング] をクリックします。
-
[グローバルマッピング] ページで、[新規グローバルマッピング] をクリックします。
-
[グローバルデータベース位置] で、IRISTEMP を選択します。
-
[グローバル名] で、アスタリスク (*) で終わる名前を入力します。名前の先頭にキャレットを含めないでください。
例 : AcmeTemp*
このマッピングにより、AcmeTemp* で始まる名前を持つすべてのグローバルが IRISTEMP データベースにマッピングされます。
-
[OK] をクリックします。
Note:新規のマッピング行の最初の列に表示される [>>] の記号は、マッピングを編集可能で開いていることを示します。
-
InterSystems IRIS で使用するようにマッピングを保存するには、[変更を保存] をクリックします。
詳細は、"ネームスペースの構成" を参照してください。
IRISTEMP のシステム使用
インターシステムズでは、一時システム・グローバルをスクラッチ・スペースとして使用します。例えば、特定のクエリ (ソート、グループ分け、集約の計算用など) の実行中に、一時インデックスとして使用します。これらのグローバルは自動的に IRISTEMP にマッピングされます。以下のようなものがあります。
-
^IRIS.Temp*
-
^CacheTemp*
-
^mtemp*
これらのグローバルは変更しないでください。
^CacheTemp グローバル
従来、名前の先頭に ^CacheTemp の付いたグローバルが一時グローバルとして使用されてきました。慣例として、これらのグローバルでは、先頭に ^CacheTempUser の付いた名前を使用して、一時システム・グローバルとの競合が発生する可能性を回避しています。ただし、ベスト・プラクティスは、独自の一時グローバルを定義して IRISTEMP にマッピングすることです。これについては、"一時グローバルの使用法" で説明しています。