IRISTEMPデータベースでどの一時グローバルがサイズ消費しているかを特定する方法
これは、InterSystems FAQサイトの記事です。
ある処理において、データを無期限に保存する必要がなくグローバルの強力な性能が必要になる場合に、IRISTEMP/CACHETEMP データベースに保存される一時グローバルが使用されます。
IRISTEMP/CACHETEMPデータベースはジャーナルされないので、一時グローバルの使用ではジャーナルファイルは作成されません。
IRISTEMP/CACHETEMP データベースは、システムで一時ストレージ用に使用され、ユーザも同じ用途で使用することができます。
一時グローバルとIRISTEMPデータベースの詳細については、以下のドキュメントをご覧ください。
一時グローバルと IRISTEMP データベース
一時グローバルとして使用されるグローバルには以下のようなものがあります。
1. システムテンポラリグローバル(^IRIS.Temp*、^%cspSession、^CacheTemp*、^mtemp* など)
2. ユーザが設定したIRISTEMP/CACHETEMPへのマッピングによる一時グローバル
3. プロセスプライベートグローバル (^||name、^|"^"|name、^["^"]name、^["^",""]name など)
4. GLOBAL TEMPORARY テーブル
⇒テーブル定義は永続(全てのプロセスで使用可能)で、テーブルデータはプロセスプライベートグローバルに格納します(プロセスの期間中のみ存続)
1,2 のサイズは ^%GSIZE ユーティリティで確認できます。
Directory name: c:\intersystems\iris\mgr\user\ => c:\intersystems\iris\mgr\iristemp\
// iristemp データベースフォルダを指定
All Globals? No => yes // 全てのグローバルを表示する場合は Yes 34 items selected from
34 available globals
Show details?? No => No // 詳細情報を表示しない場合は No
Device:
Right margin: 80 =>
:
3,4 のプロセスプライベートグローバルは、^GETPPGINFOユーティリティーで確認が可能です。
^GETPPGINFOユーティリティについては、以下のドキュメントをご覧ください
^GETPPGINFOユーティリティについて【IRIS】
^GETPPGINFOユーティリティについて
以下の例では、すべての現在プロセスのプロセスプライベートグローバルをリストしています。
set ^||flintstones(1)="Fred"
set ^||flintstones(2)="Wilma"
znspace "%SYS"
do ^GETPPGINFO("*")
プロセスプライベートグローバルを使用するプロセスのうち、使用量が多いものを個別に内容出力する方法もあります。
以下のサンプルでは、プロセスあたりのプロセスプライベートグローバルブロック数が20以上のものを出力しています。
set ns=$namespace znspace "%SYS" // 全プロセスよりPPGのブロック数が多いもののみ対象とする set st=##class(%SQL.Statement).%New() set status=st.%PrepareClassQuery("%SYS.ProcessQuery","AllFields") set rs=st.%Execute() while rs.%Next() { set pid=rs.%Get("Pid") // プロセスID set cnt=rs.%Get("PrivateGlobalBlockCount") // PPGのブロック数 // プロセスあたりのPPGブロック数が〇以上の時中身を出力(以下の例は20ブロック以上) if cnt > 20 { set rs2=##class(%ResultSet).%New("%SYS.ProcessQuery:PPG") // "N" Do not return subscripts of a PPG, just return the root name // "B" Return the number of blocks used by the PPG (needs the "N" option) do rs2.Execute("*",pid,"NB") for { quit:'rs2.Next() write cnt_" PID:"_pid_", PPG name "_rs2.GetData(1)_" is using "_rs2.GetData(3)_" disc blocks",! } } } znspace ns