記事
Megumi Kakechi · 2022年3月3日 3m read

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 ユーティリティで確認できます。

USER>do ^%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
0
0 67
ディスカッション (0)0
続けるにはログインするか新規登録を行ってください