Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance $ORDER vs计数扫描全局范围_Performance_Intersystems Cache - Fatal编程技术网

Performance $ORDER vs计数扫描全局范围

Performance $ORDER vs计数扫描全局范围,performance,intersystems-cache,Performance,Intersystems Cache,我可以选择两种方法来扫描一个大型全局数组中的关键级别,并试图找出一种方法是否比另一种更有效 这是一个供应商在Intersystems Caché数据库平台上提供的应用程序和数据库。它是以旧的MUMPS风格编写的,没有使用Caché的任何对象持久性函数:所有数据都直接存储在globals中,任何索引都由应用程序维护 对于附加到实体的重复数据元素,有一种常见的约定,其中第一条记录将包含子记录的计数,然后在下一个键级别对每个子记录进行顺序编号。例如: ^GBDATA(12345,100)="3" ^G

我可以选择两种方法来扫描一个大型全局数组中的关键级别,并试图找出一种方法是否比另一种更有效

这是一个供应商在Intersystems Caché数据库平台上提供的应用程序和数据库。它是以旧的MUMPS风格编写的,没有使用Caché的任何对象持久性函数:所有数据都直接存储在globals中,任何索引都由应用程序维护

对于附加到实体的重复数据元素,有一种常见的约定,其中第一条记录将包含子记录的计数,然后在下一个键级别对每个子记录进行顺序编号。例如:

^GBDATA(12345,100)="3"
^GBDATA(12345,100,1)="A^Record"
^GBDATA(12345,100,2)="B^Record"
^GBDATA(12345,100,3)="C^Record"
其中“12345”是实体键,“100”是附加的详细信息类型之一。请注意,没有其他键的第一个“100”记录具有子记录的计数。附加的子记录可能在0到数百之间。实体通常非常广泛,除此子记录类型外,还有许多其他数据(示例中未显示)

给定一个实体键,我想扫描一种类型的所有子记录。使用$ORDER遍历子键或使用FOR循环预测键值会更快吗?这有关系吗

$ORDER方法:

SET EKEY=12345
SET SEQ=""

FOR
{
 SET SEQ=$ORDER(^GBDATA(EKEY,100,SEQ), 1, ROWDATA)
 QUIT:SEQ=""

 WRITE ROWDATA,!
}
计数方法:

SET EKEY=12345
SET LIM=^GBDATA(EKEY,100)

FOR SEQ=1:1:LIM
{
 WRITE ^GBDATA(EKEY,100,SEQ),!
}
有人知道$ORDER和$GET是如何在Caché内部实现的吗


我很难根据经验来测试这一点,因为我们只有一个具有适当数据的生产实例,而且我无法将其脱机以清除缓存。我最感兴趣的是来自磁盘的性能,而不是来自缓存的性能。

您可以使用%SYS.MONLBL来确定。我猜$ORDER稍微好一点


您可以使用%SYS.MONLBL来确定。我猜$ORDER稍微好一点


关于您的问题,“有人知道$ORDER vs$GET是如何在Caché内部实现的吗?”这两个功能完全不同。 $Order用于查看^Global时的方向。 $Get用于提取^Global中的数据。下面是它的使用示例。我使用Cache对象脚本;然而,这应该给你一个大致的想法

全球结构

^People(LastName,FirstName)="Phone"
SET LASTNAME=0
FOR QUIT:LASTNAME?." "  DO
.SET LASTNAME=$ORDER(^People(LASTNAME)) QUIT:LASTNAME?." "
.SET FIRSTNAME=0
.FOR QUIT:FIRSTNAME?." "  DO
..SET FIRSTNAME=$ORDER(^People(LASTNAME,FIRSTNAME)) QUIT:FIRSTNAME?." "
..SET PHONE=$GET(^People(LASTNAME,FIRSTNAME))
全球数据

^People(Doe,John)="1035001234"
^People(Smith,Jane)="7405241305"
^People(Wood,Edgar)="7555127598"
代码示例

^People(LastName,FirstName)="Phone"
SET LASTNAME=0
FOR QUIT:LASTNAME?." "  DO
.SET LASTNAME=$ORDER(^People(LASTNAME)) QUIT:LASTNAME?." "
.SET FIRSTNAME=0
.FOR QUIT:FIRSTNAME?." "  DO
..SET FIRSTNAME=$ORDER(^People(LASTNAME,FIRSTNAME)) QUIT:FIRSTNAME?." "
..SET PHONE=$GET(^People(LASTNAME,FIRSTNAME))
在上面提供的示例中,它将从^People global中的第一条记录开始,然后使用$Order从姓氏中的第一条记录开始。然后它将$获取^People(LASTNAME,FIRSTNAME)节点的数据,即电话号码

对于一些示例和参考区域,请查看以下链接:


关于您的问题,“有人知道$ORDER vs$GET是如何在Caché内部实现的吗?”这两个功能完全不同。 $Order用于查看^Global时的方向。 $Get用于提取^Global中的数据。下面是它的使用示例。我使用Cache对象脚本;然而,这应该给你一个大致的想法

全球结构

^People(LastName,FirstName)="Phone"
SET LASTNAME=0
FOR QUIT:LASTNAME?." "  DO
.SET LASTNAME=$ORDER(^People(LASTNAME)) QUIT:LASTNAME?." "
.SET FIRSTNAME=0
.FOR QUIT:FIRSTNAME?." "  DO
..SET FIRSTNAME=$ORDER(^People(LASTNAME,FIRSTNAME)) QUIT:FIRSTNAME?." "
..SET PHONE=$GET(^People(LASTNAME,FIRSTNAME))
全球数据

^People(Doe,John)="1035001234"
^People(Smith,Jane)="7405241305"
^People(Wood,Edgar)="7555127598"
代码示例

^People(LastName,FirstName)="Phone"
SET LASTNAME=0
FOR QUIT:LASTNAME?." "  DO
.SET LASTNAME=$ORDER(^People(LASTNAME)) QUIT:LASTNAME?." "
.SET FIRSTNAME=0
.FOR QUIT:FIRSTNAME?." "  DO
..SET FIRSTNAME=$ORDER(^People(LASTNAME,FIRSTNAME)) QUIT:FIRSTNAME?." "
..SET PHONE=$GET(^People(LASTNAME,FIRSTNAME))
在上面提供的示例中,它将从^People global中的第一条记录开始,然后使用$Order从姓氏中的第一条记录开始。然后它将$获取^People(LASTNAME,FIRSTNAME)节点的数据,即电话号码

对于一些示例和参考区域,请查看以下链接:


如果没有遵循约定,并且索引中存在间隙,或者限制值低于列表中的项数,应用程序应该怎么做?这比速度更重要吗?此外,您可以很容易地使用生产系统中的假数据设置测试。@psr-该应用程序在过去对这种约定非常一致,但我可能会使用$GET和默认值来对冲丢失的值。我一直在使用$ORDER,因为它总是有效的,而且似乎是一个更直接的解决方案。我可能可以通过设置一个test Caché实例来测试它,但是询问这样做更容易,我想看看是否有人知道实现细节。如果没有遵循约定,索引中存在缺口,或者限制值低于列表中的项数,那么应用程序应该怎么做?这比速度更重要吗?此外,您可以很容易地使用生产系统中的假数据设置测试。@psr-该应用程序在过去对这种约定非常一致,但我可能会使用$GET和默认值来对冲丢失的值。我一直在使用$ORDER,因为它总是有效的,而且似乎是一个更直接的解决方案。我可能可以通过设置一个test Caché实例来测试它,但是询问这样做更容易,我想看看是否有人知道实现细节$订单是一个更强大的解决方案和更好的实践。这是否比之前和之后的$ZTIMESTAMP更有帮助?如果是这样的话,最好在你的回答中明确指出这一点。我想更精确的计时会有一点用处。%SYS.MONLIBL报告的时间是否会受到访问的数据是否在数据缓存中的影响?此外,psr是正确的$订单是一个更强大的解决方案和更好的实践。这是否比之前和之后的$ZTIMESTAMP更有帮助?如果是这样的话,最好在你的回答中明确指出这一点。我想更精确的计时有点用处。%SYS.MONLIBL报告的时间是否会受到访问的数据是否在数据缓存中的影响?这很好,但如果您阅读了我的问题中的代码示例,我知道函数的作用以及如何使用它们。问题是关于比较效率,