写在前面
为了与大家保持一个愉快的沟通,以及便于描述方便,本文做了一些术语简写,如下:
global
:全局变量,无特殊说明,指的就是 std-global
std-globals
: 标准globalpro-globals
: 进程globalref-global
: 引用global(映射global)global
是存储在物理 InterSystems IRIS®
数据库中的多维数组。在应用程序中,globals
到物理数据库的映射是基于当前的命名空间 — (命名空间提供一个或多个物理数据库的逻辑、统一视图)
1. Global 命名约定和限制
globals
的命名要指明其目的和用途。
有两种类型的global
和一组单独的变量,称为“进程global
”:
global
— 这可以称为std-global
; 通常,这些被简单地称为global
。它是驻留在当前命名空间中的持久化
的多维数组。global
引用(extended global reference) — 这是位于当前命名空间以外的命名空间中的全局引用,本文简称为ref-global
。global
(process-private global ) — 这是一个数组变量,只有创建它的进程才能访问,同样简写为pro-global
。global
命名以上箭头字符 (^) 前缀开头。此插入记号将全局变量与局部变量区分开来。global
名称上箭头字符 (^) 前缀后的第一个字符可以是:
标准全局变量
。对于global
名称,字母被定义为 ASCII 65
到 ASCII 255
范围内的字母字符。如果global
的名称以“%
”开头(但不是“%Z
”或“%z
”),则此全局变量供InterSystems IRIS
系统使用。% global
通常存储在 IRISSYS
或 IRISLIB
数据库中。|
) 或左括号 ([
) — 用于扩展的全局引用或进程专用全局变量。用法取决于后续字符。global
名称的其他字符可以是字母、数字或句点 (.
) 字符。不能使用百分比 (%)
字符,除非作为全局名称的第一个字符。句点 (.) 字符不能用作全局名称的最后一个字符
。global
名称最多可包含 31
个字符(不包括插入符号前缀)。您可以指定明显较长的全局名称,但 InterSystems IRIS
仅将前 31
个字符视为重要字符。global
名称区分大小写。InterSystems IRIS
对ref-global
的总长度施加了限制,而此限制反过来又对任何下标值的长度施加了限制。在IRISSYS
数据库中,InterSystems
保留了除“z
”,“Z
”,“%z
”和“%Z
”开头的所有全局名称。在所有其他数据库中,InterSystems
保留所有以“ISC.
”和“%ISC.
”开头的全局名称。
2. Gloal 命名示例
以下是各种global
名称的示例以及每个全局名称的使用方式:
^globalname
— 一个标准的全局变量
^|"environment"|globalname
— ref-global
^||globalname
— pro-global
^|"^"|globalname
— pro-global
^[namespace]globalname
— ref-global
中显式命名空间的括号语法
^[directory,system]globalname
— ref-global
中隐含命名空间的括号语法
^["^"]globalname
— pro-global
^["^",""]globalname
— pro-global
注意:
全局名称不能包含 Unicode 字符
。以下是所有有效的global
名称:
SET ^a="The quick "
SET ^A="brown fox "
SET ^A7="jumped over "
SET ^A.7="the lazy "
SET ^A1B2C3="dog's back."
WRITE ^a,^A,^A7,!,^A.7,^A1B2C3
KILL ^a,^A,^A7,^A.7,^A1B2C3 // keeps the database clean
3. global 节点和下标简介
global
通常具有多个节点,通常由一个下标或一组下标标识。举一个基本的例子:
set ^Demo(1)="Cleopatra"
此语句引用全局节点 ^Demo(1)
,它是 ^ Demo
全局中的一个节点。此节点由一个下标标识。
再举一个例子:
set ^Demo("subscript1","subscript2","subscript3")=12
此语句引用全局节点 ^Demo(“subscript1”,“subscript2”,“subscript3”)
,它是同一全局中的另一个节点。此节点由三个下标标识。
再举一个例子:
set ^Demo="hello world"
此语句引用全局节点 ^Demo,它不使用任何下标
。
全局的节点形成分层结构。ObjectScript 提供了利用此结构的命令。例如,您可以移除节点或删除节点及其所有子节点。
下标具有以下规则:
下标值区分大小写。
下标值可以是任何 ObjectScript 表达式,前提是表达式的计算结果不为空字符串 (“”)。
该值可以包含所有类型的字符,包括空格、非打印字符和 Unicode 字符。(请注意,非打印字符在下标值中不太实用。)
在解析全局引用之前,InterSystems IRIS
计算每个下标的方式与计算任何其他表达式的方式相同。在下面的示例中,我们设置了 ^Demo 全局的一个节点,然后以几种等效的方式引用该节点:
SAMPLES>s ^Demo(1+2+3)="a value"
SAMPLES>w ^Demo(3+3)
a value
SAMPLES>w ^Demo(03+03)
a value
SAMPLES>w ^Demo(03.0+03.0)
a value
SAMPLES>set x=6
SAMPLES>w ^Demo(x)
a value
在应用程序中,节点通常包含以下类型的结构:
字符串或数字数据,包括本机 Unicode 字符。
具有多个字段(由特殊字符分隔)的字符串, 您可以使用 ObjectScript $PIECE
函数将此类数据取出。
SET ^Data(10) = "Smith^John^Boston"
系统间IRIS中包含的多个字段$LIST
结构。$LIST结构是包含多个长度编码值的字符串。它不需要特殊的分隔符字符。
空字符串 (“”)。如果下标本身用作数据,则不会在实际节点中存储任何数据
。
比特字符串bitstring。在使用全局变量来存储部分位图索引的情况下,存储在节点中的值是位字符串。位字符串是一个字符串,其中包含一组逻辑压缩的 1 和 0 值。您可以使用$BIT
函数构造位字符串。
较大数据集的一部分。例如,对象和 SQL 引擎将流 (BLOB) 存储为全局内 32K 节点的顺序序列。通过流接口,流用户不知道流是以这种方式存储的。
请注意: 任何全局节点都不能包含长度超过字符串长度限制的字符串
。
4. global 排序规则
在global 中,节点按排序顺序存储。
应用程序通常通过对用作下标的值进行转换来控制节点的排序顺序。例如,SQL 引擎在对字符串值创建索引时,会将所有字符串值转换为大写字母,并在前面附加一个空格字符
,以确保索引不区分大小写,并且作为文本进行排序规则
(即使数值存储为字符串)。
5. global 引用的最大长度
全局引用(即对特定全局节点或子树的引用)的总长度限制为 511 个编码字符(可能少于 511 个键入字符)。
要保守地确定给定全局引用的大小,请使用以下准则:
对于全局名称:为每个字符添加 1。
对于纯数字下标:为每个数字、符号或小数点添加 1。
对于包含非数字字符的下标:为每个字符添加 3 个。
对于每个下标,添加 1。
如果这些数字的总和大于 511,则引用可能太长。
由于确定限制的方式,如果必须具有长下标或全局名称,则避免大量下标级别会很有帮助。相反,如果使用多个下标级别,请避免使用长全局名称和长下标
。由于您可能无法控制正在使用的字符集,因此缩短全局名称和下标会很有用。
当对特定引用有疑问时,创建与最长的预期全局引用(甚至更长)长度相等的全局引用的测试版本是很有用的。来自这些测试的数据为在生成应用程序之前对命名约定的可能修订提供了指导。
6. global 的物理结构
global
使用高度优化的结构存储在物理文件中。管理此数据结构的代码也针对InterSystems IRIS
运行的每个平台进行了高度优化。这些优化可确保全局变量上的操作具有高吞吐量(每单位时间的操作数)、高并发性(并发用户总数)、缓存内存的有效使用,并且不需要与性能相关的持续维护(如频繁重建、重新编制索引或压缩)。
用于存储global
的物理结构是完全封装的;应用程序不以任何方式担心物理数据结构。
global
存储在磁盘上的一系列数据块中;每个块的大小(通常为 8KB)是在创建物理数据库时确定的。为了提供对数据的有效访问,InterSystems IRIS
维护着一个复杂的B树状结构
,使用一组指针块将相关数据块链接在一起。InterSystems IRIS维护一个缓冲池
— 一个包含频繁引用的块的内存中缓存 — 以降低从磁盘获取块的成本。
虽然许多数据库技术使用类似B树的结构进行数据存储,但InterSystems IRIS在许多方面都是独一无二的:
7. 引用全局变量
global
位于特定的 InterSystems IRIS
数据库中。如果使用适当的映射,则全局的某些部分可以驻留在不同的数据库中。数据库可以物理地位于当前系统上,也可以位于通过 ECP 网络访问的远程系统上。术语数据集是指包含系统间 IRIS 数据库的系统和目录。
命名空间
是数据集和全局映射的逻辑定义,它们共同构成了一组相关信息。
简单的全局引用适用于当前选定的命名空间。命名空间定义可能导致它以物理方式访问本地系统或远程系统上的数据库。可以将不同的全局变量映射到不同的位置或数据集(其中数据集
是指包含InterSystems IRIS
数据库的系统和目录)。
例如,若要在global ORDER
当前映射到的命名空间中创建对global ORDER
的简单引用,请使用以下语法:
^ORDER
8. 设置全局映射
您可以在相同或不同的系统上将global
和routines
从一个数据库映射到另一个数据库。这允许对可以存在于任何地方并且是命名空间主要功能的数据进行简单引用。您可以映射整个全局变量或全局变量的片段;映射全局(或下标)的一部分称为下标级映射 (SLM
)。由于您可以映射全局下标,因此数据可以轻松跨越磁盘。
全局映射按层次结构应用。例如,如果 NSX 命名空间具有关联的 DBX
数据库,但将 ^x global
映射到 DBY
数据库,并将 ^x(1)
映射到 DBZ
数据库,则 ^x global
的任何下标形式(^x(1) 层次结构的一部分除外)都将映射到 DBY;那些属于 ^x(1)
层次结构的全局变量将映射到 DBZ。下图说明了此层次结构:
在此图中,global
及其层次结构显示为灰色,而它们映射到的数据库显示为黑色。
还可以将映射的、下标的global
的一部分映射到另一个数据库,甚至映射回初始全局映射到的数据库。假设前面的示例具有 ^x(1,2)
全局返回到 DBY
数据库的附加映射。这将如下所示:
同样,全局变量及其层次结构显示为灰色,它们映射到的数据库显示为黑色。
将全局从一个命名空间映射到另一个命名空间后,可以引用映射的全局,就好像它位于当前命名空间中一样
— 使用简单的引用,例如 ^ORDER 或 ^X(1)。
重要:
建立下标级映射范围时,字符串下标的行为与整数下标的行为不同。对于字符串,第一个字符确定范围,而整数的范围使用数值。例如,(“A”):(“C”)
的下标范围不仅包含AA,还包含AC和ABCDEF;相比之下,下标范围 (1):(2) 不包含 11。
9. 使用不同范围的全局变量和下标
命名空间的每个映射都必须引用不同范围的全局变量或下标。映射验证可防止建立任何类型的重叠。例如,如果尝试使用管理门户创建与现有映射重叠的新映射,门户将阻止发生这种情况并显示一条错误消息。
10. 记录更改
通过门户对映射的成功更改也会记录在messages.log
;不记录不成功的更改。通过手动编辑配置参数(CPF
)文件建立映射的任何失败尝试都会记录在messages.log
;
11. ref-global
您可以引用位于当前命名空间以外的命名空间中的全局变量。这称为扩展global
引用或简称为扩展引用global
。
有两种形式的扩展引用:
首选使用显式命名空间,因为这允许在需求发生变化时在外部重新定义逻辑映射,而无需更改应用程序代码。
InterSystems IRIS 支持两种形式的扩展引用:
方括号语法,用方括号 ([ ]) 将扩展引用括起来。
环境语法,用竖线将扩展引用括起来(| |)。
可以使用括号语法指定具有显式命名空间或隐式命名空间的扩展全局引用:
显式命名空间:
^[nspace]glob
隐式的命名空间:
^[dir,sys]glob
在显式命名空间引用中,nspace
是全局 glob
当前尚未映射或复制到的已定义命名空间。在隐式的命名空间引用中,dir 是一个目录(其名称包括一个尾部反斜杠:“\”),sys 是一个系统,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"
— 全局当前未映射到的已定义命名空间。 命名空间名称不区分大小写。 如果命名空间具有特殊值“^”,则它是一个进程私有的全局变量。
"^^dir"
— 一个隐含的命名空间,其默认目录是本地系统上的指定目录,其中 dir 包含尾部反斜杠 (“\”)。
"^system^dir"
— 一个隐含的命名空间,其默认目录是指定远程系统上的指定目录,其中 dir 包含尾部反斜杠 (“\”)。
省略——如果根本没有“env”,它是一个进程global。
要访问当前系统上当前命名空间中的全局 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
要访问进程global ORDER
:
SET x = ^||ORDER
SET x=^|"^"|ORDER