投稿者

Training Sales Engineer at InterSystems Japan
記事 Mihoko Iijima · 1月 29, 2021 4m read

グローバルのサイズをプログラミングで取得する方法

これは InterSystems FAQ サイトの記事です。

システム提供の %SYS.GlobalQueryクラス の Size クエリーを使用することで取得できます。

2026/3/31 更新:%SQL.Statementクラスの利用方法を追加+サブスクリプトのサイズ取得方法を追記しました。

使用例は、以下のサンプルコードをご参照ください。
※カラムやパラメータの指定はクラスリファレンスをご確認ください。

%SQL.Statementクラス(推奨方法)を利用して実行する例は以下の通りです。

 set dir="/usr/irissys/mgr/user"  // データベースディレクトリ
 set stmt=##class(%SQL.Statement).%New()
 set status=stmt.%PrepareClassQuery("%SYS.GlobalQuery","Size")
 write status // 1が戻れば実行できます。
 set rset=stmt.%Execute(dir)
 while rset.%Next() {
  write rset.%Get("Name"),"-",rset.%Get("Used MB"),!
 }

%PrepareClassQuery()の結果で1以外が戻ってきている場合は、以下のメソッドを実行しエラーを確認してください。

do $SYSTEM.OBJ.DisplayError(status)

メモ:%SQL.StatementクラスでSizeクエリを実行できない場合は、%ResultSetクラスを使用してください。

 set dir="C:\intersystems\iris\mgr\user" // IRIS.DAT(またはCACHE.DAT)フォルダ
 set rs = ##class(%ResultSet).%New("%SYS.GlobalQuery:Size")
 do rs.Execute(dir) // 第3引数でマスク指定も可
 while (rs.Next()) { 
   set gname= rs.Get("Name") // グローバル名
   set gsize= rs.Get("Used MB") // グローバルサイズ(MB)
   write gname," : ",gsize,!
 }

グローバル変数のサイズが大きい場合、取得時間がかかる場合もあります。その場合、Size クエリー 実行時、第 6 引数に 1 を指定してクエリを再実行してみてください。

第 6 引数の指定により、簡易モードでサイズを取得します。簡易モードのため「Used MB」は取得できませんが、「Allocated MB」は取得できます。

以下、第 6 引数を指定した場合の実行例です(Used MB ではなく、Allocated MB を取得しています)。

%SQL.Statementクラス(推奨方法)を利用して実行する例は以下の通りです。

 set dir="/usr/irissys/mgr/user"  // データベースディレクトリ
 set stmt=##class(%SQL.Statement).%New()
 set status=stmt.%PrepareClassQuery("%SYS.GlobalQuery","Size")
 write status // 1が戻れば実行できます。
 set rset=stmt.%Execute(dir,,,,,1)
 while rset.%Next() {
  write rset.%Get("Name"),"-",rset.%Get("Allocated MB"),!
 }

メモ:%SQL.StatementクラスでSizeクエリを実行できない場合は、%ResultSetクラスを使用してください。

 set dir="C:\intersystems\iris\mgr\user" // IRIS.DAT(またはCACHE.DAT)フォルダ
 set rs = ##class(%ResultSet).%New("%SYS.GlobalQuery:Size")
 do rs.Execute(dir,,,,,1) // 第3引数でマスク指定も可
 while (rs.Next()) { 
   set gname= rs.Get("Name") // グローバル名
   set gsize= rs.Get("Allocated MB") // グローバルサイズ(MB)
   write gname," : ",gsize,! 
 }

指定サブスクリプトのサイズ取得方法は、%SYS.GlobalQueryクラス の NameSpaceSize クエリー方法を使用すると取得できます。

このクエリは、サブスクリプトレベルマッピングを行っている場合は、マッピング先のデータベースでどれだけのサイズを消費しているかも確認できます(サブスクリプトレベルマッピングを使用していないときは指定グローバルのサイズのみ確認できます)。

以下のようなグローバルが作成されているとします。

USER>zwrite ^test
^test(1)="Post-sale services for world-class crowd-sourced database services for industry and government."
^test(2)="Building shareholder value by delivering virtual financial virtualized content for the Fortune 5000."
^test(3)="Developers of high-touch broad-band advanced models for the Health Care community."
^test(4)="Specializing in the development and manufacturing of interactive wireless devices and connectivity for discriminating investors."
^test(5)="Resellers of interactive HTML5 voice-enabled consulting services for capital markets."
^test(6)="Building shareholder value by delivering interactive massively-parallel voice-enabled middle-ware for the Entertainment industry."
^test(7)="The industry leader in scalable seven-sigma Internet content for the Fortune 500."
^test(8)="The industry leader in high-touch crowd-sourced graphical productivity tools for the desktop."
^test(9)="Resellers of breakthrough object-oriented virtualized media for the Entertainment industry."
^test(10)="Experts in high-tech massively-parallel Internet media for industry and government."

以下のようなグローバルマッピングをしているとします。(添え字6~9のデータがTESTデータベースに格納される設定)

 set stmt=##class(%SQL.Statement).%New()
 set st=stmt.%PrepareClassQuery("%SYS.GlobalQuery","NameSpaceSize")
 set rset=stmt.%Execute("test")
 while rset.%Next() {
  write rset.%Get("SubscriptRange"),"-"
  write rset.%Get("Database"),"-"
  write rset.%Get("Allocated"),"-"
  write rset.%Get("Estimated"),!
 }

この結果は以下の通りです。

(ターミナルで最後のWHILE文を1行で記述した例で記載しています)

USER>while rset.%Next() { write rset.%Get("SubscriptRange"),"-",rset.%Get("Database"),"-",rset.%Get("Allocated"),"-",rset.%Get("Estimated"),!}
test-/usr/irissys/mgr/user/-.02-
test(6):(10)-/usr/irissys/mgr/test/-.02-