对于经常进行插入、删除操作的表,位图索引的存储往往会变得不那么高效。
例如,下面定义的表,经常进行大数量的删除操作 (TRUNCATE TABLE)
Class MyWork.MonthData Extends (%Persistent, %Populate)
{
/// Level of satisfaction
Property Satisfaction As %String(VALUELIST = ",満足,やや満足,やや不満,不満,");
/// Age
Property Age As %Integer(MAXVAL = 70, MINVAL = 20);
Index AgeIdx On Age [ Type = bitmap ];
}
ObjectScriptObjectScript
对该表进行插入操作后,索引表存储的内容为:
【INSERT】
^MyWork.MonthDataI("AgeIdx",20,1) = $zwc(401,120,4,75,102,10,<omit> 958)/*$bit(5,76,103,107・・・
^MyWork.MonthDataI("AgeIdx",21,1) = $zwc(407,121,29,178,251,2<omit>,732,772,898,960)/*$bit(3・・・
^MyWork.MonthDataI("AgeIdx",22,1) = $zwc(402,96,5,57,74,164,<omit>,0,4)/*$bit(20,63,77,92,10・・・
^MyWork.MonthDataI("AgeIdx",23,1) = $zwc(133,116)_$c(0,0,8,0<omit>,64,0,4)/*$bit(20,63,77,92・・・
^MyWork.MonthDataI("AgeIdx",25,1) = $zwc(404,119,105,155,235<omit>,947)/*$bit(106,156,236,30・・・
^MyWork.MonthDataI("AgeIdx",26,1) = $zwc(128,119)_$c(0,0,0,2,<omit>,0,128)/*$bit(26,80,115,1・・・
<omit the following>
ObjectScriptObjectScript
如果你使用 TURNCATE 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,・・・
<omit the following>
ObjectScriptObjectScript
长此以往,频繁的对该表进行插入、删除操作,位图索引所遗留的内容将会对性能造成影响。
我们可以使用%SYS.Maint.Bitmap 类下的 OneClass()或者Namespace()函数对其进行紧凑/维护。
示例代码如下:
// 第一个参数: 类名
// 第二个参数:: 是否记录在journal中; 1:不记录,0:记录
// 第三个参数:: 是否输出执行结果;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
ObjectScriptObjectScript
该类下的 namespace()方法可对该命名空间下的所有位图索引进行紧凑/维护操作。
详细该类及其方法说明可以参考文档