一時グローバルと IRISTEMP データベースについて
IRISTEMPというデータベースをご存じでしょうか?
特定の処理に対してデータを無期限に保存する必要がなく、「同一プロセス内でのみ使用したい場合」や「IRISが起動中のみ使用したい場合」に、IRISTEMPデータベースに保存されるグローバルを使用できます。
IRISTEMPデータベースに保存されるグローバルに対する操作は ”一切ジャーナルされない” ため、効率性を最大限にしたい作業に使用できます。
IRISTEMPデータベースに保存されるグローバル(データ)には、以下の種類があります。
------------------------------------------------------------------------------------------------------------------------------------------------------------------
1. システムテンポラリグローバル(IRISが起動中は全ネームスペース&プロセスからアクセス可能)
2. プロセスプライベートグローバル(同一プロセス内でのみ、全ネームスペースからアクセス可能)
3. GLOBAL TEMPORARY テーブル(テーブルは全ネームスペース、データは各プロセスでアクセス可能)
4. その他:システムで使用されるテンポラリグローバル
------------------------------------------------------------------------------------------------------------------------------------------------------------------
1. システムテンポラリグローバル(一時グローバル)
IRIS の起動中のみ、全てのネームスペース&プロセスからアクセスできるグローバルです。
グローバル定義:
^IRIS.Temp*
^CacheTemp*
^mtemp* ※その他、IRISTEMP データベースにマッピングの定義をした独自の一時グローバル ← こちらの使用方法を推奨
IRISTEMP データベースにマッピングされるグローバルはすべて一時グローバルとして扱われます。
マッピングの方法は以下のドキュメントをご覧ください。
一時グローバルのマッピングの定義
特徴:
・IRISの起動中のみ全てのネームスペース・プロセスからアクセスが可能です
・IRISの終了時、一時グローバルはすべて削除されます
・ジャーナルされません
⇒効率性を最大限にするために、一時グローバルに対する変更はジャーナルファイルに記録されません。
トランザクション中もジャーナルされません。
2. プロセスプライベートグローバル
作成したプロセスからのみアクセス可能なグローバルです。プロセスの終了時、すべて削除されます。
グローバル定義:
^||name
^|"^"|name
^["^"]name
^["^",""]name
特徴:
・作成元のプロセスからのみアクセス可能です
・ネームスペース非依存であるため、全てのネームスペースから参照できます(同一プロセスのみ)
・ジャーナルされません
・プロセスが完了すると存在しなくなります(ローカル変数と同様)
詳細は以下のドキュメントをご覧ください。
プロセス・プライベート・グローバル
3. GLOBAL TEMPORARYテーブル
テーブル定義は全てのプロセス&ネームスペースで、データはテーブルを作成(データ挿入)したプロセスの間でのみアクセス可能なテーブルです。
特徴:
・テーブル定義は全てのプロセスで利用可能ですが、データはテーブルを作成したプロセスの間のみアクセス可能です
・データはプロセスプライベートグローバルに格納され、プロセスの終了時に削除されます(例:^||User.TempEmpD)
・一時テーブルの所有者は自動的に _PUBLIC に設定されます(全てのユーザがアクセス可能)
・テーブルの作成・更新はジャーナルされません
・CREATE GLOBAL TEMPORARY TABLE table ... で、テーブルをグローバル一時テーブルとして作成できます
例:
CREATEGLOBALTEMPORARYTABLE TempEmp (
EmpNum INTNOTNULL,
NameLast CHAR(30) NOTNULL,
NameFirst CHAR(30) NOTNULL,
CONSTRAINT EMPLOYEEPK PRIMARY KEY (EmpNum))
プロセスA(PID=19660) ※GLOBAL TEMPORARY TABLEにデータを Insert
USER>write$J19660
USER>:s// :sql または Do $SYSTEM.SQL.Shell() でもOK
SQL Command Line Shell
----------------------------------------------------
The command prefix is currently set to: <<nothing>>.
Enter <command>, 'q' to quit, '?' for help.
[SQL]USER>>insert into TempEmp values(10,'aaa','bbb')
1. insert into TempEmp values(10,'aaa','bbb')
1 Row Affected
statement prepare time(s)/globals/cmds/disk: 0.0091s/313/3,693/0ms
execute time(s)/globals/cmds/disk: 0.0002s/4/169/0ms
cached query class: %sqlcq.USER.cls2
---------------------------------------------------------------------------
[SQL]USER>>select * from TempEmp
2. select * from TempEmp
EMPNUM NAMELAST NAMEFIRST
10 aaa bbb
1 Rows(s) Affected
statement prepare time(s)/globals/cmds/disk: 0.0008s/24/1,613/0ms
execute time(s)/globals/cmds/disk: 0.0004s/2/645/0ms
cached query class: %sqlcq.USER.cls1
---------------------------------------------------------------------------
[SQL]USER>>
プロセスB(PID=10520) ※ 異なるプロセスではデータが見えない。テーブルは操作可能。
USER>write$J10520
USER>:s// :sql または Do $SYSTEM.SQL.Shell() でもOK
SQL Command Line Shell
----------------------------------------------------
The command prefix is currently set to: <<nothing>>.
Enter <command>, 'q' to quit, '?' for help.
[SQL]USER>>select * from TempEmp
1. select * from TempEmp
EMPNUM NAMELAST NAMEFIRST
0 Rows(s) Affected
statement prepare time(s)/globals/cmds/disk: 0.0038s/307/2,716/0ms
execute time(s)/globals/cmds/disk: 0.0003s/1/569/0ms
cached query class: %sqlcq.USER.cls1
---------------------------------------------------------------------------
[SQL]USER>>4. その他:システムで使用されるテンポラリグローバル
その他、システム内部で使用されるテンポラリグローバルもあります。
1. Interoperabilityで使用する管理関連の一時データ:^IRIS.Temp.Ens* 2. クエリプランのモジュールが処理を実行する際に結果が格納される内部的な一時ファイル関連 ※クエリプランで temp-file A, temp-file B... のような一時ファイルを使用している場合など
などが挙げられます。
1については、大量のInteroperability管理データの削除を行った際にIRISTEMPデータベースが肥大化する場合があります。
2については、巨大なテーブルに対するクエリや、大きなサイズのストリームデータを扱うクエリを実行する際に、IRISTEMPデータベースが肥大化する場合があります。
IRISの再起動でIRISTEMPに保存された一時グローバルのデータは全て削除されますが、一度肥大化したIRISTEMPデータベースサイズは自動では縮小されません。
IRISTEMPデータベースの縮小方法については、「IRISTEMPデータベースの縮小方法を教えてください」の記事をご覧ください。
詳細は以下のドキュメントをご覧ください。
一時グローバルと IRISTEMP データベース
【ご参考】
特定のテーブルデータのみをロールバックしないようにする
グローバル単位でジャーナルのON/OFF設定をする方法はありますか?
IRISTEMPデータベースの縮小方法を教えてください
IRISTEMPデータベースでどの一時グローバルがサイズ消費しているかを特定する方法
IRISTEMP / CACHETEMP 上のグローバルのみを参照する方法について