启动排序模式以提高全局变量多个集合的性能。
$SORTBEGIN会启动一种特殊的排序模式,在该模式下,对指定目标全局的SET操作将被重定向到进程专用的临时区域,并被分类为子集。该模式以对$SORTEND的调用结束,该调用将数据复制到目标全局引用中。当特殊排序模式生效时,目标全局参考的所有集合及其任何后代都将受到影响。
$SORTBEGIN旨在帮助执行操作,例如建立索引,在该操作中需要将大量无序数据写入全局。当写入的数据量接近或超过可用缓冲池内存量时,性能可能会受到极大影响。 $SORTBEGIN通过保证将数据按顺序写入目标全局来解决此问题,从而最大程度地减少了所需的物理磁盘访问次数。它通过将数据写入并排序到一个或多个临时缓冲区(如果需要,使用^CacheTemp全局空间)来完成此操作,然后在调用$SORTEND时,将数据顺序复制到目标全局中。
$SORTBEGIN有效时,从目标全局读取的数据将不会反映任何SET操作。如果需要从插入值的同一全局中读取全局值,则不能使用$SORTBEGIN。
Caché对象和CachéSQL应用程序自动使用$SORTBEGIN进行索引和临时索引的创建。
通过调用$SORTEND并将其可选的第二个参数设置为0,可以终止$SORTBEGIN排序模式,而无需将数据写入目标全局变量。
如果成功,$SORTBEGIN返回一个非零的整数值。如果不成功,则$SORTBEGIN返回零。
在$SORTBEGIN和$SORTEND之间调用某些操作会导致Caché发出错误代码:
如果在$SORTBEGIN和$SORTEND之间更改了set_global命名空间的映射,则在调用$SORTEND时会发生错误。但是,如果$SORTBEGIN使用隐式名称空间指定set_global,则后续名称空间映射更改对$SORTEND无效。具有隐式名称空间的全局引用和具有显式名称空间的全局引用不应在同一排序操作中混合使用。如果建立全局$SORTBEGIN,然后为该全局的祖先或后代发出$SORTBEGIN,则Caché会发出<DUPLICATEARG>错误。例如,如果调用$SORTBEGIN(^test(1,2,3)),则以下函数调用将导致<DUPLICATEARG>错误:$SORTBEGIN(^test(1,2))或$SORTBEGIN(^test(1,2,3,4)) /// d ##class(PHA.TEST.Function).SORTBEGINTEST() ClassMethod SORTBEGINTEST() { s t1 = $p($zts,",",2) WRITE "begin:" _ $SORTBEGIN(^mytesta),! for i = 1 : 1 : 10000000{ s ^mytesta(i)=i } s t2 = $p($zts,",",2) w "end:" _ $SORTEND(^mytesta,1),! w t2-t1,! k ^mytesta s t3 = $p($zts,",",2) for i = 1 : 1 : 10000000{ s ^mytesta(i)=i } s t4 = $p($zts,",",2) w t4-t3,! k ^mytesta } DHC-APP>d ##class(PHA.TEST.Function).SORTBEGINTEST() begin:1 end:10000000 1.63 2.374