第五十一章 Caché 函数大全 $PREFETCHON 函

125 阅读2分钟

第五十一章 Caché 函数大全 $PREFETCHON 函数

为指定的全局设置预取。

大纲

$PREFETCHON(gref,gref2)

参数

  • gref 可选-全局变量引用。
  • gref2 可选-用于建立范围的全局变量引用。

描述

$PREFETCHON通过为全局或一系列全局打开预取来提高性能。$PREFETCHON返回1,表示成功完成(预取已启用)。$PREFETCHON返回0,表示无法建立所需的预取。如果指定的范围包含两个不同的全局名称,或者如果存在阻止预取的其他问题,则可能会返回0。返回的0不是错误;它不会中断程序执行,并且指定范围内的全局引用的处理不会受到影响。这仅仅意味着这些全局操作没有预取的性能提升。

注意:远程数据库不支持预取全局。

$PREFETCHOFF关闭预取。

$PREFETCHON有两种形式:

  • $PREFETCHON(gref)预取gref节点及其所有后代。例如,$PREFETCHON(^abc(4))预取^abc(4)的所有后代,例如^abc(4,1)^abc(4,2,2)等。它不会预取^abc(5)
  • $PREFETCHON(gref,gref2)预取gref到gref2范围内的节点。这不包括gref2的后代。 gref和gref2必须是相同全局节点。例如,$PREFETCHON(^abc(4),^abc(7,5))预取^abc(4)^ abc(7,5)范围内的所有全局节点,包括^ abc(4,2,2),^abc(5)和^abc(7,1,2)。但是,它不会预取^abc(7,5,1)

预取不限于读取访问权限;当执行大量SET操作时,它也能很好地工作。

预取和性能

调用$PREFETCHON时,将根据需要启动一个或多个预取后台进程(守护程序)。所有进程都在系统范围内共享这些预取守护程序。因为每个预取守护程序一次仅处理一个预取请求,所以在系统上运行多个预取守护程序通常是有利的。但是,大量并发的预取守护程序可能会对交互式系统访问产生性能影响。

在运行从同一全局树读取包含节点的大量磁盘块的应用程序时,预取可以提高性能。在以下情况下,预取是最有效的:

  • 数据通常以升序访问,这意味着全局树的数据块通常以从左到右的顺序访问。但是,没有严格遵守升序的要求。当通常按从左到右的顺序访问全局树的数据块时,或者在该范围中的至少一个数据块有可能在其大多数相邻节点之前访问之前,预取效果最佳。逻辑树。
  • 访问指定范围内的大多数数据块。但是,在用户决定仅访问一小部分数据后决定取消该操作的情况下,初始预取不会获得与后续取回一样多的块。
  • 在任何给定时间,少于100个预取处于活动状态。

参数

  • gref 全局引用,可以是全局引用,也可以是过程专用的全局引用。建立预取时无需定义全局。
  • gref2 用于与gref建立范围的全局参考。因此,gref2必须是与gref在同一全局树中较低的全局节点。

示例

以下示例为全局^a建立预取。

/// d ##class(PHA.TEST.Function).PREFETCHON()
ClassMethod PREFETCHON()
{
	SET ^a="myglobal"
	SET x=^a
	SET ret=$PREFETCHON(^a)
	IF ret=1 { WRITE !,"prefetch established" }
	ELSE { WRITE !,"prefetch not established" }
	SET ret=$PREFETCHOFF()
}

DHC-APP>d ##class(PHA.TEST.Function).PREFETCHON()
 
prefetch established

以下示例为全局^||a(1)^a||(50)。的范围建立了预取。

/// d ##class(PHA.TEST.Function).PREFETCHON1()
ClassMethod PREFETCHON1()
{
	SET ret=$PREFETCHON(^||a(1),^||a(50))
	IF ret=1 { WRITE !,"prefetch established" }
	ELSE { WRITE !,"prefetch not established" }
}
DHC-APP>d ##class(PHA.TEST.Function).PREFETCHON1()
 
prefetch established