揮発性テーブルのビットマップ・インデックスの圧縮(維持管理)方法
これは InterSystems FAQ サイトの記事です
揮発性テーブル(多数のINSERT、DELETEが行われるテーブル)では、ビットマップ・インデックス用ストレージは徐々に効率が低下する可能性があります。
例えば、以下の定義からなるデータが数千件あり、一定期間保持した後 TRUNCATE TABLE で一括削除を行うオペレーションが繰り返し行われているとします。
Class MyWork.MonthData Extends (%Persistent, %Populate)
{
/// 満足度
Property Satisfaction As %String(VALUELIST = ",満足,やや満足,やや不満,不満,");
/// 年齢
Property Age As %Integer(MAXVAL = 70, MINVAL = 20);
Index AgeIdx On Age [ Type = bitmap ];
}
INSERT によってできたビットマップ・インデックスのストレージのイメージ(一部)は以下の通りです。
【INSERT時】
^MyWork.MonthDataI("AgeIdx",20,1) = $zwc(401,120,4,75,102,10,<省略> 958)/*$bit(5,76,103,107・・・
^MyWork.MonthDataI("AgeIdx",21,1) = $zwc(407,121,29,178,251,2<省略>,732,772,898,960)/*$bit(3・・・
^MyWork.MonthDataI("AgeIdx",22,1) = $zwc(402,96,5,57,74,164,<省略>,0,4)/*$bit(20,63,77,92,10・・・
^MyWork.MonthDataI("AgeIdx",23,1) = $zwc(133,116)_$c(0,0,8,0<省略>,64,0,4)/*$bit(20,63,77,92・・・
^MyWork.MonthDataI("AgeIdx",25,1) = $zwc(404,119,105,155,235<省略>,947)/*$bit(106,156,236,30・・・
^MyWork.MonthDataI("AgeIdx",26,1) = $zwc(128,119)_$c(0,0,0,2,<省略>,0,128)/*$bit(26,80,115,1・・・
<以下省略>
TRUNCATE TABLE でデータを一括削除した場合、レコードデータは消えますがビットマップ・インデックス用ストレージの一部が残ります(イメージ)。
【TRUNCATE後】
^MyWork.MonthDataI("AgeIdx",20,1) = $zwc(145,120)/*$bit()*/
^MyWork.MonthDataI("AgeIdx",21,1) = $zwc(151,121)/*$bit()*/
^MyWork.MonthDataI("AgeIdx",22,1) = $zwc(146,96)/*$bit()*/
^MyWork.MonthDataI("AgeIdx",23,1) = $zwc(133,116)_$c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,・・・
^MyWork.MonthDataI("AgeIdx",24,1) = $zwc(131,125)_$c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,・・・
^MyWork.MonthDataI("AgeIdx",25,1) = $zwc(148,119)/*$bit()*/
^MyWork.MonthDataI("AgeIdx",26,1) = $zwc(128,119)_$c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,・・・
<以下省略>
このように、繰り返し行われるデータの入れ直しによりビットマップ・インデックス用ストレージに不要な情報が残ったり、一括更新作業で効率が低下するようなストレージになった場合、%SYS.Maint.Bitmap クラスのOneClass()、Namespace() メソッドを使用してビットマップ・インデックスを圧縮(維持管理)し、最適な効率に復元することができます。
実行例は以下の通りです。
// 第1引数:クラス名
// 第2引数:ジャーナルに記録しない:1/記録する:0
// 第3引数:実行結果の画面表示あり:1/表示なし:0
>set st=##class(%SYS.Maint.Bitmap).OneClass("MyWork.MonthData",1.1)
Class: MyWork.MonthData Start Time: 2017-06-21 15:34:54
Global: ^MyWork.MonthDataI("$MonthData")was compressed: 96.15%
Old Size: 0.000(MB) New Size: 0.000(MB)
Global: ^MyWork.MonthDataI("AgeIdx")was compressed: 61.09%
Old Size: 0.004(MB) New Size: 0.002(MB)
Compression time in seconds: 0
Namespace() メソッドはネームスペース全体のビットマップ・インデックスの圧縮を行います。
詳細は下記クラスリファレンスをご参照ください。
クラスリファレンス(%SYS.Maint.Bitmap.Namespace())【IRIS】
クラスリファレンス(%SYS.Maint.Bitmap.Namespace())