启动排序模式以提高全局变量多个集合的性能。
大纲$SORTBEGIN(set_global)
参数
- set_global 全局变量名称。
$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