永続クラス定義のデータが格納されるグローバル変数名について
これは InterSystems FAQ サイトの記事です。
永続クラス定義では、データを格納するグローバル変数名を初回クラスコンパイル時に決定しています。
グローバル変数名は、コンパイル後に表示されるストレージ定義(Storage)で確認できます。
例)
{
Property Name As %String; Property Email As %String; Storage Default
{
<Data name="PersonDefaultData">
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>Name</Value>
</Value>
<Value name="3">
<Value>Email</Value>
</Value>
</Data>
<DataLocation>^Training.PersonD</DataLocation>
<DefaultData>PersonDefaultData</DefaultData>
<ExtentSize>0</ExtentSize>
<IdLocation>^Training.PersonD</IdLocation>
<IndexLocation>^Training.PersonI</IndexLocation>
<StreamLocation>^Training.PersonS</StreamLocation>
<Type>%Storage.Persistent</Type>
}
}
DataLocation:^パッケージ名.クラス名D
永続クラスのデータが登録されるグローバル変数です。
IndexLocation:^パッケージ名.クラス名I
インデックスが格納されるグローバル変数です。
StreamLocation:^パッケージ名.クラス名S
ストリームプロパティのデータが格納される変数です。
例外として、31文字以上のクラス名を指定した場合、グローバル変数名の文字数制限を超えてしまうため、ネームスペースで一意となる適当なグローバル変数名を使用します。
{
Property Name As %String; Storage Default
{
<Data name="VeryLongLongLongLongNameDefaultData">
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>Name</Value>
</Value>
</Data>
<DataLocation>^TestPackage.VeryLongLon92A3D</DataLocation>
<DefaultData>VeryLongLongLongLongNameDefaultData</DefaultData>
<IdLocation>^TestPackage.VeryLongLon92A3D</IdLocation>
<IndexLocation>^TestPackage.VeryLongLon92A3I</IndexLocation>
<StreamLocation>^TestPackage.VeryLongLon92A3S</StreamLocation>
<Type>%Storage.Persistent</Type>
}
}
ストレージ定義未作成の場合、DEFAULTGLOBALパラメータを利用してグローバル変数名を指定することができます。
(指定したグローバル変数名の末尾にD、I、Sを付与した名称をストレージに定義します。)
{
Property Name As %String;
Parameter DEFAULTGLOBAL = "^Test.LongName";
Storage Default
{
<Data name="VeryLongLongLongLongNameDefaultData">
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>Name</Value>
</Value>
</Data>
<DataLocation>^Test.LongNameD</DataLocation>
<DefaultData>VeryLongLongLongLongNameDefaultData</DefaultData>
<IdLocation>^Test.LongNameD</IdLocation>
<IndexLocation>^Test.LongNameI</IndexLocation>
<StreamLocation>^Test.LongNameS</StreamLocation>
<Type>%Storage.Persistent</Type>
}
}
詳細は以下ドキュメントもご参照ください。
この他、2017.2以降からストレージに定義されるグローバル変数名をハッシュ化したグローバル変数名に変更できるパラメータ:USEREXTENTSETが、パフォーマンス向上のために追加されました。
ストレージ未作成時(クラス定義の初回コンパイル前)に設定することで、 ^EPgS.D8T6.1 のようなハッシュ化したグローバル変数名が設定されます。
USEEXTENTSETパラメータを使用する場合のストレージ定義について詳細は、関連トピックをご参照ください。
関連記事もご参照ください