第二章 全局变量结构(二)
全局变量物理结构
全局变量使用高度优化的结构存储在物理文件中。管理此数据结构的代码也针对运行InterSystems IRIS的每个平台进行了高度优化。这些优化确保全局操作具有高吞吐量(每单位时间的操作数)、高并发性(并发用户总数)、缓存的高效使用,并且不需要与性能相关的持续维护(例如频繁的重建、重新索引或压缩)。
用于存储全局变量的物理结构是完全封装的;应用程序不会以任何方式担心物理数据结构。
全局变量存储在磁盘上的一系列数据块中;每个块的大小(通常为8KB
)是在创建物理数据库时确定的。为了提供对数据的高效访问,InterSystems IRIS维护了一种复杂的B树状结构,该结构使用一组指针块将相关数据块链接在一起。InterSystems IRIS维护一个缓冲池-经常引用的块的内存缓存-以降低从磁盘获取块的成本。
虽然许多数据库技术使用类似B树
的结构来存储数据,但InterSystems IRIS在许多方面都是独一无二的:
- 存储机构通过安全、易于使用的接口显露出来。
- 压缩下标和数据以节省磁盘空间和宝贵的内存缓存空间。
- 存储引擎针对事务处理操作进行了优化:插入、更新和删除都很快。与关系系统不同,InterSystems IRIS从不需要重建索引或数据来恢复性能。
- 存储引擎针对最大并发访问进行了优化。
- 数据会自动群集,以实现高效检索。
引用全局变量
全局变量驻留在特定的InterSystems IRIS数据库中。如果使用适当的映射,全局变量的部分可以驻留在不同的数据库中。数据库可以在物理上位于当前系统上,也可以位于通过ECP网络访问的远程系统上。术语数据集是指包含InterSystems IRIS数据库的系统和目录。
命名空间是共同构成一组相关信息的数据集和全局映射的逻辑定义。
简单的全局变量引用适用于当前选定的命名空间。名称空间定义可能导致它物理访问本地系统或远程系统上的数据库。不同的全局变量可以映射到不同的位置或数据集(其中数据集是指包含InterSystems IRIS数据库的系统和目录)。
例如,要在当前已映射到的命名空间中创建对全局顺序的简单引用,请使用以下语法:
^ORDER
复制代码
设置全局变量映射
可以将全局变量和例程从一个数据库映射到相同或不同系统上的另一个数据库。这允许简单地引用可以存在于任何地方的数据,这是命名空间的主要特征。可以映射整个全局或部分全局;映射全局(或下标)的一部分称为下标级别映射(SLM
)。因为可以映射全局下标,所以数据可以轻松地跨磁盘。
全局映射是分层应用的。例如,如果NSX命名空间有一个关联的DBX
数据库,但将^x
全局变量映射到DBY
数据库,将^x(1)
映射到DBZ
数据库,则^x
全局变量的任何下标形式(属于^x(1)
层次结构的那些除外)都映射到DBY
;属于^x(1)
层次结构的那些全局变量映射到DBZ。下图说明了此层次结构:
在此图中,全局变量及其层次结构显示为灰色,它们映射到的数据库显示为黑色。
还可以将映射的、下标的全局的一部分映射到另一个数据库,甚至映射回初始全局映射到的数据库。假设前面的示例有^x(1,2)
全局变量返回到DBY
数据库的附加映射。这将如下所示:
同样,全局变量及其层次结构显示为灰色,它们映射到的数据库显示为黑色。
一旦将全局从一个命名空间映射到另一个命名空间,就可以引用映射的全局变量,就像它在当前命名空间中一样-只需一个简单的引用,如^Order
或^X(1)
。
重要提示:建立下标级别映射范围时,字符串下标的行为与整数下标的行为不同。对于字符串,第一个字符确定范围,而对于整数,范围使用数值。例如,下标范围("A"):("C")
不仅包含AA
,还包含AC
和ABCDEF
;相比之下,下标范围(1):(2)
不包含11
。
使用全局和下标的不同范围
命名空间的每个映射必须引用不同范围的全局变量或下标。映射验证可防止建立任何类型的重叠。例如,如果使用管理门户创建与现有映射重叠的新映射,则门户会阻止这种情况发生,并显示一条错误消息。
记录更改
通过门户对映射的成功更改也会记录在messages.log
中;不成功的更改不会记录。通过手动编辑配置参数(CPF)文件来建立映射的任何失败尝试都会记录在messages.log
中.
扩展的全局变量引用
可以引用位于当前命名空间以外的命名空间中的全局变量。这称为扩展全局变量引用或简称为扩展引用。
有两种形式的扩展引用:
- 显式命名空间引用-将全局所在命名空间的名称指定为全局变量引用语法的一部分。
- 隐含名称空间引用-指定目录和系统名称(可选)作为全局变量引用语法的一部分。在这种情况下,不适用全局变量映射,因为物理数据集(目录和系统)是作为全局变量引用的一部分提供的。
最好使用显式名称空间,因为这允许在需求更改时在外部重新定义逻辑映射,而无需更改应用程序代码。
InterSystems IRIS支持两种形式的扩展引用:
- 方括号语法,它用方括号(
[]
)将扩展引用括起来。 - 环境语法,用竖线(
||
)括起扩展引用。
注意:扩展全局引用的示例使用Windows
目录结构。实际上,此类引用的形式取决于操作系统。
方括号语法
可以使用方括号语法来指定具有显式命名空间或隐含命名空间的扩展全局引用:
显式命名空间:
^[nspace]glob
复制代码
隐含命名空间:
^[dir,sys]glob
复制代码
在显式名称空间引用中,nspace
是全局全局当前尚未映射或复制到的已定义名称空间。在隐含的名称空间引用中,dir
是目录(其名称包括尾随反斜杠:“\”
),sys
是SYSTEM
,glob
是该目录中的全局目录。如果将nspace
或dir
指定为(“^”
),则引用的是进程私有全局变量。
除非将目录和系统名称或命名空间名称指定为变量,否则必须在目录和系统名称或命名空间名称两边加上引号。目录和系统一起构成一个隐含的命名空间。隐含的命名空间可以引用以下任一项:
- 指定系统上的指定目录。
- 本地系统上的指定目录(如果未在引用中指定系统名称)。如果在隐含的命名空间引用中省略了系统名称,则必须在目录引用内提供双脱字符(
^^
)以指示省略的系统名称。
要在远程系统上指定隐式命名空间,请执行以下操作:
["dir","sys"]
复制代码
在本地系统上指定一个隐含的命名空间:
["^^dir"]
复制代码
例如,要访问名为SALES的计算机上的C:\BUSINESS\
目录中的全局变量ORDER
:
SET x = ^["C:\BUSINESS\","SALES"]ORDER
复制代码
要访问本地计算机上的C:\BUSINESS\
目录中的全局ORDER
:
SET x = ^["^^C:\BUSINESS\"]ORDER
复制代码
要访问定义的命名空间MARKETING
中的全局ORDER
:
SET x = ^["MARKETING"]ORDER
复制代码
要访问进程私有的全局ORDER
:
SET x = ^["^"]ORDER
复制代码
注意:在创建涉及镜像数据库的隐含命名空间扩展引用时,可以使用镜像数据库路径,格式为:mirror:mirror_name:mirror_DB_name
。
例如,当在镜像CORPMIR
中引用镜像数据库名称为mirdb1的数据库时,可以形成如下的隐含引用:
["^^:mirror:CORPMIR:mirdb1"]
复制代码
镜像数据库路径既可以用于本地数据库,也可以用于远程数据库。
环境语法
环境语法被定义为:
^|"env"|global
复制代码
"env"
可以有以下五种格式之一:
- 空字符串(
""
)-本地系统上的当前命名空间。 "namespace"
-定义的命名空间,当前没有全局映射到。
命名空间名称不区分大小写。
如果namespace
具有特殊值"^"
,则它是进程私有的全局变量。
"^^dir"
-一个隐含的命名空间,它的默认目录是本地系统上的指定目录,其中dir包含一个末尾的反斜杠(" \ ")
。"^system^dir"
——一个隐含的命名空间,默认目录是指定的远程系统上的指定目录,其中dir
包含一个结尾的反斜杠(" \ "
)。- 省略-如果根本没有
"env"
,它是进程私有的全局变量。
要访问当前系统上当前命名空间中的全局ORDER
,如果没有为ORDER
定义映射,请使用以下语法:
SET x = ^|""|ORDER
复制代码
这与简单的全局变量引用相同:
SET x = ^ORDER
复制代码
要访问映射到定义的命名空间MARKETING
的全局ORDER
:
SET x = ^|"MARKETING"|ORDER
复制代码
可以使用一个隐含的命名空间来访问本地系统上C:\BUSINESS\
目录下的全局ORDER
:
SET x = ^|"^^C:\BUSINESS\"|ORDER
复制代码
可以使用一个隐含的命名空间来访问一个名为SALES
的远程系统上的目录C:\BUSINESS
中的全局ORDER
:
SET x = ^|"^SALES^C:\BUSINESS\"|ORDER
复制代码
要访问进程私有的全局ORDER
:
SET x = ^||ORDER
SET x=^|"^"|ORDER
复制代码