文章
· 十月 19, 2023 阅读大约需 3 分钟

如何紧凑/维护变化频繁表的位图索引

对于经常进行插入、删除操作的表,位图索引的存储往往会变得不那么高效。

例如,下面定义的表,经常进行大数量的删除操作 (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 ];
}

对该表进行插入操作后,索引表存储的内容为:

【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>

如果你使用 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>

长此以往,频繁的对该表进行插入、删除操作,位图索引所遗留的内容将会对性能造成影响。

我们可以使用%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

该类下的 namespace()方法可对该命名空间下的所有位图索引进行紧凑/维护操作。

详细该类及其方法说明可以参考文档

%SYS.Maint.Bitmap.Namespace()

%SYS.Maint.Bitmap.OneClass()

讨论 (0)1
登录或注册以继续