我可以在两种扫描大型全局数组中的关键级别的方法之间进行选择,并试图弄清楚一种方法是否比另一种更有效。
这是 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é 内部是如何实现的?
我无法凭经验对此进行测试,因为我们只有一个具有适当数据的生产实例,并且我无法将其脱机以清除缓存。我最感兴趣的是从磁盘性能而不是从缓存性能。