文章 Louis Lu · 十二月 25, 2024 2m read

IRIS 2024.2 版本包含一项变更(DP-432503),该变更要求Web Gateway最初连接到 IRIS 时所使用的用户(通常是 CSPSystem)必须对承载 REST web applicatioon 的dispatch类的数据库具备 READ 权限。

在不满足该条件的情况下,就会引发一个错误,这会向调用者返回一个 HTTP 404 状态码,而非预期的 HTTP 401 状态码。

显然,这个问题将在 2024.3 版本中修复,参考编号为 DP-432898 / ALI048:REST 登录端点将返回 401 HTTP 错误码而非 404,但作为持续交付(CD)版本,2024.2 不会获得维护版本修正。

解决方法是让 CSPSystem 用户对安装WebTerminal所在命名空间的数据库具备读权限。

下面是所需的步骤:

1. 创建一个新的资源 “%DB_WEBTERMINAL”,并设置 “WEBTERMINAL” 数据库使用该资源,而非 “%DB_% DEFAULT”。

2. 创建一个名为 “% DB_WEBTERMINAL” 的角色,该角色能让角色持有者对 “% DB_WEBTERMINAL” 资源具有读写(RW)访问权限。

3. 再创建另一个角色(我将其命名为 “DBread_WEBTERMINAL”),该角色仅赋予角色持有者对该资源的读(R)访问权限。

4.

2
0 161
文章 Louis Lu · 十二月 24, 2024 1m read

Web Terminal 已经存在相当长一段时间了,但它存在诸多限制,并非所有功能都能正常使用。它不支持 shell,也没有诸如嵌入式 Python 支持这样的最新功能。对于那些需要编程模式的工具来说,存在一些问题。基本身份验证也不如简单的登录页面便捷,使用登录页面的话,倘若你想要改变登录应用程序的方式(比如使用单点登录,即 SSO),你还可以自行添加登录页面。

通过将最初的iris terminal 封装到一个网页表单中,利用在网络领域应用极为广泛且同样被像 Visual Studio Code(VSCode)这类工具所使用的 xterm.js,并借助 Python 施展的一些 “魔法”(这些 “魔法” 有助于实现进程间的终端交互),我们就能在网络上完整地实现终端功能了。

安装方法

zn "%SYS"
zpm "install iterm"

iTerm

为了测试它是如何在web中工作的,可以执行 term routine,如下

iTerm

0
0 148
文章 Louis Lu · 十二月 24, 2024 1m read

现有一个数据表的数据像这样:

我们的需求是基于表中的Item列新增一个status字段,如果item的内容是第一次出现,那么status列就是New,反之显示Old,

比如,应该是下面的显示内容

 

在原文章的回复中, Robert Cemper给出了下面的建议

新建一个存储过程,并在SELECT查询语句中生效:

/// Return NEW for first occurance of item 
/// otherwise return OLD
Class User.ItemStat Extends %RegisteredObject
{
ClassMethod NewOld(item As %String = "") As %String [ SqlProc ]
{
    if item="" quit "?
0
0 88
文章 Louis Lu · 十一月 22, 2024 1m read

当我们将 InterSystems IRIS 安装在Windows 系列操作系统中时,往往同时使用IIS 作为其Web 服务器。

但这时候我们却发现,由RESTful返回的错误信息却不能正常显示出来了,特别是在调试程序的时候,非常不方便。

比如在测试 FHIR Post/Put 请求时,我们的请求消息体中包含不正确的内容,这时我可以看到返回的是HTTP 400 Bad Request的返回内容.

我无法具体知道请求消息体哪句出错了,这对我调试程序造成很大困扰。

 

解决方法:

1. 打开IIS的管理页面,双击 错误页

2. 选择右侧 编辑功能设置

3. 选择错误响应下的 详细错误 选项。

我们再次请求,此时可以看到页面上显示了详细的错误信息

相关详细信息可以查看文档:Configuring IIS to Return SOAP Fault Details 以及 HTTP Errors

0
0 180
文章 Louis Lu · 十月 8, 2024 5m read

挑战

在使用FHIR进行开发的过程中,我们会面对海量的FHIR规范中定义的数据结构,具体来说在FHIR规范中定义了超过150个资源、700多个资源内元素。每个定义里都包括了对自身结构的描述以及数据约束、数据绑定值集等。对于一个开发人员要记住这些内容非常困难。

同时FHIR数据,特别是Json格式的FHIR数据是典型的“有向图”结构,它的资源中嵌套元素定义、集合以及复杂的资源间“关系”,在这些复杂结构的数据间导航并操作,非常困难。

解决方案

在InterSystems IRIS for Health 2024.1之前,我们会将FHIR数据以Json文档的方式载入 %DynamicAbstractObject,例如下面的代码

   set dynObject1 = ##class(%DynamicObject).%New()
   set dynObject1.SomeNumber = 42
   set dynObject1.SomeString = "a string"
   set dynObject1.SomeArray = ##class(%DynamicArray).%New()
   set dynObject1.SomeArray."0" = "an array element"
   set dynObject1.SomeArray.
0
0 239
文章 Louis Lu · 九月 2, 2024 2m read

当进程中的数据不需要持久化保存,但又需要用到global的高性能特性时,我们常常将数据保存在临时global中,也就是保存在IRISTEMP/CACHETEMP数据库中。

系统使用 IRISTEMP/CACHETEMP 数据库保存临时的数据,用户也可以进行同样的操作。

关于临时global以及IRISTEMP数据库的更多内容,可以参见文档 Temporary Globals and the IRISTEMP Database

以下情况global作为临时使用:

  1. 系统临时global (^IRIS.
0
0 138
文章 Louis Lu · 八月 6, 2024 4m read

在使用 InterSystems ObjectScript 进行编程时,当你定义了属性property、查询query或者索引index,系统会在编译的过程中自动创建与之相关的一些方法,这篇文章对这些方法做了些总结:

 

属性Properties

1. 假设你定义了一个属性 Property, 下面的方法会被自动创建

ClassMethod PropertyGetStored(id)

对于数据类型属性,这个函数将返回其逻辑值,对于对象属性,返回id。这是一个对类global数据的封装,也是获取单例属性值(singular property value)最快的方法。此方法仅适用于已持久化存储的属性。

这里是一段采用多种方法读取数据的对比代码,用于测试各种访问数据方式的时间差异,其结果是:

Iterations: 10000
Object access: .130111
GetStored access: .014388
SQL access: .020268
Global access: .007717
Object access takes 904.30% of GetStored time
Object access takes 641.95% of SQL time
Object access takes 1686.
0
0 105
文章 Louis Lu · 七月 1, 2024 2m read

在 OEX 最近一次编程竞赛之后,我有一些令人惊讶的发现。
几乎所有的应用程序都是基于人工智能与预制 Python 模块的结合。
但深入研究后发现,所有示例都使用了 IRIS 的相同技术组件。

从 IRIS 的角度来看,无论是搜索文本还是搜索图像或其他模式都是一样的。 其底层基本都是一样的。

          这让我想起了我家里的情况。我的妻子和女儿对家里的大量裙子、衬衫和其他衣服的信息进行了整理。
          但无论如何进行整理、分类、归档,我依然通过和我的妻子和女儿说话,来确定我的穿着。
           无论怎样包装,其结果都是如此。

回到这次竞赛比赛:
同样的 IRIS 技术内容,却有很多花哨的包装。
每个人都在同一条高速公路上奔跑。没有人提到它有什么限制。

于是我试着深入挖掘,找出新数据类型 VECTOR 的使用限制。
所有向量都有两个基本参数
  - 静态 DATATYPE:"整型integer"(或 "int")、"double"、"十进制decimal"、"字符串 "和 "时间戳"。
  - 半动态 LEN(gth): > 0 通常也称为 POSITION;纯整数。

这个 LEN/POSITION 参数就相当于vector的数学维度。
当然,在爱因斯坦的宇宙中,根据他的相对论,你可能只需要 4 个维度或更少。
即使是 60 年代提出的宇宙弦理论也没有超过 11.

0
0 127
文章 Louis Lu · 七月 1, 2024 4m read

迄今为止,我看到的大多数使用向量vector的示例,将它只作为 SQL 中的一种功能,尤其是围绕 VECTOR_Search 的 3 个函数。
* TO_VECTOR()
* vector_dot_product ()
* vector_cosine ()

iris-vector-search 演示包中隐藏着一个非常有用的摘要。
从那里,你可以通过多个链接找到所需的一切。

我还缺少更多的 VECTOR 方法,于是在 Idea Portal 上提出了相关请求。

接着,我想起每个 SQL 方法或存储过程都有一堆 ObjectScript 代码。
于是我开始搜索,下面就是我的研究的一些总结:

%Library.Vector 是对新数据类型的核心描述
      这是一种复杂的结构,就像对象或 %DynamicObjects 或 $Bit Expressions 一样,需要特定的方式去访问。
我们还可以看到 2 个必备参数: 
      * DATATTYPE - 一旦设置就不能更改。 可接受的类型:  "整数integer"(或 "int")、"双精度浮点double"、"十进制decimal"、"字符串 "和 "时间戳"。
      * LEN >0 时,可以增长,但绝对不能缩小

$vector() / $ve() 是矢量访问的基本方法
      * 设置矢量数据 >>> SET $VE(. . .

0
0 138
文章 Louis Lu · 六月 30, 2024 1m read

你可以使用List query 对 %SYS.Audit 查询审计日志,代码如下:

 Set statement=##class(%SQL.Statement).%New()  
 Set status=statement.%PrepareClassQuery("%SYS.Audit","List")
 Set rs=statement.%Execute()  
 Set tab = $char(9)
 While rs.%Next() {    
   Write rs.%Get("TimeStamp")_tab_rs.%Get("Event")_tab_rs.%Get("Username"),!      
 }
0
0 99
文章 Louis Lu · 六月 11, 2024 8m read

这篇文章介绍了使用由支持 langchain 框架的IRIS来实现问答聊天机器人,其重点介绍了检索增强生成(RAG)。

文章探讨了IRIS中的向量搜索如何在langchain-iris中完成数据的存储、检索和语义搜索,从而实现对用户查询的精确、快速的响应。通过无缝集成以及索引和检索/生成等流程,由IRIS驱动的RAG应用程序使InterSystems开发者能够利用GenAI系统的能力。

为了帮助读者巩固这些概念,文章提供了Jupyter notebook一个完整的问答聊天机器人应用程序,以供参考。

什么是RAG以及它在问答聊天机器人中的角色

RAG,即检索增强生成,是一种通过整合超出初始训练集的补充数据来丰富语言模型(LLM)知识库的技术。尽管LLM在跨不同主题进行推理方面具有能力,但它们仅限于在特定截止日期之前训练的公共数据。为了使AI应用程序能够有效处理私有或更近期的数据,RAG通过按需补充特定信息来增强模型的知识。这是一种替代微调LLM的方法,微调可能会很昂贵。

在问答聊天机器人领域,RAG在处理非结构化数据查询中发挥着关键作用,包括两个主要组成部分:索引和检索/生成。

索引从数据源摄取数据开始,然后将其分割成更小、更易于管理的块以进行高效处理。这些分割的块随后被存储和索引,通常使用嵌入模型和向量数据库,确保在运行时能够快速准确地检索。

0
0 440
文章 Louis Lu · 六月 10, 2024 2m read

列式存储是 InterSystems IRIS 提供的一项较新的技术。与传统的基于行的存储不同,它通过将数据存储在列而不是行中来优化查询处理,从而实现更快的访问和检索相关信息。

 

下面是使用SQL创建此类表的例子

CREATE TABLE table (column1 type1, column2 type2, column3 type3) WITH STORAGETYPE = COLUMNAR  -- ex 1
CREATE TABLE table (column1 type1, column2 type2, column3 type3 WITH STORAGETYPE = COLUMNAR)  -- ex 2

我们知道InterSystems IRIS 是支持多模型的DMBS, 它可以无缝的通过关系型或对象的方式访问通一数据,

我们使用下面的方式在使用Object Script类定义的时候定义列存储:

1. 如果你想对类中的所有属性都定义为列存储,则直接通过在类中添加parameter 的方式实现:

Parameter STORAGEDEFAULT = "columnar" 

如前面的例子,我们使用object script定义就会是这样:

Class Post.
0
0 201
文章 Louis Lu · 四月 23, 2024 2m read

当我们在设计一个需要重复使用的BP时候,往往需要开发一个可配置<call>的对象的组件,我们将call的target 设置为

@process.TargetConfigName

即可实现。

下面是完整代码:

Property TargetConfigName As Ens.DataType.ConfigName;Parameter
SETTINGS = "TargetConfigName:Basic";
/// BPL Definition
XData BPL [ XMLNamespace = "http://www.intersystems.com/bpl" ]
{
<process language='objectscript' request='Ens.Request' response='Ens.Response' height='2000' width='2000' >
<sequence xend='200' yend='450' >
<call name='Call configurable target' target='@process.TargetConfigName' async='1' xpos='200' ypos='250' >
<request type='Ens.
0
0 135
文章 Louis Lu · 一月 28, 2024 2m read

这里介绍三个SQL函数 JSON_ARRAY 、 JSON_OBJECT和JSON_ARRAYAGG,可以直接通过SQL语句返回JSON格式数据

1. JSON_ARRAY 函数通过逗号(,)分割的多个表达式,返回JSON array格式的数据

SELECT TOP 3 Name,
JSON_ARRAY(%ID,%TABLENAME,UCASE(Name),Age,Home_State) "JSON data" 
FROM Sample.Person

也可以忽略空值(null) ,添加“ABSENT ON NULL”

SELECT TOP 3 Name,
JSON_ARRAY(%ID,%TABLENAME,UCASE(Name),Age,Home_State ABSENT ON NULL) "JSON data" 
FROM Sample.Person

获取到的返回结果

如果想显示空值(null),使用"NULL ON NULL",如果没有特意标明,则该设置为默认值。

下面语句获取客户所有电话号码,并以JSON array格式返回:

SELECT JSON_ARRAY(HomePhone,WorkPhone,Mobile) "JSON data"
FROM Test.Phones
["055-8263371","052-4957286","054-4951066"]

 

2.

0
0 282
文章 Louis Lu · 十二月 24, 2023 2m read

在此文章中将分享,当使用InterSystems IRIS 做后端时如何接收并保存通过POST方式发送过来的 Base64文件。

前后端之间传输文件,我认为较简单的方式是:前端将文件转为Base64格式,调用POST方法并将Base64内容附加在JSON消息中的一个参数中,在JSON消息中的另一个参数可以是文件名,比如消息定义如下:

{
    "fileData": "JVBERi0xLjQKJdPr6eEKMSAwIG...",
    "fileName": "example.pdf"
}

在IRIS中,可以定义一个web application用于处理POST请求,同时定义一个分派类继承于%CSP.REST,在类中定义一个方法,具体保存文件。

代码示例:

ClassMethod SaveFile() As %Status
{
    Try {
        Do ##class(%REST.Impl).%SetContentType("application/json")
        If '##class(%REST.Impl).%CheckAccepts("application/json") Do ##class(%REST.Impl).%ReportRESTError
0
0 265
文章 Louis Lu · 十月 19, 2023 3m read

对于经常进行插入、删除操作的表,位图索引的存储往往会变得不那么高效。

例如,下面定义的表,经常进行大数量的删除操作 (TRUNCATE TABLE)

Class MyWork.MonthData Extends (%Persistent, %Populate)
{
    /// Level of satisfaction
    Property Satisfaction As %String(VALUELIST = ",満足,やや満足,やや不満,不満,");
    /// Age
    Property Age As %Integer(MAXVAL = 70, MINVAL = 20);

    Index AgeIdx On Age [ Type = bitmap ];
}

对该表进行插入操作后,索引表存储的内容为:

【INSERT】
^MyWork.MonthDataI("AgeIdx",20,1) = $zwc(401,120,4,75,102,10,<omit> 958)/*$bit(5,76,103,107・・・
^MyWork.MonthDataI("AgeIdx",21,1) = $zwc(407,121,29,178,251,2<omit>,732,772,898,960)/*$bit(3・・・
^MyWork.
0
0 106
文章 Louis Lu · 十月 19, 2023 1m read

使用(^GLOBUFF )可以获取到使用的数据库缓存global buff的大小,

可以直接执行这个命令或者通过代码的方式获取结果

下面是执行命令的方式:

USER>zn "%SYS"
%SYS>do ^GLOBUFF
Find which globals are using the most buffers.
 
Display the top <25>:     → Press Enter  // Default is to display top 25 globals
Total buffers: 102400     Buffers in use: 6926     PPG buffers: 77 (1.112%)   // Global name, database name, percentage occupied by the buffer
Item  Global                             Database          Percentage (Count)
1     oddDEF                             IRISLIB              34.
0
0 132
文章 Louis Lu · 八月 30, 2023 1m read

大家可以通过InterSystems IRIS 管理门户SMP查看当前数据库剩余空间,路径是 Management Portal: System Operation > Database

当然大家也可以通过下面的代码查看数据库的可用磁盘空间:

 /// ZISJ.mac
 Set stmt=##class(%SQL.Statement).%New()
 Set status=stmt.%PrepareClassQuery("SYS.Database","FreeSpace")
 Set rs=stmt.%Execute()
 While rs.%Next() {
   Write !
   For i=1:1:9 {
     Write rs.%GetData(i),","
   }
 } 
0
0 134
文章 Louis Lu · 六月 12, 2023 2m read

文章相关视频参见Synthea生成FHIR测试数据,以及FHIR服务器加载FHIR资源文件

1. 什么是Synthea

Synthea是一个开源软件包,可以模拟生成患者就诊数据。他的github地址在这里

生成的就诊模版从最初的模拟美国前十种常见病、前十种慢性病到现今超过90种不同的模型。详细模型参见这里

基于当前版本,Synthea的特性包括:

  • 从出生到死亡的全生命周期
  • 可配置的人口统计学信息(默认为美国马萨诸塞州人口普查数据)
  • 模块化规则系统
    • 插入通用模块
    • 用于附加功能的自定义 Java 规则模块
  • 主要医疗事件就诊、急诊室就诊和症状驱动的就诊
  • 症状、 过敏、药品、 疫苗接种、观察/生命体征、实验室、处置、 护理计划
  • 支持格式
    • HL7 FHIR(R4、STU3 v3.0.1 和 DSTU2 v1.0.2)
    • ndjson 格式的批量 FHIR(设置 exporter.fhir.bulk_data = true 以激活)
    • C-CDA (设置 exporter.ccda.export = true 以激活)
    • CSV (设置 exporter.csv.export = true 以激活)
    • CPCDS (设置 exporter.cpcds.
0
1 442
文章 Louis Lu · 三月 31, 2023 2m read

当我在Docker容器上构建IRIS服务器时,由于升级Docker版本,发现我构建的IRIS服务器消失了。

基于这个经历,这篇文章展示如何在升级平台或docker之前为IRIS服务器做一个备份,以及在新环境中重建IRIS的过程。

IRIS服务器备份过程

完成IRIS服务器的构建后,需要进行备份。

特别是在升级之前建议做一个备份,尤其当有自定义类、routine或者 global时。

下文中的“{}”代表输入参数

  1. 导出用户定义

导出IRIS服务器中所有用户定义:

zn "%SYS"
write ##class(Security.Users).Export({输出完整路径文件名})
  1. 导出application定义
zn "%SYS"
write ##class(Security.Applications).Export({输出完整路径文件名})
  1. 停止IRIS
iris stop {iris运行实例名称}
  1. 备份iris.cpf

Iris.cpf存放于iris安装目录下,比如 /usr/irissys/iris.cpf

  1. 备份所有的数据库文件

建议卸除数据库后,备份所有的数据库文件所在的文件夹

  1. 启动IRIS
iris start {iris 实例名称}

服务器重建过程

如果重新安装IRIS服务器,则必须使用与备份时相同的配置重新构建它。

  1. 使用与原系统相同的配置部署数据库。
0
0 389
文章 Louis Lu · 一月 19, 2023 4m read

您可能还记得在 InterSystems 2022年全球峰会以及 2022.2 版本发布的网络研讨会上,我们发布了一项令人兴奋的新功能——列存储,它可以纳入您 InterSystems IRIS 的解决方案中。 列存储引入了一种存储SQL表数据的替代方法,它为分析查询提供了数量级的加速。 最新的2022.3开发预览版在原有的基础上包括一系列我们认为值得在这里宣布的更新。

快速回顾

如果您不熟悉InterSystems IRIS 的列存储,请观看这段简短的介绍视频以及相关该主题的2022全球峰会内容。 简而言之,我们使用新的$vector数据类型将表数据编码为每列 64k 个值的块。 $vector是一种仅限内部使用的数据类型(目前),它利用自适应编码方案来实现稀疏和密集数据的高效存储。 编码还针对一系列专用$vector操作进行了优化,例如一次计算64k 值的整个块的聚合、分组和过滤,并在可能的情况下利用芯片的SIMD指令

在SQL查询时,我们构建对这些块直接进行操作的查询计划,正如您所想象的,与传统的逐行处理相比,这大大减少了执行查询所需的IO量和ObjectScript指令数。 当然,与面向行且对于单值的操作相比,这个的IO消耗更大,$vector的操作也更重一些,但收益是巨大的。

0
0 204
文章 Louis Lu · 一月 19, 2023 11m read

 

这篇文章主要介绍 HL7 V2.5.1 标准是如何定义查询类请求,以及查询类响应的。相关HL7 V2 的更多基础知识可以参考:HL7v2到底是什么?! 的一系列文章。

1     查询标准的发展

1.1  最早的查询模式

最初,HL7的查询参数通过QRD以及QFR 字段传入。因为这两个字段的设计是为了满足所有的查询需求,所以这两个字段的定义非常随意。

1.2  加强的查询模式

从HL7 V2.3开始,引入了加强版的查询模式,它包含了四种方式:

•      嵌入式查询语言类请求查询:自由格式的select SQL语句

•      虚拟表类请求查询:基于特定的select 条件查询服务端的数据库表

•      存储过程类请求查询:执行服务端的存储过程返回数据

•      事件类请求查询:返回基于特定事件的查询结果

1.3  基于2.4 版本的查询

HL 7 v2.3.1之后的版本更清晰地将请求查询的方式与返回查询数据的方式分开,并且强调了“符合性声明”的存在。 HL 7继续支持存储过程、事件查询和虚拟表查询的语义,但推荐使用新的查询方式,即按参数查询(QBP),使语法更清晰。

QBP查询的目的是在一个精确的一致性声明的框架内统一存储过程、事件和虚拟表查询的语义。

同时该标准仍可以继续使用最初模式查询(QRD/QRF),但使用新的查询形式可以更清楚地解释其语义

0
0 1062
文章 Louis Lu · 九月 21, 2022 2m read

我在这里和大家分享下在  Interoperability 的接口开发中,调用Web Service接口的几个超时参数的设置经验。 

赶时间的同学可以直接拉到文章最下面看结论就好。

1.实验过程

首先我设计了一个Web service的服务器端,强制在接收到请求后 8s 返回结果。

在客户端我设置了响应超时7s, 重试间隔5s, 故障超时23s,如图:

在客户端、服务器端均设置了SOAP Log 记录接收和发送的内容

set ^ISCSOAP("Log")="io"
set ^ISCSOAP("LogFile")="c:\temp\soapClient.txt"

经过整理日志我画了下面的数据流图

 

2. 得出下面结论

  • *1:重试间隔虽然设置为5s,但是仅当有响应超时错误后才会被触发
  • *2:虽然服务器端有返回值,但是已经超过了设定的响应超时(7s)时间,则返回值不会被客户端接收
  • *3:故障超时虽然设置为23s,但是仅当有响应超时错误后才会被触发

3. 结论再验证

为了验证上面结论我修改了Web service的服务器端代码,强制在接收到请求后 23s 返回结果,

并且设置响应超时20s, 重试间隔6s, 故障超时25s,得出上面同样的结论:自动重发或者故障超时错误的触发条件都是收到响应超时错误

1
0 192
文章 Louis Lu · 九月 5, 2022 3m read

原文可见 这里,原作者 Robert Cemper

我们在SQL中的经常被提到视图VIEW,基本上是一段预先设计好的SQL语句,它也像任何其他SQL查询语句一样执行和组装。

而物化视图MATERIALIZED VIEW意味着查询的内容是预先收集的,这些数据可以相当快地进行检索。

我第一次看到这个概念是和我最喜欢的竞争对手O* 一起的,他们对此功能发出了很多的声音。

然而在Caché/IRIS中,这种功能几乎是一早就存在的,我们认为这是很正常的普通功能。只是我们大多数开发人员只是没有意识到这一点,只要稍加润色,它就可以作为一个优秀的特性呈现出来。 此外,任何更新和维护都是作为内置的能力进行的,无需开发人员任何额外的工作。

看下面的例子:

在我们的Sample.Person类中,我们可以定义一个索引

/// Define an index for <property>Name</property>.
Index NameIDX On Name [ Data = (Name, Home.State, SSN) ];

正如我们预想的那样,在执行下面的查询时,它会非常的快

SELECT ID, Name, Home_State, SSN   from Sample.Person

因为这个查询所涉及到的内容都来来自索引global ^Sample.

0
0 256
文章 Louis Lu · 四月 9, 2022 2m read

注意:下面内存设置数值仅限参考,具体内存数值的设置是否合适,依赖于更多实际使用情况决定。

主要需要设置下面几个内存相关配置:

(下面比例适用于服务器仅运行单实例InterSystems IRIS)
数据库缓存Database cache:
    建议小于64G内存设置总内存50%,大于等于64G内存设置70%总内存
程序缓存routine cache:
    建议设置1023MB
gmheap:
    建议设置1048576KB(1024MB)
LockSize:
    建议最少设置134217728 Bytes (128MB),如果在系统日志中提示locksize相关错误或警报,应相应增加。

如果在一台服务器上安装了多个InterSystems IRIS 实例,那么要保证 所有InterSystems IRIS 运行实例的 Shared memory(database cache + routine cache + gmheap) 总值小于 Hugepage设定的值

hugePages
    建议设置值大于系统所有InterSystems IRIS 运行实例的 Shared memory(database cache + routine cache + gmheap) 总值再往上取整+1G。之后监控cache efficiency 调整设置大小。

0
0 196
文章 Louis Lu · 四月 9, 2022 2m read

此文章也是对问题 在不重建的情况下插入索引Inserting an index without reconstruction 的一种解释

在使用SQL语言对 InterSystems IRIS 中的表进行查询时,有时候会发现返回的结果与实际有出入,特别是使用count() 函数,或者select 查询时,返回的结果少于实际应返回的值。
这种情况往往是由于数据表格的索引值出了问题。

索引出问题的主要原因可能是:

  • 表中先有数据,后创建的索引定义,并且定义之后没有重新生成索引。
  • 对保存数据的global直接操作。如果是使用对象或者sql的方式操作数据,相应的索引都会自动更新,但是如果直接对global操作,则不会自动更新索引。
  • 对保存索引的global直接操作。

要解决或者要检查是不是索引引发的问题,可以使用%ValidateIndices()函数,它有两种方式使用

$SYSTEM.OBJ.ValidateIndices(classname,idxList,autoCorrect,lockOption,multiProcess)


或者

##class(classname).%ValidateIndices(idxList,autoCorrect,lockOption,multiProcess)


两种使用方法最大的差别是:$SYSTEM.OBJ.

0
0 168
文章 Louis Lu · 一月 26, 2022 2m read

 

许多使用InterSystems IRIS的用户在调试代码的时候习惯使用命令行的方式,比如运行一个函数查看输出或者查看代码运行过程中保存在global中的数据等等。

对于将 InterSystems IRIS 安装在 Windows 操作系统的用户,只需要点击右下角图标选择Terminal 就可以很方便的使用。

但是对于将其安装到 Linux 或者Docker 容器中的用户,要使用命令行却不那么方便,下面我将会介绍在我们 Openexchange 中的一个应用 -- Web Terminal。

也就是说可以在网页中直接执行Terminal中的命令。

2016-09-18_212035

或者查看SQL执行结果:

2016-09-18_212244

可以在其中输入 /help ,获取更多帮助信息

2016-09-18_212325

安装

1. 点击进入项目下载页面,选择下载最新的版本。

2. 在任意的命名空间下导入下载的xml文件。

 

 

注意在这里选择导入文件的同时也要勾选上 “编译导入的项”

3. 之后会出现下面提示导入成功的提示

 

如果出现类似于下面的错误提示:

请将下载的 WebTerminal-v4.9.3.xml 文件编辑做下面修改

1 . 第1611行:修改为 

set requiredRole = "%DB_IRISSYS"

2. 第1730行:修改为

set dbPrefix = "IRIS"

重新导入就可以了。

3
0 423
InterSystems 官方 Louis Lu · 十二月 16, 2021

InterSystems IRIS、IRIS for Health 以及 HealthShare Health Connect 的 2021.2 版本的预览版现已发布。

由于这是一个预览版,我们希望在下个通用版本发布之前了解您对这个新版本的体验。请通过开发者社区分享您的反馈,以便我们能够共同打造一个更好的产品。

0
0 319
文章 Louis Lu · 十一月 16, 2021 2m read

内容摘自英文社区,原文见这里。主要解答了如何对于JSON对象中的某个字段创建索引。

在解答中Robert Cemper给出了下面示例

主要思路是将%Stream --> %DynamicObject --> 提取索引字段内容保存到计算字段内

Property JSON As %Stream.GlobalCharacter;

Property FirstName As %String [ Calculated, SqlComputed , SqlComputeCode = { set {*}=.GetDyn({ID},"FirstName") } ];

Property LastName As %String [ Calculated, SqlComputed , SqlComputeCode = { set {*}=.GetDyn({ID},"LastName") } ];

Index fn on FirstName; Index ln on LastName;

ClassMethod GetDyn(ID As %Integer, item = "") As %String
{    
  set JSON=.%OpenId(ID).JSON    
  do JSON.
0
0 133
文章 Louis Lu · 十一月 2, 2021 15m read

本文介绍了 InterSystems IRIS®数据平台中的大文件传输(Managed File TransferMFT)集成选项,它使您能够轻松地将第三方文件传输服务直接集成到 InterSystems IRIS 产品中。本文还包括在新产品中使用 MFT 的逐步指导。

要浏览所有的技术概要(First Look),包括可以在 InterSystems IRIS 免费的评估实例上执行的那些,请参见 InterSystems First Looks(《InterSystems 技术概要》)

 


  1. InterSystems IRIS 中使用 MFT 的好处     

许多拥有 InterSystems IRIS 产品的网站也使用文件传输服务,如 BoxDropbox Accellion kiteworks,以实现安全、符合 HIPAA 的文件共享。然而,这种服务的使用取决于终端用户是否愿意使用它。在没有强制执行的情况下,他们可能很容易忘记这样做,或者有时干脆选择将文件作为附件发送。通过将 MFT 服务集成到您的产品中,您可以确保文件总是被安全地发送。另一个好处是,由于产品可以根据需要自动地将敏感文件路由到正确的位置,并遵循适当的工作流程,因此,错位或错误指向文件的风险更小。

0
0 155