1

我可以在两种扫描大型全局数组中的关键级别的方法之间进行选择,并试图弄清楚一种方法是否比另一种更有效。

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

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

^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,!
}

FOR 计数方法:

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

FOR SEQ=1:1:LIM
{
 WRITE ^GBDATA(EKEY,100,SEQ),!
}

有谁知道 $ORDER vs $GET 在 Caché 内部是如何实现的?

我无法凭经验对此进行测试,因为我们只有一个具有适当数据的生产实例,并且我无法将其脱机以清除缓存。我最感兴趣的是从磁盘性能而不是从缓存性能。

4

2 回答 2

1

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

http://docs.intersystems.com/cache20122/csp/docbook/DocBook.UI.Page.cls?KEY=GCM_monlbl

于 2012-11-20T20:48:17.650 回答
0

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

全球结构

^People(LastName,FirstName)="Phone"

全球数据

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

代码示例

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 全局中的第一条记录开始,然后使用 $Order 从姓氏中的第一条记录开始。然后它将 $Get ^People(LASTNAME,FIRSTNAME) 节点的数据,即电话号码。

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

$获取信息

$订单信息

于 2013-08-21T20:05:47.957 回答