第六十二章 Caché 函數大全 $SORTBEGIN 函數
啓動排序模式以提高全局變量多個集合的性能。
大綱
$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