$ ORDER与计算扫描全局范围

时间:2012-11-20 18:25:03

标签: performance intersystems-cache

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

这是IntersystemsCaché数据库平台上供应商提供的应用程序和数据库。它是用旧的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 count方法:

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

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

有没有人知道在Caché内部如何实现$ ORDER vs $ GET?

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

2 个答案:

答案 0 :(得分:1)

您可以使用%SYS.MONLBL明确确定。我的猜测是$ ORDER略好一些。

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

答案 1 :(得分:0)

关于你的问题,“有人知道在Caché内部如何实施$ ORDER vs $ GET?”这两者是完全不同的功能。 $ Order用于查看^ Global时的方向。 $ Get用于拉取^ Global中的数据。以下是它的使用示例。我使用Cache 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从姓氏中的第一条记录开始。然后$ $获取^ People(LASTNAME,FIRSTNAME)节点的数据,这是电话号码。

对于某些样本和参考区域,请查看以下链接:

$Get Information

$Order Information

相关问题