搜索​​​​

清除过滤器
文章
Jingwei Wang · 七月 29, 2022

InterSystems SQL 的优化 - 第一部分 - 定义和构建索引

什么时候使用索引 索引提供了一种机制,通过维护常用数据的分类子集来优化查询。确定哪些字段应该被编入索引需要一些思考:太少或错误的索引,关键查询会运行得太慢;太多的索引会减慢INSERT和UPDATE的性能(因为索引值必须被设置或更新)。 索引什么 为了确定添加索引是否能提高查询性能,从管理门户的SQL界面运行查询,并在Performance中注意 global引用的数量。添加索引,然后重新运行查询,注意 global引用的数量。一个有用的索引应该减少 global引用的数量。你可以通过使用%NOINDEX关键字作为WHERE子句或ON子句条件的前言来阻止索引的使用。 你应该对JOIN中指定的字段(属性)进行索引。例如,LEFT OUTER JOIN从左表开始,然后查看右表,因此,你应该对右表的字段进行索引。在下面的例子中,你应该为T2.f2编制索引。一个INNER JOIN应该在两个ON子句字段上都有索引。 FROM Table1 AS T1 LEFT OUTER JOIN Table2 AS T2 ON T1.f1 = T2.f2 如果查询计划中的第一个项目是 "read master map",或者查询计划调用的模块的第一个项目是 "read master map",那么查询的第一个map就是master map而不是索引map。因为主图读取的是数据本身,而不是数据的索引,这几乎总是表明一个低效的查询计划。除非该表相对较小,否则你应该创建一个索引,以便当你重新运行这个查询时,查询计划的第一张map显示 "read index map"。 你应该为WHERE子句中指定的相等条件的字段建立索引。 你可能希望为WHERE子句范围条件中指定的字段,以及GROUP BY和ORDER BY子句中指定的字段建立索引。 在某些情况下,基于范围条件的索引会使查询变慢。如果绝大多数的记录都满足指定的范围条件,就会出现这种情况。例如,如果查询子句WHERE Date < CURRENT_DATE被用于一个数据库,其中大部分记录来自以前的日期,在Date上建立索引实际上会降低查询速度。这是因为查询优化器假定范围条件将返回相对较少的行,并针对这种情况进行优化。你可以通过在范围条件前加上%NOINDEX来确定是否发生了这种情况,然后再次运行查询。 如果你使用一个索引字段进行比较,那么在比较中指定的字段应该具有和它在相应索引中相同的collation类型。例如,在SELECT的WHERE子句或JOIN的ON子句中的Name字段应该具有与为Name字段定义的索引相同的排序方式。如果字段的排序和索引的排序不匹配,那么索引的有效性就会降低,或者根本就不能使用。 在map中存储的表 一个SQL表被存储为一组map。每个表都有一个主图,包含了表中的所有数据;表还可能有其他图,如索引图和位图。每个map可以被想象成一个多维global,一些字段的数据在一个或多个子标中,其余字段存储在节点值中。这些子标控制着哪些数据被访问。 对于主映射,RowID或IDKEY字段通常被用作映射子标。 对于索引map,通常使用其他字段作为前导下标,RowID/IDKEY字段作为额外的低级下标。 对于一个位图,位图层可以被认为是一个额外的RowID下标层。然而,位图只能用于正整数的RowIDs。 Master Map 系统为每个表自动定义了一个主图(Data/Master)。master map不是一个索引,它是一个使用其map下标字段直接访问数据本身的map。默认情况下,主图的下标字段是系统定义的RowID字段。默认情况下,这种使用RowID字段的直接数据访问是用SQL map名称(SQL索引名称)IDKEY表示的。 默认情况下,一个用户定义的主键不是IDKEY。这是因为使用RowID整数的Master Map查询几乎总是比通过主键值查询更有效率。然而,如果你指定主键是IDKEY,主键索引就会被定义为表的主映射,SQL Map Name是主键SQL索引的名称。 对于一个单字段的主键/IDKEY,主键索引是Master Map,但是Master Map的数据访问列仍然是RowID。这是因为记录的唯一主键字段值和它的RowID值之间存在一对一的匹配,而且RowID被认为是更有效的查询。对于多字段主键/IDKEY,主映射被赋予主键索引名称,主映射的数据访问列是主键字段。 选择一个索引类型 下面是在位图索引和标准索引之间进行选择的一般指导原则: 一般来说,可以对这些类型使用标准索引:主键、外键、唯一键、关系、简单的对象引用。 否则,位图索引通常是比较好的(假设该表使用系统分配的数字ID号)。 其他因素:每个属性上的独立位图索引通常比多个属性上的位图索引有更好的性能。这是因为SQL引擎可以使用AND和OR操作有效地组合独立的位图索引。 如果一个属性(或一组你真正需要一起索引的属性)有超过10,000-20,000个不同的值(或值组合),请考虑标准索引。然而,如果这些值的分布非常不均匀,以至于少量的值占了相当一部分行,那么位图索引可能会好得多。一般来说,我们的目标是减少索引所需的总体大小。 定义和建立索引 以下是建立索引的原则: 你可以在表中的字段值上定义一个索引,或者在类中的相应属性上定义一个索引。 你也可以在几个字段/属性的组合值上定义一个索引。无论你是用SQL字段和表的语法,还是用类的属性语法来定义,都会创建相同的索引。 当某些类型的字段(属性)被定义时,InterSystems IRIS会自动定义索引,例如主键和唯一值属性。 你可以为同一个字段(属性)定义一个以上的索引,为不同的目的提供不同类型的索引。 每当对数据库进行数据插入、更新或删除操作时,InterSystems IRIS都会填充和维护索引(默认情况下),无论是使用SQL字段和表语法,还是使用类属性语法。你可以覆盖这个默认值(通过使用%NOINDEX关键字)来快速对数据进行修改,然后作为一个单独的操作建立或重建相应的索引。你可以在用数据填充一个表之前定义索引,你也可以为一个已经填充了数据的表定义索引,然后作为一个单独的操作填充(建立)索引。 InterSystems IRIS在准备和执行SQL查询时,会使用可用的索引。默认情况下,它选择使用哪些索引来优化查询性能。你可以覆盖这个默认值,以防止在特定的查询或所有的查询中使用一个或多个索引,视情况而定。 索引属性 每个索引都有一个唯一的名字。这个名称用于数据库管理目的(报告、建立索引、删除索引等等)。像其他SQL实体一样,一个索引也有一个SQL索引名和一个相应的索引属性名;这些名称在允许的字符、大小写敏感度和最大长度上有所不同。 如果使用SQL CREATE INDEX命令定义,系统会生成一个相应的索引属性名。如果使用持久化类定义,SqlName关键字允许用户指定一个不同的SQL索引名称(SQL映射名称)。管理门户SQL界面的目录详情显示了每个索引的SQL索引名称(SQL映射名称)和相应的索引属性名称(索引名称)。 索引类型是由两个索引类关键字Type和Extent定义的。InterSystems IRIS可用的索引类型包括: 标准索引(类型=索引)- 一个持久的数组,将索引值与包含该值的行的RowID联系起来。任何没有明确定义为位图索引、位片索引或范围索引的索引都是一个标准索引。 位图索引(类型=位图)--一种特殊的索引,它使用一系列的bitstring来表示对应于给定索引值的RowID值的集合;InterSystems IRIS包括一些针对位图索引的性能优化。 位片索引(类型=位片)--一种特殊的索引,能够非常快速地评估某些表达式,如sum范围条件。某些SQL查询会自动使用位片索引。 Extent Indices(位图范围索) - 一个范围内所有对象的索引。 一个表(类)的最大索引数是400。 系统自动定义的索引 当你定义一个表时,系统会自动定义某些索引。以下索引在你定义表时自动生成,并在你添加或修改表数据时被填充。如果你定义了: 一个不是IDKEY的主键,系统会生成一个Unique类型的相应索引。主键索引的名称可以是用户指定的,也可以是从表的名称中衍生出来的。例如,如果你定义了一个未命名的主键,相应的索引将被命名为tablenamePKEY#,其中#是每个唯一键和主键约束的一个连续的整数。 一个UNIQUE字段,InterSystems IRIS为每个UNIQUE字段生成一个索引,名称为tablameUNIQUE#,其中#是每个唯一键和主键约束的连续整数。 一个UNIQUE约束,系统为每个具有指定名称的UNIQUE约束生成一个索引,为共同定义一个唯一值的字段生成索引。 一个分片Shard Key,系统为分片键字段生成一个索引,名为ShardKey。 你可以通过管理门户的SQL目录细节标签查看这些索引。CREATE INDEX命令可以用来添加一个UNIQUE字段约束;DROP INDEX命令可以用来删除一个UNIQUE字段约束。 默认情况下,系统会在RowID字段上生成IDKEY索引。定义一个IDENTITY字段并不产生索引。然而,如果你定义了一个IDENTITY字段并使该字段成为主键,InterSystems IRIS会在IDENTITY字段上定义IDKEY索引并使其成为主键索引。这在下面的例子中显示。 CREATE TABLE Sample.MyStudents ( FirstName VARCHAR(12), LastName VARCHAR(12), StudentID IDENTITY, CONSTRAINT StudentPK PRIMARY KEY (StudentID) ) 同样,如果你定义了一个IDENTITY字段,并给该字段一个UNIQUE约束,InterSystems IRIS会明确地在IDENTITY字段上定义一个IdKey/Unique索引。这在下面的例子中显示。 CREATE TABLE Sample.MyStudents ( FirstName VARCHAR(12), LastName VARCHAR(12), StudentID IDENTITY, CONSTRAINT StudentU UNIQUE (StudentID) ) 这些IDENTITY索引操作只在没有明确定义的IdKey索引和表不包含数据的情况下发生。 手动定义索引 有两种方法来定义索引。 使用类定义来定义索引,其中包括: 可以被索引的属性 多个属性的索引 索引的整理 在索引中使用Unique、PrimaryKey和IdKey关键字 定义SQL搜索索引 用索引存储数据 对NULL进行索引 索引集合 阵列集合的索引 用(ELEMENTS)和(KEYS)对数据类型属性进行索引 为嵌入式对象(%SerialObject)属性建立索引 关于在类中定义的索引的说明 使用DDL定义索引 使用类定义来定义索引 Class MyApp.Student Extends %Persistent [DdlAllowed] { Property Prop1 As %String; Property Prop2 As %String; //单一属性定义索引 Index Prop1IDX On Prop1; //多属性值定义索引 Index MIXIDX On (Prop1, Prop2) //使用单一属性和collation定义索引 Index Prop2IDX On Prop2 As Exact; //使用多属性和collation定义索引 Index MIX2IDX On (Prop1 As SQLUPPER,Prop2 As Exact); //使用Unique关键字定义索引 Index Prop1IDX On Prop1 [Unique] //使用PrimaryKey关键字定义索引 Index Prop1IDX On Prop1 [PrimaryKey] //使用IdKey关键字定义索引 Index Prop1IDX On Prop1 [IdKey] //定义查询索引 -- 供文档查询使用 Index Prop1IDX On (Prop1) As %iFind.Index.Basic //List或者Array属性定义索引 Index EmpIndex On Employees(KEYS) Index EmpIndex On Employees(ELEMENTS) Index EmpIndex On (Employees(KEYS), Employees(ELEMENTS)); //对象属性定义索引 Index StateInx On Home.State; //定义位图索引 Index ReginIDX On Region [Type = bitmap] //定义位片索引 Index AgeIDX On Age [Type = bitslice] } 在类定义中处理索引时,有几点需要注意: 索引定义只从主(第一)超类中继承。 如果你使用Studio为一个有数据存储的类添加(或删除)一个索引定义,你必须通过构建索引来手动填充索引。 使用类定义定义%BID位图索引 如果表的ID不是正整数,你可以创建一个%BID属性,用来创建位图索引定义。你可以对具有任何数据类型的ID字段的表,以及由多个字段组成的IDKEY(其中包括子表)使用这个选项。可以为任一数据存储类型创建%BID位图:默认结构表或%Storage.SQL表。这个功能被称为 "任何表的位图Bitmaps for Any Table",或BAT。 要在这样的表中启用位图索引,你必须做以下工作。 为该类定义一个%BID属性/字段。这可以是该类的一个现有属性,也可以是一个新的属性。它可以有任何名字。如果这是一个新的属性,你必须为表中的所有现有行填充这个属性/字段。这个%BID字段必须用一个数据类型来定义,限制字段数据值为唯一的正整数。例如: Property MyBID As %Counter; 定义一个新的类参数来定义哪个属性是%BID字段。这个参数被命名为BIDField。这个参数被设置为%BID属性的SQLFieldName。例如,参数BIDField = "MyBID"。 Parameter BIDField = "MyBID"; 为%BID定义一个索引。例如, Index BIDIdx On MyBID [ Type = key, Unique ] 。 定义%BID定位器索引。这将%BID索引与表的ID关键字段联系起来。下面的例子是关于一个有两个字段组成的复合IDKey的表。 Index IDIdx On (IDfield1, IDfield2) [ IdKey, Unique ] 。 Index BIDLocIdx On (IDfield1, IDfield2, MyBID) [ Data = IdKey, Unique ] 。 这个表现在支持位图索引。你可以使用标准语法根据需要定义位图索引。例如: Index RegionIDX On Region [Type = bitmap] 该表现在也支持位片索引。你可以使用标准语法定义位片索引。 注意: 要建立或重建一个%BID位图索引,你必须使用%BuildIndices()。%ConstructIndicesParallel()方法不支持%BID位图索引。 使用DDL定义索引 DDL索引命令做了以下工作。 它们更新相应的类和表的定义,在这些定义上添加或删除索引。修改后的类定义被重新编译。 它们根据需要在数据库中添加或删除索引数据。CREATE INDEX命令使用当前存储在数据库中的数据来填充索引。同样,DROP INDEX命令从数据库中删除了索引数据(也就是实际的索引)。 CREATE INDEX //标准索引 CREATE INDEX StateIdx ON TABLE Sample.Person (Home_State) ​ //位图范围索引 CREATE BITMAPEXTENT INDEX Patient ON TABLE Sample.Patient ​ //位图索引 CREATE BITMAP INDEX RegionIDX ON TABLE MyApp.SalesPerson (Region) ​ //位片索引 CREATE BITSLICE INDEX AgeIDX ON TABLE MyApp.SalesPerson (Age) ​ DROP INDEX DROP INDEX PeopleIndex ON TABLE Employee 为嵌入式对象(%SerialObject)属性创建索引 要为嵌入式对象中的一个属性建立索引,你要在引用该嵌入式对象的持久化类中创建一个索引。属性名必须指定表(%Persistent类)中的引用字段的名称和嵌入对象(%SerialObject)中的属性,如下面的例子所示。 Class Sample.Person Extends (%Persistent) [ DdlAllowed ] { Property Name As %String(MAXLEN=50); Property Home As Sample.Address; Index StateInx On Home.State; } 这里Home是Sample.Person中的一个属性,它引用嵌入式对象Sample.Address,其中包含State属性,如下例所示。 Class Sample.Address Extends (%SerialObject) { Property Street As %String; Property City As %String; Property State As %String; Property PostalCode As %String; } 只有与持久化类属性引用相关的嵌入式对象实例中的数据值被索引。你不能直接索引%SerialObject属性。%Library.SerialObject(以及所有没有明确定义SqlCategory的%SerialObject的子类)的SqlCategory是STRING。 你也可以使用SQL CREATE INDEX语句在嵌入式对象属性上定义一个索引,如下面的例子所示。 CREATE INDEX StateIdx ON TABLE Sample.Person (Home_State) 位图索引 位图索引是一种特殊类型的索引,它使用一系列的bit字符串来表示与给定的索引数据值相对应的ID值集合。 位图索引有以下重要特点: 位图是高度压缩的:位图索引可以比标准索引小得多。这大大减少了磁盘和缓存的使用。 位图操作为事务处理进行了优化:你可以在表内使用位图索引,与使用标准索引相比,没有性能损失。 位图上的逻辑操作(计数、和、以及OR)被优化为高性能。 SQL引擎包括一些特殊的优化,可以利用位图索引的优势。 位图索引的创建取决于表的唯一标识字段的性质。 如果表的ID字段被定义为一个具有正整数值的单一字段,你可以使用这个ID字段为一个字段定义位图索引。这种类型的表要么使用系统分配的唯一正整数ID,要么使用IdKey定义自定义ID值,其中IdKey基于类型为%Integer且MINVAL>0的单一属性,或类型为%Numeric且SCALE=0且MINVAL>0的单一属性。 如果表的ID字段没有定义为具有正整数值的单一字段(例如,一个子表),你可以定义一个%BID(位图ID)字段,它采取正整数,作为一个代理ID字段;这允许你为这个表中的字段创建位图索引。 本章讨论了与位图索引有关的下列主题“ 位图索引操作 通过使用类定义来定义位图索引 使用DDL定义位图索引 生成一个位图范围索引 选择一个索引类型 对位图索引的限制 维护位图索引 位图分块的SQL操作 位图索引操作原理 位图索引的工作方式如下。假设你有一个包含若干列的Person表,这个表中的每一行都有一个系统分配的RowID号码(一组递增的整数值)。一个位图索引使用一组bitstring(一个包含1和0值的字符串)。在一个bitstring内,一个bit的序号位置对应于被索引表的RowID。对于一个给定的值,例如State是 "NY",有一个bitstring,对应于包含 "NY "的行,每个位置都是1,其他不包含'NY'的行,位置都是0。 例如,一个关于State的位图索引可能看起来像这样: 而关于年龄的索引可能看起来像这样。 注意: 这里显示的年龄字段可以是一个普通的数据字段,也可以是一个可以靠其他字段得出的字段(计算和SQLComputed)。 除了在标准操作中使用位图索引外,SQL引擎还可以使用位图索引,使用多个索引的组合有效地执行基于集合的特殊操作。例如,为了找到所有24岁并居住在纽约的Person实例,SQL引擎可以简单地执行Age和State索引的 AND 逻辑。结果如下: SQL引擎可以使用位图索引进行以下操作: 在一个给定的表上对多个条件进行ANDing。 在一个给定的表上的多个条件的ORing。 在一个给定的表上的RANGE条件。 在一个给定的表上进行COUNT操作。 位图索引的限制 所有的位图索引都有以下限制: 不能在一个UNIQUE列上定义一个位图索引。 不能在位图索引中存储数据值。 不能在一个字段上定义位图索引,除非该字段的SqlCategory是INTEGER, DATE, POSIXTIME, 或NUMERIC (with scale=0) 。 对于一个包含超过100万条记录的表来说,当唯一值的数量超过10,000时,位图索引的效率就不如标准索引。因此,对于一个大表,建议你避免对任何包含(或可能包含)超过10,000个唯一值的字段使用位图索引;对于任何规模的表,避免对任何可能包含超过20,000个唯一值的字段使用位图索引。这些都是一般的近似值,不是精确的数字。 你必须创建一个%BID属性来支持表上的位图索引,该表 使用一个非整数字段作为唯一的ID键。 使用一个多字段的ID键。 是父-子关系中的一个子表。 你可以使用$SYSTEM.SQL.Util.SetOption()方法SET status=$SYSTEM.SQL.Util.SetOption("BitmapFriendlyCheck",1,.oldval)来设置一个系统范围的配置参数,在编译时检查这个限制,确定%Storage.SQL类中是否允许定义位图索引。这个检查只适用于使用%Storage.SQL的类。你可以使用$SYSTEM.SQL.Util.GetOption("BitmapFriendlyCheck")来确定这个选项的当前配置。 应用逻辑的限制: 一个位图结构可以用一个bitstring数组来表示,其中数组的每个元素代表一个具有固定bit数的 "块"。因为未定义等同于一个全部为0位的块,所以数组可以是稀疏的。一个代表所有0 bit的块的数组元素根本就不需要存在。由于这个原因,应用逻辑应该避免依赖0值位的$BITCOUNT(str,0)计数。 因为一个bitstring包含内部格式化,应用逻辑不应该依赖于一个bitstring的物理长度,也不应该依赖于对两个具有相同位值的bitstring进行等价。在回滚操作之后,一个bitstring被恢复到事务之前的位值。然而,由于内部格式化,回滚的bitstring可能不等同于事务之前的bitstring,也不具有相同的物理长度。 维护位图索引 在一个不稳定的表(一个经历了许多INSERT和DELETE操作的表),位图索引的存储可能会逐渐变得不那么有效。 为了维护位图索引,你可以运行%SYS.Maint.Bitmap工具方法来压缩位图索引,将其恢复到最佳效率。你可以使用OneClass()方法来压缩单个类的位图索引。或者你可以使用Namespace()方法来压缩整个命名空间的位图索引。这些维护方法可以在一个生产系统上运行。 d ##class(%SYS.Maint.Bitmap).Namespace("Samples",1,1,"2014-01-17 09:00:00") d ##class(%SYS.Maint.Bitmap).OneClass("BitMap.Test",1,1) 运行%SYS.Maint.Bitmap实用方法的结果被写到调用该方法的进程中。这些结果也被写入%SYS.Maint.BitmapResults类中。 位片索引 当一个数字数据字段被用于某些数字操作时,位片索引被用于该字段。位片索引将每个数字数据值表示为一个二进制位串。比起使用布尔标志对数字数据值进行索引(如在位图索引中),位片索引用二进制表示每个值,并为二进制值中的每个数字创建一个位图来记录哪些行的二进制数字为1。这是一种高度专业化的索引类型,可以大幅度提高以下操作的性能。位片索引适用于以下类型: SUM, COUNT, 或AVG聚合计算。(位片索引不用于COUNT(*)计算) 位片索引不用于其他聚合函数。 在 TOP n ... ORDER BY field 的操作。 在一个范围条件操作中指定的字段,例如 WHERE field > n or WHERE field BETWEEN lownum AND highnum SQL优化器决定是否应该使用定义的位片索引。通常情况下,优化器只在处理大量的行(成千上万)时才使用位片索引。 在一个不稳定的表(一个经历了许多INSERT、UPDATE和DELETE操作的表)中,位片索引的存储效率会逐渐降低。%SYS.Maint.Bitmap工具方法同时压缩了位图索引和位片索引,恢复了效率。更多细节,请看 "维护位图索引"。 位图范围索引 位图范围索引是针对表的行的位图索引,而不是针对表的任何指定字段。在位图范围索引中,每个位代表一个连续的RowID整数值,每个位的值指定相应的行是否存在。InterSystems SQL使用这种索引来提高COUNT()的性能,COUNT()返回表中的记录数(行数)。一个表最多可以有一个位图范围索引。试图创建一个以上的位图范围索引,会导致SQLCODE -400错误,并出现%msg ERROR #5445: 定义了多个范围索引。 一个位图索引需要一个位图范围索引。只有在定义了一个或多个位图索引的情况下,定义一个持久化类才会生成一个位图范围索引。因此,当编译一个包含位图索引的持久化类时,如果没有为该类定义位图范围索引,类编译器会生成一个位图范围索引。 如果你从持久化类定义中删除了所有位图索引,那么位图范围索引会自动删除。但是,如果你重命名位图范围索引(例如,使用CREATE BITMAPEXTENT INDEX命令),删除位图索引并不会删除位图范围索引。 当为一个类建立索引时,如果你明确地建立了位图范围索引,或者你建立了位图索引而位图范围索引是空的,那么位图范围索引就会被建立。 一个类从主超类继承它的位图范围索引,如果它存在的话,可以定义或生成。一个位图范围索引被定义为:type = bitmap, extent = true。这意味着从主超类继承的位图范围索引被认为是一个位图索引,如果在子类中没有明确定义位图范围索引,则会触发在子类中生成一个位图范围索引。 InterSystems IRIS不会根据未来的可能性在超类中生成一个位图范围索引。这意味着InterSystems IRIS永远不会在一个持久性类中生成一个位图范围索引,除非有一个类型=位图的索引存在。假设某个未来的子类可能引入一个类型=位图的索引是不够的。 注意:在生产系统上为一个类添加位图索引的过程中需要特别注意(当用户使用一个特定的类,编译该类,并随后为它建立位图索引结构)。在这样的系统上,位图范围索引可能会在编译完成和索引建立过程的中间阶段被填充。这可能导致索引构建程序没有隐含地构建位图范围索引,这导致了部分位图范围索引不能被构建。 在一个经历了许多DELETE操作的表中,位图范围索引的存储会逐渐变得不那么有效。你可以通过使用BUILD INDEX命令重建位图范围索引,或者从管理门户选择表的Catalog Details标签,Maps/Indices选项并选择Rebuild Index。 构建索引 构建一个索引会做以下事情。 移除索引的当前内容。 扫描(读取每一行)主表,为表中的每一行添加索引条目。如果可能的话,使用特殊的$SortBegin和$SortEnd函数来确保建立大型索引的效率。当建立标准索引时,除了在内存中缓存数据外,这种对$SortBegin/$SortEnd的使用会占用IRISTEMP数据库的空间。因此,当建立一个非常大的标准索引时,InterSystems IRIS可能需要IRISTEMP中的空间,大致相当于最终索引的大小。 注意:建立索引的方法只提供给使用InterSystems IRIS默认存储结构的类(表)。 当前的数据库访问决定了你应该如何重建一个现有的索引: 非活跃系统(在索引建立或重建期间没有其他进程访问数据) 只读活跃系统(其他进程在索引建立或重建期间能够查询数据) 读和写活跃系统(其他进程能够修改数据,并在索引建立或重建期间查询数据)。 你可以按以下方式建立/重新建立索引。 使用BUILD INDEX SQL命令来构建指定的索引,或构建为一个表、一个Schema或当前命名空间定义的所有索引: //为整个表构建索引 BUILD INDEX FOR TABLE table-name //为一个Schema下的所有表构建索引 BUILD INDEX FOR SCHEMA schema-name //为整个命名空间构建索引 BUILD INDEX FOR ALL 使用管理门户为一个指定的类(表)重建所有的索引。 系统资源管理器 - SQL- 操作 - 重建表索引 使用%BuildIndices()(或%BuildIndicesAsync())方法,如本节所述。 建立索引的首选方法是使用%BuildIndices()方法或%BuildIndicesAsync()方法。 %Library.Persistent.%BuildIndices()。%BuildIndices()作为一个后台进程执行,但调用者必须等待%BuildIndices()完成后才能接收控制权。 %Library.Persistent.%BuildIndicesAsync()。BuildIndicesAsync()将%BuildIndices()作为一个后台进程启动,调用者立即收到控制权。%BuildIndicesAsync()的第一个参数是queueToken输出参数。其余的参数与%BuildIndices()相同。 %BuildIndicesAsync()返回一个%Status值:成功表示%BuildIndices()工作任务成功排队;失败表示工作任务没有成功排队。 %BuildIndicesAsync()向queueToken输出参数返回一个值,表示%BuildIndices()完成状态。为了获得完成状态,你通过引用queueToken值传递给%BuildIndicesAsyncResponse()方法。你还指定了wait布尔值。如果wait=1,%BuildIndicesAsyncResponse()将等待,直到由queueToken识别的%BuildIndices()作业完成。如果wait=0,%BuildIndicesAsyncResponse()将尽可能快地返回一个状态值。如果%BuildIndicesAsyncResponse()的queueToken在返回时不是NULL,那么%BuildIndices()作业还未完成。在这种情况下,queueToken可以用来再次调用%BuildIndicesAsyncResponse()。当%BuildIndicesAsyncResponse()的queueToken最终为空时,那么%BuildIndicesAsyncResponse()返回的%Status值就是由%BuildIndicesAsync()调用的作业的完成状态。 在一个不活跃的系统上构建索引: 系统自动生成方法(由%Persistent类提供),用于构建(即为其提供数值)或清除(即为其移除数值)为类(表)定义的每个索引。你可以通过以下两种方式使用这些方法。 通过管理门户: 系统资源管理器 - SQL- 操作 - 重建表索引 注意:当其他用户正在访问该表的数据时,不要重建索引。要在一个活跃系统上重建索引,请看在活跃系统上建立索引。 以编程方式调用。 构建所有索引:调用%BuildIndices(),没有参数,为给定的类(表)构建(提供)所有索引。 SET sc = ##class(MyApp.SalesPerson).%BuildIndices() IF sc=1 {WRITE !, "Successful index build" } ELSE {WRITE !, "Index build failed",! DO $System.Status.DisplayError(sc) QUIT} 构建指定的索引:调用%BuildIndices(),以$List的索引名称作为第一个参数,为一个给定的类(表)建立(提供)指定的索引。 SET sc = ##class(MyApp.SalesPerson).%BuildIndices($ListBuild("NameIDX", "SSNKey")) IF sc=1 {WRITE !, "Successful index build" } ELSE {WRITE !, "Index build failed",! DO $System.Status.DisplayError(sc) QUIT} 构建所有索引,除了某些指定索引:调用%BuildIndices(),将$List的索引名称作为第七个参数,为一个给定的类(表)构建(提供值)所有定义的索引,除了指定的索引。 SET sc = ##class(MyApp.SalesPerson).%BuildIndices("",,,,,,$ListBuild("NameIDX", "SSNKey")) IF sc=1 {WRITE !, "Successful index build" } ELSE {WRITE !"Index build failed",! DO $System.Status.DisplayError(sc) QUIT} %BuildIndices()方法做了以下工作: 在任何要重建的(非位图)索引上调用$SortBegin函数(这将为这些索引启动一个高性能的排序操作)。 循环处理该类的主要数据(表),收集索引使用的值,并将这些值添加到索引中(有适当的整理转换)。 调用$SortEnd函数来完成对索引的排序过程。 如果索引已经有了值,你必须用两个参数调用%BuildIndices(),其中第二个参数的值为1,为这个参数指定1会使该方法在重建索引之前清除这些值。比如说: SET sc = ##class(MyApp.SalesPerson).%BuildIndices(,1) IF sc=1 {WRITE !, "Successful index build" } ELSE {WRITE !, "Index build failed",! DO $System.Status.DisplayError(sc) QUIT} 这就清除并重建了所有的索引。你也可以清除和重建索引的一个子集,如: SET sc = ##class(MyApp.SalesPerson).%BuildIndices($ListBuild("NameIDX", "SSNKey"),1) IF sc=1 {WRITE !, "Successful index build" } ELSE {WRITE !, "Index build failed",! DO $System.Status.DisplayError(sc) QUIT} 注意:当其他用户正在访问该表的数据时,不要重建索引。要在一个活跃系统上重建索引,请看在活跃系统上建立索引。 在活跃系统上建立索引 当在一个活跃系统上建立(或重建)索引时,有两个问题: 活跃查询可能会返回不正确的结果,除非正在建立的索引被隐藏在SELECT查询之外。在建立索引之前,可以使用SetMapSelectability()方法来处理这个问题。 在建立索引期间对数据的主动更新可能不会反映在索引条目中。这可以通过在构建索引时让构建操作锁定个别行来处理。 注意:如果一个应用程序在一个事务中对数据进行大量的更新,可能会出现锁表争夺的问题。 在一个只读活跃系统上构建索引 如果一个表目前只用于查询操作(只读),你可以在不中断查询操作的情况下建立新的索引或重建现有索引。这是通过在重建这些索引时使索引对查询优化器不可用来实现的。 如果你想建立一个或多个索引的所有类目前都是只读的,使用 "在读和写活跃系统上建立索引 "中描述的相同系列操作,但有以下区别:当你使用%BuildIndices()时,设置pLockFlag=3(共享范围锁)。 在读和写活跃系统上建立索引 如果一个持久化的类(表)目前正在使用,并且可以进行读和写访问(查询和数据修改),你可以建立新的索引或者重建现有的索引而不中断这些操作。如果你想重建一个或多个索引的类目前可以被读和写访问,建立索引的首选方法是使用表的持久化类提供的%BuildIndices()(或%BuildIndicesAsync())方法。 在并发的读和写访问中,建立一个或多个索引需要进行以下一系列操作: 使你希望建立的索引对查询不可用(READ访问)。这是用SetMapSelectability()完成的。这使得该索引不能被查询优化器使用。这个操作应该在重建一个现有的索引和创建一个新的索引时执行。比如说 SET status=$SYSTEM.SQL.Util.SetMapSelectability("Sample.MyStudents", "StudentNameIDX",0) 第一个参数是Schema.Table名称,即SqlTableName,而不是持久化类的名称。例如,默认的Schema是SQLUser,而不是User。这个值是区分大小写的。 第二个参数是SQL索引图名称。这通常是索引的名称,指的是索引存储在磁盘上的名称。对于一个新的索引,这是你在创建索引时要使用的名称。这个值是不区分大小写的。 第三个参数是MapSelectability标志,其中0定义索引图为不可选择(关闭),1定义索引图为可选择(打开)。指定为0。 你可以通过调用GetMapSelectability()方法来确定一个索引是否是不可选择的。如果你已经明确地将一个索引标记为不可选择,这个方法返回0。在所有其他情况下,它返回1;它不对表或索引的存在进行验证检查。注意,Schema.Table名称是SqlTableName,并且区分大小写。 SetMapSelectability()和GetMapSelectability()仅适用于当前命名空间的索引映射。如果该表被映射到多个命名空间,并且需要在每个命名空间建立索引,则应在每个命名空间调用SetMapSelectability()。 在索引建立的过程中建立并发操作。 对于一个新的索引 在类中创建索引定义(或者在类的%Storage.SQL中创建新的SQL索引映射规范),编译该类。对于一个新的索引,这是合适的,因为索引还没有被填充。在可以对表进行查询之前,需要对范围索引进行填充。 对于一个现有的索引。清除任何引用该表的缓存查询。索引构建所执行的第一个操作是杀死索引。因此,当索引被重建时,你不能依靠任何被优化的代码来使用该索引。 //删除当前命名空间的所有缓存查询 PURGE CACHED QUERIES ​ //删除当前命名空间n天内的所有缓存查询 PURGE CACHED QUERIES BY AGE n Do $SYSTEM.SQL.Purge(n) ​ //删除某个表的缓存查询 PURGE CACHED QUERIES BY TABLE table-name 或者 Do $SYSTEM.SQL.PurgeForTable("MedLab.Patient") ​ //删除当类的缓存查询 PURGE [CACHED] QUERIES BY NAME class-name 使用你的持久化类(表)的%BuildIndices()方法,使用pLockFlag=2(行级锁)来建立索引。pLockFlag=2标志在重建过程中对个别行建立了一个排他性的写锁,这样并发的数据修改操作就可以与构建索引操作相协调。 默认情况下,%BuildIndices()会构建所有为持久化类定义的索引;你可以使用pIgnoreIndexList来排除重建索引。 默认情况下,%BuildIndices()为所有ID建立索引条目。然而,你可以你可以使用pStartID和pEndID来定义一个ID的范围。%BuildIndices()将只为该范围内的ID建立索引条目。例如,如果你使用带有%NOINDEX限制的INSERT将一系列新记录添加到表中,你可以随后使用带有ID范围的%BuildIndices()来为这些新记录建立索引条目。 %BuildIndices()返回一个%Status值。如果%BuildIndices()由于检索数据的问题而失败,系统会产生一个SQLCODE错误和一个消息(%msg),其中包括遇到错误的%ROWID。 一旦你完成了建立索引,请启用查询优化器的MapSelectability。设置第三个参数,MapSelectability标志为1,如下面的例子所示。 SET status=$SYSTEM.SQL.Util.SetMapSelectability("Sample.MyStudents", "StudentNameIDX",1) 再一次,清除任何引用该表的缓存查询。这将消除在此过程中创建的无法使用索引的缓存查询,因此,与使用索引的相同查询相比,缓存查询的效果较差。 这样就完成了这个过程。索引被完全填充,并且查询优化器能够考虑该索引。 注意:%BuildIndices()只能用于为有正整数ID值的表重建索引。如果父表有正的整数ID值,你也可以使用%BuildIndices()来重建子表的索引。对于其他表,使用%ValidateIndices()方法。因为%ValidateIndices()是建立索引的最慢的方法,所以只有在没有其他选择的情况下才应该使用它。 验证索引 你可以使用以下任一方法来验证索引: $SYSTEM.OBJ.ValidateIndices()验证一个表的索引,同时也验证该表的集合子表的任何索引。 %Library.Storage.%ValidateIndices()验证一个表的索引。集合子表的索引必须用单独的%ValidateIndices()调用进行验证。 这两种方法都检查指定表的一个或多个索引的数据完整性,并可选择纠正发现的任何索引完整性问题。它们分两步进行索引验证。 确认为表(类)中的每一行(对象)正确定义了一个索引实体。 遍历每个索引,对于每个被索引的条目,确保在表(类)中有一个值和匹配的条目。 如果任何一种方法发现不一致的地方,它可以选择性地纠正索引结构和内容。它可以验证并选择性地纠正标准索引、位图索引、位图范围索引和位片索引。默认情况下,这两个方法都验证索引,但不纠正索引。 只有在遵循以下条件的情况下,%ValidateIndices()才能用于纠正(建立)读和写活跃系统中的索引: SetMapSelectability()被使用,如上所述;%ValidateIndices()参数必须包括autoCorrect=1和lockOption>0。 因为%ValidateIndices()的速度明显较慢,%BuildIndices()是在活跃系统上建立索引的首选方法。 %ValidateIndices()通常从终端运行。它显示输出到当前设备。这个方法可以应用于指定的%List索引名称,或者为指定表(类)定义的所有索引。它只对那些起源于指定类的索引进行操作;如果一个索引起源于一个超类,该索引可以通过在超类上调用%ValidateIndices()进行验证。 只读类不支持%ValidateIndices()。 %ValidateIndices()被支持用于分片类和分片主类表(Sharded=1)。你可以调用%ValidateIndices,要么直接作为一个类方法,要么从$SYSTEM.OBJ.ValidateIndices上调用分片主类。然后在每个分片上的分片本地类上执行索引验证,并将结果返回给分片主类上的调用者。当在分片类上使用%ValidateIndices()时,verbose标志被强制为0,没有输出到当前设备。任何发现/纠正的问题都会在byreference errors()数组中返回。 下面的例子使用%ValidateIndices()来验证和纠正Sample.Person表的所有索引: SET status=##class(Sample.Person).%ValidateIndices("",1,2,1) IF status=1 {WRITE !, "Successful index validation/correction" } ELSE {WRITE !, "Index validation/correction failed",! DO $System.Status.DisplayError(status) QUIT}。 第一个参数("")指定要验证所有的索引; 第二个参数(1)指定要修正索引差异; 第三个参数(2)指定要对整个表进行独占锁定; 第四个参数(1)指定使用多个进程(如果有的话)来执行验证。该方法返回一个%Status值。 通过名称验证索引: SET IndList=$LISTBUILD("NameIDX", "SSNKey") SET status=##class(Sample.Person).%ValidateIndices(IndList,1,2,1) IF status=1 {WRITE !, "Successful index validation/correction" } ELSE {WRITE !, "Index validation/correction failed",! DO $System.Status.DisplayError(status) QUIT}。 %ValidateIndices()的第一个参数或$SYSTEM.OBJ.ValidateIndices()的第二个参数指定哪些索引将作为%List结构被验证。不管第一个参数的值如何,IdKey索引总是被验证的。你可以通过指定一个空字符串值("")来验证表的所有索引。你可以通过指定一个列表结构来验证该表的单个索引。下面的例子验证了IdKey索引和两个指定的索引。NameIDX和SSNKey。 对于这两种方法,如果索引列表包含一个不存在的索引名称,该方法不执行索引验证,并返回%Status错误。如果索引列表中包含一个重复的有效索引名称,该方法将验证指定的索引,忽略重复的索引,不发出错误。 索引信息查询 INFORMATION.SCHEMA.INDEXES持久化类显示当前命名空间中所有列索引的信息。它为每个被索引的列返回一条记录。它提供了一些索引的属性,包括索引的名称,表的名称,以及索引所对应的列的名称。每条列记录还提供了该列在索引图中的序号位置;除非索引映射到多个列,否则这个值是1。它还提供了布尔属性PRIMARYKEY和NONUNIQUE(0=索引值必须是唯一的)。 SELECT Index_Name,Table_Schema,Table_Name,Column_Name,Ordinal_Position, Primary_Key,Non_Unique FROM INFORMATION_SCHEMA.INDEXES WHERE NOT Table_Schema %STARTSWITH '%' 你可以使用管理界面的目录详情的映射/索引选项列出所选表的索引。这将为每个索引显示一行,并显INFORMATION.SCHEMA.INDEXES没有提供的索引信息。 使用索引对一个对象进行open、exist和delete的方法 InterSystems IRIS的索引支持以下操作: 通过索引键打开一个实例 检查一个实例是否存在 删除一个实例 通过索引key打开一个实例 对于ID键、主键或唯一索引,indexnameOpen()方法(其中indexname是索引的名称)允许你打开其索引属性值与所提供的值一致的对象。 例如,假设一个类包括下面的索引定义。 Index SSNKey On SSN [ Unique ] 。 那么,如果被引用的对象已经被存储到磁盘,并且有一个唯一的ID值,你可以按以下方式调用该方法。 SET person = ##class(Sample.Person).SSNKeyOpen("111-22-3333",2,.sc) 第一个参数对应于索引中的属性。 第二个参数指定要打开对象的并发值(这里是2 - 共享锁)。 第三个参数可以接受%Status代码,以防该方法无法打开一个实例,如果找到一个匹配的实例,该方法会返回一个OREF。如果该方法没有找到一个与所提供的值相匹配的对象,那么一个错误信息将被写入状态参数sc中。 这个方法被实现为%Compiler.Type.Index.Open()方法;这个方法类似于%Persistent.Open()和%Persistent.OpenId()方法,除了它使用索引定义中的属性而不是OID或ID参数。 检查一个对象是否存在 indexnameExists()方法(其中indexname是索引的名称)检查是否存在一个具有该方法的参数所指定的索引属性值的实例。该方法有一个参数对应于索引中的每个属性;它的最后一个可选参数可以接收对象的ID,如果有一个与提供的值相匹配的话。该方法返回一个布尔值,表示成功(1)或失败(0)。这个方法被实现为%Compiler.Type.Index.Exists()方法。 例如,假设一个类包括下面的索引定义。 Index SSNKey On SSN [ Unique ]; 那么,如果被引用的对象已经被存储到磁盘,并且有一个唯一的ID值,你可以按以下方式调用该方法。 SET success = ##class(Sample.Person).SSNKeyExists("111-22-3333",.id) 成功完成后,success等于1,id包含与找到的对象匹配的ID。 该方法返回所有索引的值,除了。 位图索引,或位图范围索引。 当索引包括(ELEMENTS)或(KEYS)表达式时。 删除一个对象 indexnameDelete()方法(其中indexname是索引的名称)是为了与Unique、PrimaryKey和/或IdKey索引一起使用;它删除其键值与提供的键属性/列值相匹配的实例。有一个可选的参数,你可以用它来指定该操作的并发设置。该方法返回一个%Status代码。它被实现为%Compiler.Type.Index.Delete()方法。
文章
Claire Zheng · 七月 8, 2021

2021 CHITEC | InterSystems IRIS医疗版互联互通套件:六大能力助力医院互联互通建设

2021年7月9日-11日,2021(16th) 中国卫生信息技术/健康医疗大数据应用交流大会暨软硬件与健康医疗产品展览会(CHITEC)在武汉国际博览中心(湖北省武汉市汉阳区鹦鹉大道619号)盛大召开,欢迎莅临InterSystems展位A6-16,了解备受瞩目的InterSystems IRIS医疗版互联互通套件。 InterSystems致力于部署、创建互联互通医疗解决方案,为医院数字化转型提供技术支持。针对医院信息互联互通标准化成熟度测评指标要求,InterSystems IRIS 医疗版互联互通套件从安全管理、监控、数据管理、互联互通文档、互联互通服务、集成与交换六大方面助力医院互联互通建设,以满足医疗机构内部标准化的要求,使医院可基于信息平台提供较为完善的临床决策支持、闭环管理,实现丰富的人工智能和大数据应用,实现丰富的跨机构的业务协同和互联互通应用。 如果您希望进一步了解详细信息,欢迎莅临展位(A6-16),或通过下方二维码联系小助手,添加时注明“CHITEC预约沟通”,确认您的专属预约沟通时段,如果您完成预约并与专家实现现场沟通,将有机会获得神秘礼品! InterSystems IRIS医疗版互联互通套件具备如下优点: 专——专注医疗领域40余年,针对中国医疗信息化市场量身定制,遵循国家卫生信息标准,公立医院互联互通标准化成熟度测评需求的基石;加强健康数据标准应用,提高数据质量;全——全面支持2020最新版医院互联互通标准化成熟度测评规定的文档、监控、服务、Schema 等组件;快——卓越的互操作性助力医疗机构快速落地互联互通标准化成熟度测评标准化改造;省——有效缩短实施周期,降低实施成本,超高性能有效降低硬件成本;稳——稳定高效,连续多年支持超百家大型公立医院海量数据稳定运行。主流 PC 服务器单实例下,支持日消息吞吐量可达 27亿;目前已知支持国内公立医院日消息吞吐量高达1200万/天(非集群);强——功能强大,该套件具备持久化数据能力,可全面助力医院快速实现创新型数据应用,包括数据库管理、敏捷开发、 API 管理、FHIR资源仓库、分布式扩展、一体化机器学习、自适应分析等;广——广泛专业的本土化生态合作伙伴,具备丰富的互联互通成熟度测评经验与强大的落地能力。 截至2020 年,InterSystems已助力中南大学湘雅医院(五级乙等)、河南省人民医院(五级乙等)、安徽省立医院(五级乙等)、武汉中心医院(五级乙等)、四川大学华西第二医院(五级乙等)、深圳市宝安区妇幼保健院(五级乙等)、广州医科大学附属第二医院(五级乙等)、吉林大学中日联谊医院(五级乙等)、浙江大学医学院附属第四医院(五级乙等)、北京协和医院(四级甲等)等一百余家医院通过互联互通标准化成熟度测评,在全国大型医院中市场份额最高。 2021 CHITEC (7月9日-11日)期间,转发这篇文章到微信朋友圈,可以到InterSystems展位领取小礼品哦~
文章
Michael Lei · 五月 24, 2021

InterSystems 数据平台和性能 – 如何更新 pButtons

。之前我展示了如何运行 pButtons 来收集我们在下列帖子中研究的性能指标。 - [第 1 部分 - 入门:收集指标。](https://cn.community.intersystems.com/post/intersystems-数据平台和性能-–-第-1-篇) - [第 2 部分 - 研究收集的指标。](https://cn.community.intersystems.com/post/intersystems-数据平台和性能-–-第-2篇) ## 更新:2020 年 5 月。 _自四年前写下本帖以来,我们已从 Caché 迁移到 IRIS。 有关 pButton (Caché) 和 SystemPerformance (IRIS) 文档的更新链接,请参见评论。 另请注意如何将系统更新到最新版本的性能工具。_ pButtons 与 Caché 5 及更高版本兼容,并已包含在最近的 InterSystems 数据平台分发版(HealthShare、Ensemble 和 Caché)中。 本帖旨在提醒您下载并安装最新版的 pButttons。 最新版本始终可以通过 ftp 下载。 ftp.intersystems.com/pub/performance 您需要下载以下文件: pButtons_package.zip 解压 .zip 文件后,请查看 `readme.txt` 文件,以确保为您的 Caché 版本安装正确的文件。 要检查您现在已安装哪个版本,可以运行: %SYS>write $$version^pButtons() 备注 1: - 当前版本的 pButtons 需要一个许可证单元才能运行,将来的发行版将满足此要求。 - 此 pButtons 发行版的版本已更改。 — 之前的 pButtons 版本为 1.16c — 新发行版为版本 5。 备注 2: - pButtons 版本 5 还更正了版本 1.16a 引入的一个问题,该问题可能导致收集时间非常长。 版本 1.16a 包含在 Caché 2015.1.0 中。 如果您有 pButtons 版本 1.16a 至 1.16c,则应该从 ftp 站点下载 pButtons 版本 5。 有关 pButtons 的更多详细信息,请参见下载的文件以及在线 Caché 文档。
文章
Louis Lu · 一月 19, 2023

InterSystems IRIS 2022.3 版本下的列存储

您可能还记得在 InterSystems 2022年全球峰会以及 2022.2 版本发布的网络研讨会上,我们发布了一项令人兴奋的新功能——列存储,它可以纳入您 InterSystems IRIS 的解决方案中。 列存储引入了一种存储SQL表数据的替代方法,它为分析查询提供了数量级的加速。 最新的2022.3开发预览版在原有的基础上包括一系列我们认为值得在这里宣布的更新。 快速回顾 如果您不熟悉InterSystems IRIS 的列存储,请观看这段简短的介绍视频以及相关该主题的2022全球峰会内容。 简而言之,我们使用新的$vector数据类型将表数据编码为每列 64k 个值的块。 $vector是一种仅限内部使用的数据类型(目前),它利用自适应编码方案来实现稀疏和密集数据的高效存储。 编码还针对一系列专用$vector操作进行了优化,例如一次计算64k 值的整个块的聚合、分组和过滤,并在可能的情况下利用芯片的SIMD指令。 在SQL查询时,我们构建对这些块直接进行操作的查询计划,正如您所想象的,与传统的逐行处理相比,这大大减少了执行查询所需的IO量和ObjectScript指令数。 当然,与面向行且对于单值的操作相比,这个的IO消耗更大,$vector的操作也更重一些,但收益是巨大的。 我们使用一个专业术语矢量化查询计划来表示处理$vector数据的执行策略,通过一系列快速的对于整个块的操作来提高整体的效率。 就一个字“快” 最重要的是,事情变得更快了。 我们扩展了优化器对列索引的理解,现在您将看到更多的查询使用列索引,即使某些请求的字段没有存储在列索引或数据映射中。 此外,您将看到它在许多情况下联合收割机了列索引和位图索引,如果您是从向现有模式添加列索引开始的,那么这将非常有用。 新工具包还包括一系列跨堆栈的更改,以提高性能,从优化到一些查询处理增强功能上的低级$vector操作,以及一组更广泛的可并行化的矢量化查询计划。 加载数据的某些方法,如通过INSERT.. SELECT语句,现在还将使用我们已经用于构建索引的缓冲模型,并且现在能够以真正高的性能构建整个表。 向量化的 JOIN 操作 我们在此版本中添加的最令人兴奋的功能是支持以矢量化方式连接列数据。 在Python 2022.2中,当您希望在一个查询中联合收割机两个表中的数据时,我们仍然会求助于健壮的逐行JOIN策略,该策略同样适用于按列和按行组织的数据。 现在,当JOIN的两端都以列格式存储时,我们使用一个新的内核API在内存中对它们进行JOIN,同时保留它们的$vector格式。 这是实现完全矢量化查询计划的又一重要步骤,即使对于最复杂的查询也是如此。 下面是一个利用新函数的查询示例,该查询对纽约Taxi数据集执行 SELECT COUNT(*), MAX(r1.total_amount - r2.total_amount) FROM NYTaxi.Rides r1, NYTaxi.Rides r2 WHERE r1.DOLocationID = r2.PULocationID AND r1.tpep_dropoff_datetime = r2.tpep_pickup_datetime AND r2.DOLocationID = r1.PULocationID AND r1.passenger_count > 2 AND r2.passenger_count > 2 此查询查找有两名以上乘客的旅行对,第二次旅行在第一次旅行结束的地方开始,在完全相同的时间,并且第二次旅行将乘客带回第一次旅行开始的地方。 这不是一个非常有用的分析,但是我在这个模式中只有一个真正的表,复合JOIN键使这个分析变得不那么琐碎。 在此语句的查询计划中,您将看到类似Apply vector operation %VHASH(用于构建复合JOIN键)和Read vector-join temp-file A的片段,它们表明我们的新矢量化连接器正在工作! 这听起来像是一个冗长的查询计划中的一个微不足道的小问题,但它涉及到内部的大量智能工程,而且有相当多的知名柱状数据库供应商根本不允许这样做,并对您的模式布局施加了严格的约束,所以请加入我们,一起来享受这个! :—) 当查询计划继续读取该临时文件时,您可能会注意到在连接后的工作中仍有一些逐行处理,这就把我们带到了...... 接下来我们会... 列存储在2022.3版本中仍被标记为"实验性",但我们正在接近生产就绪状态,并为多表查询提供完整的端到端矢量化操作。 这包括上面提到的Post-Join 工作、查询优化器中更广泛的支持、更快地加载列式表以及对连接器的进一步增强(如共享内存支持)。 简而言之:现在是使用 InterSystems IRIS 2022.3社区版在纽约出租车数据集上进行第一次尝试的好时机,并且在我们发布2023.1时,您只需按下"运行"按钮就可以! 如果您对如何将列式存储用于您自己的数据和查询感兴趣,请直接联系 InterSystems 客户团队,也许我们会在InterSystems 2023年全球峰会上见面;-).
公告
Hao Ma · 一月 12, 2023

ZPM 现在是 InterSystems 包管理器 (IPM)

我很高兴地宣布 ObjectScript 包管理器 ZPM 的生命周期中的一个里程碑。包管理器使开发人员能够以一种方便的方式巧妙地打包 ObjectScript 代码和部署配置设置以及版本信息。在过去的几年里,它已经发展成为许多开发工作流程中不可或缺的一部分。 事实证明,InterSystems 决定使用它来打包我们自己的组件非常重要,这促使我们决定将 GitHub 存储库从社区移至我们的公司存储库,并将其重命名为InterSystems Package Manager (IPM) 。 IPM 仍将是开源的。社区成员将能够审查代码并提交拉取请求。但这种变化使我们能够以非员工能够直接对代码库进行更改的方式确保软件的安全性。更高级别的安全性和信任对于可以将代码与您的数据一起安装的软件来说至关重要。 所以请和我一起庆祝 ZPM 的生命,欢迎 IPM 的诞生,并感谢贡献者——尤其是 Nikolay Soloviev 和@Dmitry.Maslennikov,他们再次展示了对开发人员需求的惊人洞察力,以及技能和奉献精神构建出色的软件! --- https://github.com/intersystems/ipm
文章
Michael Lei · 十二月 13, 2022

InterSystems IRIS 嵌入式 Python 模板

嵌入式 Python 模板 今天你们分享一个简单的[嵌入式 Python 模板](https://openexchange.intersystems.com/package/iris-embedded-python-template),我建议将其作为任何使用 InterSystems IRIS 并将使用嵌入式 Python 的通用项目的起点。 功能: * 随时可用的嵌入式 Python; * 3 种嵌入式 Python 开发方式示例; * 随时可用的 VSCode 开发; * 支持 Docker; * 支持在线演示; * 随时可用的 ZPM 优先开发。 下面讨论一下这些功能! 我们先来谈谈嵌入式 Python。 此功能在 InterSystems IRIS 2021.2 中提供,它允许使用 InterSystems IRIS 通过 Python 开发解决方案。 IRIS 2021.2 及以上版本允许使用 InterSystems IRIS 在共享内存环境中执行 Python 脚本,这为 Python 开发者在使用代码与数据相近的数据库时提供了独特的选项。  ### 3 种使用嵌入式 Python 进行开发的模式 ### **从 ObjectScript 调用 Python 库** 此操作因 [%SYS.Python](https://docs.intersystems.com/irislatest/csp/documatic/%25CSP.Documatic.cls?&LIBRARY=%25SYS&CLASSNAME=%25SYS.Python) 类而变为可能,该类允许导入 Python 库并通过 ObjectScirpt 调用 Python。 [文档](https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI.Page.cls?KEY=AEPYTHON#AEPYTHON_callpython_library)、[示例](https://github.com/intersystems-community/iris-embedded-python-template/blob/be578226b7a0c583df1f7b693b1bdae074efb1bd/src/dc/python/PersistentClass.cls#L17)。 请查看以下代码: <span class="hljs-keyword">ClassMethod</span> Today() <span class="hljs-keyword">As</span> <span class="hljs-built_in">%Status</span> { <span class="hljs-keyword">Set</span> sc = <span class="hljs-built_in">$$$OK</span> <span class="hljs-keyword">Set</span> dt = <span class="hljs-keyword">##class</span>(<span class="hljs-built_in">%SYS.Python</span>).Import(<span class="hljs-string">"datetime"</span>) <span class="hljs-keyword">write</span> dt.date.today().isoformat() <span class="hljs-keyword">Return</span> sc } ### 使用 Python 编写 ObjectScript 类方法 事实上,现在开发者可以使用纯 Python 在方法签名和代码中添加 [Language=python] 标签。 还有一个辅助 Python 库“iris”,可以用于引用 ObjectScript 类和全局变量。 [文档](https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI.Page.cls?KEY=AEPYTHON#AEPYTHON_runpython_method)、[示例](https://github.com/intersystems-community/iris-embedded-python-template/blob/224be7f5bf80ea0f588f555c7f9e8c8d10c90c10/src/dc/python/PersistentClass.cls#L17)、示例代码: ClassMethod CreateRecordPython(propValue As %VarString, ByRef id As %Integer) [ Language = python ] { <span class="hljs-keyword">import</span> iris obj=iris.cls(__name__)._New() obj.Test=propValue sc=obj._Save() id=obj._Id() <span class="hljs-keyword">return</span> sc } ### 使用纯 Python 编写 InterSystems IRIS 解决方案代码 这是开发者可以选择的第三种处理 IRIS 的方式。  这里,Python 脚本需要连接到 IRIS,此操作可以通过环境变量和设为“On”的 CallIn 服务来完成,请参见下面的详细信息。 设置完后,使用 IRIS 在共享内存中执行 Python 脚本。 在这里,“iris”库也非常有用。 [文档](https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI.Page.cls?KEY=AEPYTHON#AEPYTHON_runpython_script)、[示例](https://github.com/intersystems-community/iris-embedded-python-template/blob/master/python/irisapp.py)。  <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">create_rec</span><span class="hljs-params">(var)</span>:</span> obj=iris.cls(<span class="hljs-string">'dc.python.PersistentClass'</span>)._New() obj.Test=var obj._Save() id=obj._Id() <span class="hljs-keyword">return</span> id <span class="hljs-comment"># test record creation</span> <span class="hljs-keyword">from</span> datetime <span class="hljs-keyword">import</span> datetime now=str(datetime.now()) print(<span class="hljs-string">"Creating new record in dc.python.PersistentClass"</span>) print(create_rec(now)) <span class="hljs-comment">## run SQL and print data</span> <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">run_sql</span><span class="hljs-params">(query)</span>:</span> rs=iris.sql.exec(query) <span class="hljs-keyword">for</span> idx, row <span class="hljs-keyword">in</span> enumerate(rs): print(<span class="hljs-string">f"[<span class="hljs-subst">{idx}</span>]: <span class="hljs-subst">{row}</span>"</span>) query=<span class="hljs-string">"Select * from dc_python.PersistentClass"</span> print(<span class="hljs-string">"Running SQL query "</span>+query) run_sql(query) ### 支持 Docker 模板仓库在容器中运行 IRIS,并设置嵌入式 Python 调整所需的所有内容。  环境变量。 嵌入式 Python 需要设置特定的环境变量来连接到 IRIS 并运行 Python 脚本。 下面是 [dockerfile](https://github.com/intersystems-community/iris-embedded-python-template/blob/be578226b7a0c583df1f7b693b1bdae074efb1bd/Dockerfile#L13-L17) 中有帮助的设置: # init Python env ENV PYTHON_PATH=/usr/irissys/bin/irispython ENV SRC_PATH=/irisrun/repo ENV IRISUSERNAME "SuperUser" ENV IRISPASSWORD "SYS" ENV IRISNAMESPACE "USER" 此外,嵌入式 Python 需要将 CallIn 服务设为“on”,此操作在构建 docker 的阶段在 [iris.script](https://github.com/intersystems-community/iris-embedded-python-template/blob/224be7f5bf80ea0f588f555c7f9e8c8d10c90c10/iris.script#L7) 中完成: <span class="hljs-comment">; enabling callin for Embedded Python</span> <span class="hljs-keyword">do</span> <span class="hljs-keyword">##class</span>(Security.Services).Get(<span class="hljs-string">"%Service_CallIn"</span>,.prop) <span class="hljs-keyword">set</span> prop(<span class="hljs-string">"Enabled"</span>)=<span class="hljs-number">1</span> <span class="hljs-keyword">set</span> prop(<span class="hljs-string">"AutheEnabled"</span>)=<span class="hljs-number">48</span> <span class="hljs-keyword">do</span> <span class="hljs-keyword">##class</span>(Security.Services).Modify(<span class="hljs-string">"%Service_CallIn"</span>,.prop) 另外,您的解决方案可能需要安装一些 Python 库。 这通过仓库根目录中的 [requirements.txt](https://github.com/intersystems-community/iris-embedded-python-template/blob/master/requirements.txt) 和 [dockerfile](https://github.com/intersystems-community/iris-embedded-python-template/blob/224be7f5bf80ea0f588f555c7f9e8c8d10c90c10/Dockerfile#L22) 中的 pip3 调用来实现: pip3 install -r requirements.txt && \ ### 随时可用的 VSCode 开发 使用 docker 在 VSCode 中开发非常方便。 如果想要在 docker IRIS 解决方案中使用嵌入式 Python 进行开发,VSCode 需要切换到 [Devcontainer 模式](https://code.visualstudio.com/docs/remote/containers)。 为此,将 [devcontainer.json 文件](https://github.com/intersystems-community/iris-embedded-python-template/blob/master/.devcontainer/devcontainer.json)添加到 .devcontainer 文件夹中。 该文件描述了需要使用的 docker 服务(本例中为 iris),这可以帮助在 VSCode 中运行 Python 脚本,这些脚本将由在容器中运行的 IRIS 使用的 Python 引擎提供服务。 devcontainer.json 文件还有一个部分,其中说明了需要在容器模式下使用哪些[扩展](https://github.com/intersystems-community/iris-embedded-python-template/blob/224be7f5bf80ea0f588f555c7f9e8c8d10c90c10/.devcontainer/devcontainer.json#L43): "extensions": [ "ms-python.python", "ms-python.vscode-pylance", "intersystems-community.vscode-objectscript", "intersystems.language-server", "intersystems-community.servermanager", "ms-vscode.docker" ], ### 通过 ZPM 安装嵌入式 Python 解决方案 此模板被设置为“ZPM 优先”开发仓库。 这意味着所有开发代码都已在 module.xml 中介绍,并且每次构建 docker 镜像时都作为 ZPM 模块安装,开发者每次编码时都在 iris.script 中使用[以下行](https://github.com/intersystems-community/iris-embedded-python-template/blob/224be7f5bf80ea0f588f555c7f9e8c8d10c90c10/iris.script#L13)开头: zpm "load /home/irisowner/irisbuild/ -v":1:1 ZPM 模块中还介绍了嵌入式 Python 代码,它通过 [FILECOPY](https://github.com/intersystems-community/iris-embedded-python-template/blob/224be7f5bf80ea0f588f555c7f9e8c8d10c90c10/module.xml#L11) 进行安装: <FileCopy Name="python/" Target="${libdir}python/"/> 此表达式表示,我们想要将所有 Python 脚本打包在仓库中的 /python 文件夹下,并将其安装在目标 IRIS 安装程序的 libdir 的 python/ 文件夹中。 如果将 Python 脚本复制到 ${libdir}python/ 文件夹下,则可以在目标 IRIS 机器中通过 ObjectScirpt 或 Python 对其进行导入调用。 _**注意: 确保您的文件夹名称唯一,以免意外替换其他 Python 代码。**_ 希望该模板对您有用。 欢迎提供反馈,尤其是拉取请求!
公告
Michael Lei · 八月 17, 2023

InterSystems 支持的平台更新 Q3-2023

我们经常收到有关 InterSystems IRIS 数据平台支持的平台和框架列表最近和即将发生的更改的问题。此更新旨在分享最近的变化以及我们对即将发生的变化的当前最佳知识,但预测未来是一件棘手的事情,这不应被视为承诺的路线图。 话虽如此,接下来是更新…… IRIS 生产环境操作系统和 CPU 架构 红帽Linux企业版RHEL 近期变动 RHEL 9.2 和 RHEL 8.8 于 2023 年 5 月发布。红帽计划为这些版本提供 4 年支持。 InterSystems 已通过我们称为“次要操作系统版本认证”的新流程完成了对 RHEL 9.2 和 RHEL 8.8 上的 IRIS 的额外测试,该流程旨在提供额外的安全性,确保次要操作系统更新不会破坏任何明显的功能。 RHEL 8.8 和 9.2 都成功通过了我们的测试。 随着 RHEL 9.2 的发布,红帽终止了对 RHEL 9.1 的公开支持。这与 Red Hat 自 RHEL 8.3 以来一直使用的“奇/偶”支持周期一致。 即将发生的变化 RHEL 9.3 计划于今年晚些时候推出。这将是 Red Hat 的短期支持版本,因此 InterSystems 不会执行次要操作系统认证或推荐将其用于生产部署。 之前的更新 IRIS 2022.1.2 添加了对RHEL 9.0的支持。 9.0 是一个主要操作系统版本,将 Linux 内核更新到 5.14、OpenSSL 更新到 3.0 以及 Python 3.9 IRIS 2022.2.0 删除了对 RHEL 7.x 的支持。早期版本的 IRIS 仍支持 RHEL 7.9。 进一步阅读: RHEL 发布页面 Ubuntu 近期变动 Ubuntu 分别于 2 月和 3 月发布了 22.04.2 LTS 和 20.04.6 LTS。 InterSystems 已通过次要操作系统版本认证,在 22.04.02 LTS 上完成了对 IRIS 的额外测试。 即将发生的变化 Ubuntu 的下一个主要更新是 24.04,预计将于 2024 年 4 月发布 之前的更新 IRIS 2022.1.1 添加了对Ubuntu 22.04 的支持。 22.04 是一个主要操作系统版本,将 Linux 内核更新到 5.15、OpenSSL 更新到 3.0.2 以及 Python 3.10.6 IRIS 2022.2.0 删除了对 Ubuntu 18.04 的支持。早期版本的 IRIS 仍支持 Ubuntu 18.04。 IRIS 2022.1.1 及更高版本容器基于 Ubuntu 22.04。 进一步阅读: Ubuntu 发布页面 SUSE Linux 即将发生的变化 SUSE Linux Enterprise Server 15 SP5 于 2023 年 6 月 20 日发布。SP5 包括 Linux Kernel 5.14.21、OpenSSL 3.0.8 和 Python 3.11。我们目前正在致力于次要操作系统认证。 之前的更新 IRIS 2022.3.0 添加了对SUSE Linux Enterprise Server 15 SP4的支持。 15 SP4 是一个主要操作系统版本,将 Linux 内核更新到 5.14、OpenSSL 更新到 3.0 以及 Python 3.9 SUSE 对 Linux Enterprise Server 15 SP3 的一般支持已于 2022 年 12 月 31 日结束,但扩展安全支持将持续到 2025 年 12 月。 延伸阅读: SUSE 生命周期 甲骨文Linux 即将发生的变化 Oracle 与 RHEL 9.2 几乎同时发布了 Oracle Linux 9.2,这让我们感到惊讶。我们目前正在开始次要操作系统认证。 之前的更新 IRIS 2022.3.0 增加了对Oracle Linux 9的支持。 Oracle Linux 9 是跟踪 RHEL 9 的主要操作系统版本,因此它也将 Linux 内核更新到 5.14、OpenSSL 更新到 3.0 以及 Python 3.9 进一步阅读: Oracle Linux 支持政策 微软Windows 即将发生的变化 Windows Server 2012 将于 2023 年 10 月结束扩展支持。如果您仍在该平台上运行,那么现在是计划迁移的时候了。 IRIS 2023.2+ 将不适用于Windows Server 2012。 之前的更新 自 IRIS 2022.1 中添加 Windows Server 2022 以来,我们没有对支持的 Windows 版本列表进行任何更改 延伸阅读: 微软生命周期 AIX 即将发生的变化 InterSystems 正在与 IBM 密切合作,增加对 OpenSSL 3.0 的支持。这不会包含在 IRIS 2023.2.0 中,因为 IBM 需要在进一步的 TL 版本中针对该功能。好消息是,IBM 正在寻求针对 AIX 7.2 和 7.3 发布 OpenSSL 3.0,而且时间看起来应该与 IRIS 2023.3 一致。 之前的更新 自 IRIS 2022.1 中添加 AIX 7.3 并删除 7.1 以来,我们没有对支持的 AIX 版本列表进行任何更改 延伸阅读: AIX 生命周期 容器Container 即将发生的变化 IRIS 容器将仅标记年份和版本,例如“2023.2”,而不是我们过去使用的完整版本号。这样,您的应用程序就可以默认获取您版本的最新维护版本。 我们还为最新的扩展维护和持续分发 IRIS 版本添加了“latest-em”和“latest-cd”标签。这些对于演示、示例和开发环境很有用。 我们还将开始使用“-preview”标记预览容器,以便清楚哪个容器是最新的 GA 版本。 之前的更新 我们现在正在发布 IRIS 容器的多架构清单。这意味着拉取标记为2022.3.0.606.0的 IRIS 容器将为您的计算机的 CPU 架构(Intel/AMD 或 ARM)下载正确的容器。 IRIS 开发环境操作系统和 CPU 架构 苹果系统 近期变动 我们在 IRIS 2023.1 中添加了对 MacOS 13 的支持 即将发生的变化 Apple 预计 MacOS 14 将于 9 月发布 GA,随后可能会在 IRIS 2024.1 中提供 IRIS 支持 CentOS 自 IRIS 2023.3 起,我们将取消对 CentOS/CentOS Stream 的支持。 红帽多年来一直在运行开发人员计划,该计划使开发人员能够获得非生产环境的免费许可证。鼓励当前使用 CentOS 的开发人员通过此计划切换到 RHEL。 CentOS Stream 现在是 RHEL 的“上游”,这意味着它具有 RHEL 中尚未包含的错误和功能。它还每天更新,这可能会给在平台上构建的开发人员带来问题(更不用说我们自己的测试人员了)。 自从我们在 IRIS 2022.1 中添加了对 CentOS 8-Stream 的支持并删除了对 CentOS 7.9 的支持以来,我们没有对受支持的 CentOS 版本列表进行任何更改 InterSystems组件 InterSystems Kubernetes 运营管理器 (IKO) IKO 3.6 于上周发布。 Caché & Ensemble 生产操作系统和 CPU 架构 之前的更新 Cache 2018.1.7 增加对 Windows 11 的支持 InterSystems 支持的平台文档 InterSystems 支持的平台文档是有关受支持技术的权威源信息。 IRIS 2023.1 支持的服务器平台 IRIS 2022.1 支持的服务器平台 IRIS 2021.1 支持的服务器平台 Caché & Ensemble 2018.1.7 支持的服务器平台 以上是全部。再次提醒大家,如果您还想了解更多信息,请告诉我们。
文章
Claire Zheng · 一月 30, 2023

如何将 InterSystems 认证添加到您的社区资料(Profile)中?

亲爱的社区开发者们, 有一些开发者已经通过了InterSystems 官方认证,并希望在个人资料头像上有一个漂亮的绿色标识 以及您社区中的所有证书,以便其他人更好地了解你的能力…… 那么,要将认证添加到您的社区资料中,您需要执行 3 个简单的步骤: 1️⃣ 打开社区个人主页(点击右上角头像即可) 2️⃣ 找到InterSystems 认证( InterSystems Certification) 3️⃣ 点击加载我的认证(Load my certification) 就这么简单! 系统将通过您社区关联的电子邮件将请求发送到 Credly。如果您的证书链接到同一电子邮件,您的证书将会自动加载: 如果没有,请按照页面上描述的详细步骤操作: 完成后,每个人都可以看到你的认证资质哦 ;) 预祝每位社区成员成功添加认证并通过!
文章
Kelly Huang · 七月 12, 2023

如何利用 InterSystems 开放交换工具进行快速 API 开发

在本文中,我将分享我们在 2023 年全球峰会技术交流室中提出的主题。我和@Rochael.Ribeiro 借此机会,我们就以下话题进行探讨: 用于快速 API 的开放交换工具 开放API规范 传统与快速 Api 开发 复合 API(互操作性) 规范优先或 API 优先方法 API 治理和监控 演示(视频) 用于快速 API 的开放交换工具 当我们谈论快速现代 API 开发(Rest / json)时,我们将使用两个 Intersystems Open Exchange 工具: 第一个是用于快速开发 API 的框架,我们将在本文中详细介绍。 https://openexchange.intersystems.com/package/IRIS-apiPub 第二种是使用 Swagger 作为用户界面,用于 IRIS 平台上开发的 Rest API 的规范和文档,以及它们的使用/执行。其运行的基础是开放 API 规范 (OAS) 标准,如下所述: https://openexchange.intersystems.com/package/iris-web-swagger-ui 什么是开放 API 规范 (OAS)? 它是全球范围内用于定义、记录和使用 API 的标准。在大多数情况下,API 甚至在实现之前就已经设计好了。我将在下一个主题中详细讨论它。 它很重要,因为它定义并记录了 Rest API 供其在提供者和消费者方面使用。但这种模式也有助于加快市场上工具(Rest API 客户端)的测试和 API 调用,例如 Swagger、Postman、Insomnia 等…… 使用 IRIS 发布 API 的传统方式 想象一下,我们必须从现有的 IRIS 方法构建并发布 Rest API(如下图)。 以传统方式: 1:我们必须考虑消费者会如何称呼它。例如:将使用哪个路径和动词以及如何响应。无论是 JSON 对象还是纯文本。 2:在 %CSP.REST 类中构建一个新方法,该方法将处理调用它的 http 请求。 3:处理方法对最终用户预期的 http 响应的响应。 4:考虑一下我们将如何提供成功代码以及我们将如何处理异常。 5:为我们的新方法绘制路线。 6:向最终用户提供API文档。我们可能会手动构建 OAS 内容。 7:例如,如果我们有一个请求或响应有效负载(对象),则实施时间将会增加,因为它也必须记录在 OAS 中。 我们怎样才能更快? 只需使用 [WebMethod] 属性标记 IRIS 方法即可。无论是什么,该框架都会使用 OAS 3.x 标准来处理其发布。 为什么 OAS 3.x 标准如此重要? 因为它还详细记录了输入和输出有效负载的所有属性。 这样,市场上的任何 Rest Client 工具都可以立即耦合到 API,例如 Insomnia、Postman、Swagger 等,并提供示例内容以便轻松调用它们。 使用 Swagger,我们已经可以可视化我们的 API(上图)并调用它。这对于测试也非常有用。 API定制 但是如果我需要自定义 API 该怎么办? 例如:我希望路径是其他东西,而不是方法的名称。我希望输入参数位于路径中,而不是像查询参数那样。 我们在方法之上定义了一个特定的符号,我们可以在其中补充方法本身不提供的元信息。 在此示例中,我们为 API 定义了另一条路径,并补充了信息,以便最终用户获得更友好的体验。 Rest API 的投影图 该框架支持多种类型的参数。 在此图中,我们可以突出显示复杂类型(对象)。它们将自动公开为 JSON 有效负载,并且每个属性都将为最终用户正确记录 (OAS)。 互操作性(复合 API) 通过支持复杂类型,您还可以公开互操作性服务。 这是构建复合 API 的有利场景,复合 API 使用多个外部组件(出站)的编排。 这意味着用作请求或响应的对象或消息将自动发布并由 swagger 等工具读取。 这是测试互操作性组件的绝佳方法,因为通常已经加载了有效负载模板,以便用户知道 API 使用哪些属性。 首先,开发人员可以专注于测试,然后通过定制来塑造 Api。 规范优先或 API 优先方法 当今广泛使用的另一个概念是在实现之前就定义 API。 有了这个框架,就可以导入 Open Api 规范。它自动创建方法结构(规范),只缺少它们的实现。 API 治理和监控 对于Api的治理,也建议一起使用IAM。 除了拥有多个插件之外,IAM 还可以通过 OAS 标准快速耦合到 API。 apiPub 为 API 提供额外的跟踪(参见演示视频) 演示 下载和文档 Intersystems 开放交换: https://openexchange.intersystems.com/?search=apiPub 完整文档:https: //github.com/devecchijr/apiPub @Claudio Devecchi 致敬原创作者
公告
jieliang liu · 二月 22

[视频] 加州大学戴维斯分校健康中心如何使用 InterSystems API Manager

嘿开发者, 观看此视频,了解 UC Davis Health 如何使用 InterSystems API Manager 来满足业务合作伙伴对访问自定义 API 和 FHIR API 的需求: ⏯加州大学戴维斯分校健康中心如何使用 InterSystems API Manager @ 2023 年全球峰会 🗣 演讲者:@Carl.Campbell4240,加州大学戴维斯分校健康中心高级集成工程师 订阅我们的 bilibili 频道InterSystems 中国以保持关注!
公告
Claire Zheng · 九月 11, 2023

InterSystems Supply Chain Orchestrator 和 InterSystems IRIS for Supply Chain 现已正式发布(GA)

InterSystems 很高兴地宣布InterSystems Supply Chain Orchestrator™的核心组件,即 InterSystems IRIS for Supply Chain 2023.1 版,现已正式发布 (GA)。 InterSystems Supply Chain Orchestrator (InterSystems 供应链协调器)基于 InterSystems IRIS® 构建,InterSystems IRIS® 是我们完整的云优先数据平台,支持智能数据编织(smart data fabric)架构,使构建和部署连接数据和应用程序孤岛的高性能、支持机器学习的应用程序变得更加容易。它将 InterSystems IRIS 的强大功能与供应链特定的加速器和框架结合在一起,为供应链编排、需求感知和预测、履行以及快速消费品重新包装提供优化的解决方案。 InterSystems Supply Chain Orchestrator 的一个关键组件是 InterSystems IRIS for Supply Chain,它使 InterSystems IRIS 提供的智能数据编织(smart data fabric)架构更接近供应链用例,并有助于加速实现价值。 *:需要 InterSystems IRIS 高级服务器 **:可通过 InterSystems Package Manager (IPM) 获取 功能亮点 InterSystems IRIS for Supply Chain 2023.1 在 InterSystems IRIS 的基础上提供以下功能: 可定制的供应链数据模型 内置分析cube KPI配置框架 问题生命周期管理 问题分析和可行见解 完整的 REST API 支持 文档和参考资料 产品文档: InterSystems IRIS for Supply Chain 2023.1 InterSystems 在线学习: supply chain learning path (供应链学习路径) InterSystems 概述: 供应链
公告
Michael Lei · 六月 2, 2022

InterSystems 正式发布 InterSystems IRIS, IRIS for Health, & HealthShare Health Connect 2022.1

InterSystems 正式发布 InterSystems IRIS, IRIS for Health, & HealthShare Health Connect 2022.1 InterSystems很高兴地宣布,InterSystems IRIS数据平台、InterSystems IRIS for Health和HealthShare Health Connect的2022.1版本现在已经发布(GA)。 发布亮点 平台更新 InterSystems IRIS 数据平台 2022.1 扩大了包括以下新的和更新的操作系统的生产环境支持:: Windows Server 2022 Windows 11 AIX 7.3 Oracle Linux 8 我们也很高兴地宣布我们同时支持用于开发环境的MacOS 12 (Monterey)的苹果 M1 和 Intel 芯片集。 更好开发 嵌入式Python – 在IRIS内部使用 Python 和 ObjectScript 互操作适配器- Kafka, AWS S3, AWS SNS 和 CloudWatch 重新设计了Production Extensions(PEX)的用户体验 速度、扩展与安全 在线数据分片再平衡Online Shard Rebalancing 自适应SQL Journal & Stream 压缩 针对邮件支持TLS 1.3 和 OAuth 2 分析能力与AI SQL Loader加载器 InterSystems Reports 部署优化 关于所有这些功能的更多细节可以在产品文档中找到: InterSystems IRIS 2022.1 documentation 和 release notes InterSystems IRIS for Health 2022.1 documentation 和 release notes HealthShare Health Connect 2022.1 documentation 和 release note 如何获得软件 软件可以通过传统安装包和容器镜像两种形式获得。 关于可用的安装包和容器镜像的完整列表,请参考 Supported Platforms document. 每个产品的完整安装包可以通过WRC网站Software Distribution page 获取. 使用自定义安装选项,你可以选择你需要的选项,如InterSystems Studio和IntegratedML,以合理化安装范围。 InterSystems IRIS 、 IRIS for Health医疗版和所有相应部件的企业版 容器镜像可以通过以下命令从 InterSystems Container Registry 获得: docker pull containers.intersystems.com/intersystems/iris:2022.1.0.209.0 docker pull containers.intersystems.com/intersystems/irishealth:2022.1.0.209.0 docker pull containers.intersystems.com/intersystems/iris-arm64:2022.1.0.209.0 docker pull containers.intersystems.com/intersystems/irishealth-arm64:2022.1.0.209.0 docker pull containers.intersystems.com/intersystems/iris-ml:2022.1.0.209.0 docker pull containers.intersystems.com/intersystems/iris-ml-arm64:2022.1.0.209.0 可用镜像的完整列表,请参考 the ICR documentation. 社区版 容器镜像也可以通过以下命令从 InterSystems Container Registry 获得: docker pull containers.intersystems.com/intersystems/iris-community:2022.1.0.209.0 docker pull containers.intersystems.com/intersystems/irishealth-community:2022.1.0.209.0 docker pull containers.intersystems.com/intersystems/iris-community-arm64:2022.1.0.209.0 docker pull containers.intersystems.com/intersystems/irishealth-community-arm64:2022.1.0.209.0 docker pull containers.intersystems.com/intersystems/iris-ml-community:2022.1.0.209.0 docker pull containers.intersystems.com/intersystems/iris-ml-community-arm64:2022.1.0.209.0 InterSystems IRIS Studio 2022.1是一个独立的IDE,用于Microsoft Windows,可以通过WRC的组件下载页面下载。它与InterSystems IRIS和IRIS for Health 2022.1及以下版本一起使用。InterSystems还支持VSCode-ObjectScript插件,用于用Visual Studio Code为InterSystems IRIS开发应用程序,该插件可用于Microsoft Windows、Linux和MacOS。 我们在主要云市场上的相应列表将在未来几天内更新。 这个版本的版本号是2022.1.0.209.0。 InterSystems IRIS Studio 2022.1 是一个独立的IDE,用于Microsoft Windows,可以通过WRC的组件下载页面 下载。它支持InterSystems IRIS和IRIS for Health 2022.1及以下版本。InterSystems还支持VSCode-ObjectScript 插件,用于使用Visual Studio Code开发InterSystems IRIS应用程序,该插件可用于Microsoft Windows、Linux和MacOS。 我们在主要云市场上的相应列表将在未来几天内更新。 这个版本的版本号是2022.1.0.209.0。
公告
Michael Lei · 五月 11, 2022

InterSystems Kubernetes Operator 3.3 发布!

InterSystems Kubernetes Operation(IKO)3.3版现已通过WRC下载页面和InterSystems容器注册中心提供。IKO通过提供一个易于使用的irisCluster资源定义,简化了在Kubernetes中使用InterSystems IRIS或InterSystems IRIS for Health的工作。完整的功能清单见IKO文档,包括轻松的分片、镜像和ECP的配置。 IKO 3.3 亮点: 支持InterSystems IRIS和InterSystems IRIS for Health 2021.2 以及 2022.1版本 支持 Kuberentes 1.21 将常见的系统警报和监控(SAM)配置作为irisCluster的一部分进行部署 InterSystems API Manager(IAM)现在也可以作为 irisCluster的一部分进行部署和管理 自动标记Mirror对的活跃端,因此服务可以始终指向激活的镜像成员
公告
Claire Zheng · 十一月 11, 2021

InterSystems开发者竞赛:安全

亲爱的社区开发者们,大家好! 欢迎积极参与新一轮InterSystems开发者竞赛! 🏆 InterSystems开发者竞赛:安全 🏆 竞赛时间: 2021年11月15日-12月5日 奖金总额: $9,450! 奖项设置 1. 专家提名奖(Experts Nomination)- 获奖者由我们特别挑选的专家团选出: 🥇 第一名 - $4,000 🥈 第二名 - $2,000 🥉 第三名 - $1,000 🌟 第四名-第十名 - $100 2. 社区提名奖(Community Nomination)- 获得总投票数最多的应用: 🥇 第一名 - $1,000 🥈 第二名 - $500 🥉 第三名 - $250 如果同时多位参赛者获得同样的票数,均被视为优胜者,将平分奖金 谁可以参加? 任何开发者社区的成员均可参加,InterSystems内部员工除外(InterSystems contractor员工可以参加)。还没有账号?现在来建一个! 👥 开发者可以组团 创建一个协作应用程序,组团限定人数为2-5人。 请注意,要在您的README文件中标注您的团队成员——社区用户profile 参赛时间安排 🛠 11月15日 - 28日: 应用开发、提交阶段 ✅ 11月29日 - 12月05日: 投票阶段 注意:在整个参赛期间(开发与投票期间),开发者可持续编辑、提升其应用 主题 在这次安全竞赛中,我们鼓励开发人员分享展示如何执行与InterSystems IRIS和InterSystems医疗版相关的安全任务的解决方案。我们邀请您贡献一些应用程序,这些应用程序将揭示与InterSystems安全模型(Security Model)的认证和授权部分相关的任务。 这些任务可以是: OAuth与OpenID SAML / LDAP身份验证实现。​ PKI 的实现 REST API某些部分的访问管理:应用程序级安全、角色/用户级安全。 对数据的访问管理:对数据库、表、列或行级别的访问。 对互操作性组件的访问 访问IRIS BI组件:cubes,枢轴,仪表板等。 授权(用户、角色、资源)和认证(OAuth)设置的DevOps问题。 与身份验证和授权相关的开发人员和支持工具。 你的奇思妙想! 要求: 有效应用程序:100%全新的Open Exchange Apps或已有的应用程序(但有显著提升)。所有参赛者/团队提交的应用程序只有经过我们团队的审核之后才会被批准参赛。 该应用可以在 IRIS Community Edition or IRIS for Health Community Edition or IRIS Advanced Analytics Community Edition 上运行。 该应用需开源并在GitHub上发布。 该应用的README文件应为英文,包含安装步骤,并包含视频demo或/和应用程序如何运行的描述。 资源助力 1. InterSystems IRIS初学者: Build a Server-Side Application with InterSystems IRIS Learning Path for beginners 2. ObjectScript Package Manager (ZPM)的初学者: How to Build, Test and Publish ZPM Package with REST Application for InterSystems IRIS Package First Development Approach with InterSystems IRIS and ZPM 3. 如何将您的APP提交给大赛 如何在InterSystems Open Exchange上发布应用程序 如何把参赛APP提交给大赛 4. 文档、课程和视频: Security Documentation Course: InterSystems Security Basics Video: Active Directory Integration with LDAP Video: Configuring a Web Server for IIS for Better Performance and Security Video: Webinar: Securing the Management Portal Video: Advances in Security Article: Building an FHIR Repository + OAuth2 Authorization Server/Resource Server Configuration on IRIS for Health Part 1 Article: InterSystems IRIS Open Authorization Framework (OAuth 2.0) implementation - part 1 Article: Protect your REST API applying OWASP Top Ten 参赛评比 投票规则即将发布,敬请期待! So! 期待您的精彩提交!加入我们的编程马拉松,赢取大奖。 ❗️ 点击此处,查看 官方竞赛条款解读.❗️
问题
Michael Lei · 七月 8, 2022

Intersystems IRIS 上使用JAVA

我现在在使用object script。如果把代码从 objectscript转成 Java 我需要做些什么? 可以参考官方文档:https://gettingstarted.intersystems.com/language-quickstarts/java-quickstart/