一个下标维度到另一个数据库的全局映射

时间:2013-06-03 16:36:32

标签: performance hierarchical-data intersystems-cache

我在Caché2007上有一个供应商定义的数据库(总共大约140GB)。它使用旧式MUMPS编程环境并直接以分层样式访问全局变量。有一个全局占数据库总大小的75%左右。该表中的第一个下标是一个人工整数帐号。接下来的2-3个下标是常量子记录标识符,它们分解字段块并表示重复的子记录类型。

其中一个重复子记录(记录类型30)用于帐户备注。由于系统的使用方式,这个维度占全球总空间的很大一部分;我估计它至少是50%。由于Caché将数据物理存储在数据库中的方式,对此全局的扫描最终将所有或大部分这些注释加载为副作用,即使它们与大多数操作无关。它会大大增加全局IO操作的成本,特别是当你只需要一堆帐户中的一个小细节时。

此全局的示例下标引用:

^ACCT(3461,10,1)="SOME^DATA"
^ACCT(3461,10,2)="MORE^DATA"
...
^ACCT(3461,30,1)="NOTE1 blah blah"
^ACCT(3461,30,2)="NOTE2 blah blah"
...
^ACCT(3461,30,100)="NOTE100 blah blah"

我无法改变数据库的设计。它由外部供应商控制,数据库中有大量MUMPS样式的硬编码引用。我认为批量操作在系统上如此缓慢的一个重要原因是,每当访问帐户数据时,这些大多数不相关的注释都会出现在IO过程中。扫描整个全局(即没有有用的应用程序维护索引)至少需要8个小时。

我有一个想法是使用Guide to Using Caché GlobalsGuide to System Administration中描述的全局映射工具将注释数据从全局的其他详细信息中存储到单独的数据库文件中。如果我可以将所有下标30s映射到同一Caché数据库中的单独数据库文件,那么大多数数据操作(那些甚至不关心注释的数据操作)都不会将这些操作带入内存以及他们关心的细节约。

在全局结构指南(第1个链接)中,这看起来似乎是合理的,因为它们分别显示了与第1个下标分开的特定第2个下标映射。他们没有在任何示例中显示的是语法是如何实现的。在Caché管理门户中的“添加新的全局映射”屏幕中,我应该可以执行类似

的操作
Global name: ACCT
Subscripts to be mapped: (BEGIN:END)(30)

但无论我在语法中尝试什么变体,我总是得到ERROR #657: Invalid subscript in reference 1 subscript #1.

StackExchange注意:这个问题可能更适合dba.stackexchange.com但是那里的Intersystems问题显然是零,我认为它不会得到任何关注。

1 个答案:

答案 0 :(得分:0)

不幸的是,虽然可以映射特定节点的第二级下标,但是不可能映射所有节点的第二级下标。

WRC有一个经验丰富的表演团队,你试过联系他们吗?