搜索​​​​

清除过滤器
文章
Claire Zheng · 一月 21, 2021

【视频】IRIS数据库在医疗行业发展(1):InterSystems IRIS架构

这是“IRIS数据库在医疗行业发展”系列课程的第一讲,InterSystems中国技术总监乔鹏为您介绍InterSystems IRIS架构。InterSystems IRIS数据平台是全球首款且唯一一款专门设计用于从医疗数据中提取价值的数据平台。
文章
Claire Zheng · 一月 21, 2021

【视频】IRIS数据库在医疗行业发展(2):InterSystems IRIS分析能力

这是“IRIS数据库在医疗行业发展”系列课程的第二讲,InterSystems中国技术总监乔鹏为您介绍InterSystems IRIS强大的分析能力。InterSystems IRIS数据平台是全球首款且唯一一款专门设计用于从医疗数据中提取价值的数据平台。
文章
Claire Zheng · 一月 21, 2021

【视频】IRIS数据库在医疗行业发展(3):InterSystems IRIS独立组件

这是“IRIS数据库在医疗行业发展”系列课程的第三讲,InterSystems中国技术总监乔鹏为您介绍InterSystems IRIS独立组件。InterSystems IRIS数据平台是全球首款且唯一一款专门设计用于从医疗数据中提取价值的数据平台。
公告
Claire Zheng · 一月 12, 2021

ESG 白皮书 | InterSystems IRIS:处理并发数据摄取和实时查询的高性能数据管理软件

本报告介绍了ESG 集团对多个数据库管理软件产品进行的并发数据摄取和实时查询性能验证测试。测试结果表明,InterSystems IRIS 数据平台可在摄取上亿条记录的同时执行数百万条查询,响应时间达到微秒级,其性能优于其他传统产品和内存产品。 对许多企业而言,收集并实时分析数据是一项必备能力,有助于推动收入增长、提高知名度,并为战略和决策提供参考。例如,专注于金融交易、物联网、欺诈检测和实时个性化服务的应用程序必须摄取并实时分析海量数据。其中的挑战在于找到一个足够强大的数据库平台,以便同时处理大规模的数据摄取和查询且不降低性能。当ESG向数据库和分析专家询问数据分析支持技术的相关问题时,大家普遍认为最重要的能力之一是性能。 内存数据库可提供高性能,但其扩展成本高昂,而且具有内存硬限制,可能会引起可靠性问题和重启延迟。传统数据库可提供持久性和可靠性,但缺乏内存数据库的高性能。相比之下,InterSystems IRIS 可同时处理数据摄取和查询工作负载,其性能可匹敌甚至优于内存数据库,并且不存在内存数据库的限制。为了证明这一主张,InterSystems发布了一项开源测试,ESG 也在本报告中进行了验证。 点击获取完整白皮书: ESG 白皮书 | InterSystems IRIS:处理并发数据摄取和实时查询的高性能数据管理软件
文章
Claire Zheng · 二月 1, 2021

如何在 InterSystems Open Exchange 上发布应用程序?

大家好! 如您所知,我们发布了 InterSystems Open Exchange — 面向 InterSystems 数据平台上的解决方案和工具的市场! 但是如何在 OE 上发布应用程序? 在开始前,我先回答几个基本问题。 谁可以发布? 基本上,每个人都可以。 您可以使用您的 InterSystems 开发者社区帐户或 WRC 帐户登录 Open Exchange。 什么是应用程序? Open Exchange 应用程序是使用任何 InterSystems 数据平台产品(Caché、Ensemble、HealthShare、InterSystems IRIS 或 InterSystems IRIS for Health)开发的解决方案、工具、互操作性适配器或接口。 或者该工具或解决方案应该有助于 InterSystems 数据平台上的开发、测试、部署或管理解决方案。 什么是 Open Exchange 的应用程序? 实际上,它是应用程序条目的名称、描述和链接集:下载页面、文档、代码仓库(如果有)、许可证等。 让我用我个人的示例来介绍这个过程。 将应用程序提交到 Open Exchange 为了说明这个过程,我在 ObjectScript for InterSystems IRIS 上开发了一个出色的应用程序,并希望将其与开发者社区分享:Ideal ObjectScript。 它演示了 ObjectScript 编码准则在各种 ObjectScript 用例中的理想用法。 有一些必需字段需要出现在每个 Open Exchange 应用程序上。 1. 名称 - 对于 Open Exchange 唯一的应用程序名称 2. 描述 - 应用程序的描述。 该字段支持 markdown。 3. 产品 URL - 应用程序下载页面的链接。 4. 许可证 - 显示应用程序许可证的页面的链接。 5. InterSystems 数据平台 - 应用程序面向的 InterSystems 数据平台集。 其余所有字段都是可选的。 那么,让我们来提交我的应用程序。 名称: Ideal ObjectScript 描述: Ideal ObjectScript 演示了 InterSystems ObjectScript 编码准则在各种 ObjectScript 用例中的理想用法。 产品URL: https://github.com/evshvarov/ideal_objectscript/releases/tag/1.0 - 应用程序的 Github 发行版部分中 1.0 版本的链接。 许可证URL: https://github.com/evshvarov/ideal_objectscript/blob/1.0/LICENSE - 应用程序的 LICENSE 文件的链接。 InterSystems数据平台: 该应用程序支持 InterSystems IRIS、Caché 和 Ensemble - 这是我自己测试过该应用程序的 InterSystems 产品列表。 这样,我们就可以提交应用程序了。 应用程序版本 在点击“Send For Approval”(发送以供批准)后,您需要提供应用程序的版本和版本说明。 我们使用 Semver 进行版本控制。 版本说明将发布在 Open Exchange 新闻、DC 社交媒体和应用程序的版本历史部分中。 在该应用程序进入批准工作流程后(结果是审批通过并自动在 OpEx 上发布,或者提供一些关于如何更正应用程序描述和链接的建议)。 输入 其他参数 图片 URL 在您的应用程序的图片图标上放置一个 URL,以使其显示在图块上。 您可以省略此参数,将显示标准 OpEx 图标。 Github URL 如果您的应用程序有 Github 仓库,则放置它的链接。 我们在 Open Exchange 上与 Github 进行了整合,因此,如果您引入指向应用程序的 Github 仓库的链接,Open Exchange 将自动显示来自 Github 的描述(Readme.md 中列出的所有内容)。 例如, 查看 Ideal ObjectScript 页面如何 显示在Open Exchange上。 社区文章URL 当然,您可以在开发者社区上用精彩的文章介绍您的应用程序,所以在这里放上文章的 URL! 如您所见,这个过程非常简单! 期待在 Open Exchange 上看到您的 InterSystems 数据平台应用程序! 敬请期待!
文章
jieliang liu · 一月 7, 2021

InterSystems 最佳实践系列之--从持久类和序列类生成 Swagger 规范

最近,我需要从持久类和序列类生成一个 Swagger 规范,所以我发布了我的代码(它并不完整 - 你仍然需要处理应用程序的细节,但这是一个开始)。 代码[在这里](https://github.com/eduard93/Utils/blob/master/Utils/YAML.cls.xml)。 假设你有下面的类:   类 Class REST.Test.Person Extends %Persistent { /// 人的名字。 Property Name As %String [ Required ]; /// 人的社会安全号。 这通过模式匹配进行验证。 Property SSN As %String [ Required ]; /// 人的出生日期。 Property DOB As %Date; /// 人的家庭地址。 这里使用一个嵌入对象。 Property Home As Address; /// 人的办公室地址。 这里使用一个嵌入对象。 Property Office As Address; /// 人的配偶。 这是对另一个持久对象的引用。 Property Spouse As Person; /// 代表人喜欢的颜色的字符串集合。 Property FavoriteColors As list Of %String; /// 代表人喜欢的颜色的字符串集合。 Property FavoriteNumbers As array Of %Integer; /// 人的年龄。<br> /// 这是一个经过计算的字段,其值来自于 <property>DOB</property>。 Property Age As %Integer; } Class REST.Test.Address Extends %SerialObject { /// 街道地址。 Property Street As %String(MAXLEN = 80); /// 城市名称。 Property City As %String(MAXLEN = 80); /// 2 个字母的州名缩写。 Property State As %String(MAXLEN = 2); /// 5 位美国 地区改进计划 (ZIP) 编码。 Property Zip As %String(MAXLEN = 5); } 你可以通过以下代码自动生成此 Swagger 定义: REST.Test.Person: type: "object" properties: Age: type: "integer" DOB: type: "string" FavoriteColors: type: "array" items: type: "string" FavoriteNumbers: type: "object" Home: $ref: "#/definitions/REST.Test.Address" Name: type: "string" Office: $ref: "#/definitions/REST.Test.Address" SSN: type: "string" Spouse: $ref: "#/definitions/REST.Test.Person" REST.Test.Address: type: "object" properties: City: type: "string" State: type: "string" Street: type: "string" Zip: type: "string" 主方法:Utils.YAML:GenerateClasses 测试运行:do ##class(Utils.YAML).Test()
文章
Louis Lu · 四月 15, 2021

2020 InterSystems IRIS 路线图 —— 蓝图分析

我喜欢事务型分析DBMS和高级分析细分概念 VSCode的IRIS 1.0版插件很炫酷。社区和InterSystems IRIS之间的合作对此有着非常积极的作用。但在不久的将来,减少代码开发量对于IRIS来说将是一个非常合适的选项。 动态网关/原生API将IRIS定位为面向市场上主要开放语言的最先进的数据平台,但有必要使用这些语言的公共包管理器,尤其是Maven公共仓库。 API管理器是一个不错的方案,但社区版IRIS不能用,且仅能用于由IRIS创建的API。这个关键问题亟待解决。 用于物联网的OPC-UA适配器和用于实时事件的Kakfa适配器都很棒,我很喜欢。未来,也可以考虑用于Salesforce、SAP、Office365和其他最常用平台的新适配器。 云支持目前很完美,采用ICM和IKO进行部署和管理,SAM进行监控。 FHIR加速器对于FHIR项目是一个很棒的方案,真的很有用。 IRIS的速度真的越来越快了,它能够让已经非常快的东西变得更快,非常出色。 自适应分析重磅推出后广受欢迎,它能够加速和简化分析数据立方体的创建(以完全可视化和直观的方式),并以极好的方式向Excel和其他数据查看器展示数据。未来,我很想看到InterSystems发布自己的查看器,因为IRIS本身的报告功能比较有限,且无法提供社区版,因而使它不可能在社区中推广。 IntegratedML是我最喜欢的IRIS的新功能。它非常易用,适合所有的DBA。AutoML也是超棒的技术,将会被广泛使用。现在,InterSystems需要向最终用户提供一个预测和分类查看器,比如它可以使用与SAM的Grafana相同的技术。
文章
Michael Lei · 五月 12, 2021

InterSystems 数据平台和性能 – 第 2篇

部分 在上个帖子中,我们安排了使用 pButtons 进行 24 小时的性能指标收集。 在本帖中,我们将研究几个收集到的关键指标,以及它们与底层系统硬件的关系。 我们还将开始探索 Caché(或任一 InterSystems 数据平台)指标与系统指标之间的关系。 以及如何使用这些指标来了解系统的每日节拍率并诊断性能问题。 [本系列其他帖子的列表](https://cn.community.intersystems.com/post/intersystems-数据平台的容量规划和性能系列文章) ***2016 年 10 月编辑...*** *[用于将 pButtons 数据提取到 .csv 文件的脚本示例。](https://cn.community.intersystems.com/post/将-pbuttons-数据提取到-csv-文件以便绘制图表)* ***2018 年 3 月编辑...*** 图片消失,重新添加它们。 # 硬件食物群 ![硬件食物群](https://community.intersystems.com/sites/default/files/inline/images/foodgroups_0.png "硬件食物群") 您将会看到,随着本系列帖子的不断深入,影响性能的服务器组件可以逐项列出: - CPU - 内存 - 存储 IO - 网络 IO 如果这些组件中的任何一个承受压力,那么系统性能和用户体验很可能会受到影响。 这些组件也都相互关联,对一个组件进行更改可能会影响另一个组件,有时会产生意外的后果。 我见过这样一个例子:修复某个存储阵列中的 IO 瓶颈使 CPU 的使用率跳增至 100%,导致用户体验更差,原因是系统突然可以做更多工作,但没有 CPU 资源来为增加的用户活动和吞吐量提供服务。 我们还将了解 Caché 系统活动如何直接影响服务器组件。 如果存储 IO 资源有限,那么可以做出的积极改变是增加系统内存,并增加 __Caché global 缓冲区__的内存,从而降低__系统存储读取 IO__(但可能会增加 CPU 使用率!)。 要定期监视或在用户报告问题时要检查的一个最明显的系统指标是 CPU 使用率。 在 Linux 或 AIX 中查看 _top_ 或 _nmon_,或在 Windows 中查看_性能监视器_。 由于大多数系统管理员会定期查看 CPU 数据,特别是当数据以图形方式呈现时,快速浏览一下就可以很好地了解系统当前的运行状况 - 正常情况或出现活动激增,后者可能是异常情况或表示出现问题。 在本帖中,我们将快速查看 CPU 指标,但会重点关注 Caché 指标,我们首先将查看 _mgstat_ 数据,了解以图形方式表示的数据如何让系统运行状况一目了然。 # mgstat 简介 mgstat 是 pButtons 中包含并在其中运行的一个 Caché 命令。 mgstat 是一个非常好的工具,可收集基本性能指标,帮助您了解系统运行状况。 我们将查看从 24 小时 pButtons 收集的 mgstat 数据,但是,如果您希望捕获 pButtons 之外的数据,也可以根据需要以交互方式运行 mgstat,或者从 Caché 终端将其作为后台作业运行。 要从 %SYS 命名空间按需运行 mgstat,一般格式是: do mgstat(sample_time,number_of_samples,"/file_path/file.csv",page_length) 例如,运行一小时后台作业,采样周期为 5 秒,然后输出为 csv 文件: job ^mgstat(5,720,"/data/mgstat_todays_date_and_time.csv") 要显示到屏幕,但丢弃几个列,则输入 dsp132。 给您留个作业,去查看一下输出以了解差异。 do dsp132^mgstat(5,720,"",60) > mgstat 中的列的详细信息可以在最新的 Caché 文档([InterSystems 在线文档](https://docs.intersystems.com))中的 _Caché 监视指南_中找到 # 查看 mgstat 数据 pButtons 已设计为整理成一个 HTML 文件,以便导航和打包发送给 WRC 支持专家来诊断性能问题。 不过,当您自己运行 pButtons 并想以图形方式显示数据时,可以再次将其拆分为 csv 文件以处理成图形,例如可以使用 Excel、通过命令行脚本或简单的剪切和粘贴来完成。 在本帖中,我们将深入研究几个 mgstat 指标,来说明即使是快速浏览数据,也能让您感觉到系统是否运行良好,或者是否存在会影响用户体验的现有或潜在问题。 ## Gloref 和 CPU 下图显示了一个以高事务处理速率运行医院应用程序的站点的数据库服务器 CPU 使用率。 注意活动的高峰期在上午,此时有许多门诊病人,而在午餐时间,活动大幅下降,在下午和晚上则逐渐消失。 此例中的数据来自于 Windows 性能监视器 _(_Total)\% Processor Time_ - 图形的形状符合工作日的情况 - 没有异常的峰值或低谷,所以对这个站点来说是正常的。 通过对您的站点执行相同分析,您可以开始获取“正常”情况的基准。 如果出现大的尖峰,尤其是延长的尖峰,可能说明出现了问题。将来会有一个帖子以 CPU 为重点。 ![CPU 时间](https://community.intersystems.com/sites/default/files/inline/images/cpu_time.png "CPU 时间") 作为参考,该数据库服务器是具有两个 E5-2670 8 核处理器的戴尔 R720,服务器的内存为 128 GB,global 缓冲区为 48 GB。 下图显示了来自 mgstat 的更多数据 — 与 CPU 图形同一天的 Gloref(Global 引用数)或数据库访问量。 Gloref 指示正在发生的工作量,代表当前工作负载;虽然 global 引用会消耗 CPU 时间,但由于 Caché 使用 global 内存缓冲池的方式,这些引用并不始终消耗物理读取等其他系统资源。 ![Global 引用数](https://community.intersystems.com/sites/default/files/inline/images/glorefs_0.png "Global 引用数") 在典型的 Caché 应用程序中,Gloref 与 CPU 使用率之间有非常强的相关性。 > 这些 CPU 数据和 gloref 数据所展示出的另一方面是_减少 gloref 将降低 CPU 使用率_,从而可以在核心数较少的服务器上部署或在现有系统上进一步扩展。 还可以通过提高应用程序效率来减少 global 引用,我们将在以后的帖子中重新讨论这个概念。 ## PhyRds 和 Rdratio 根据 mgstat 数据 _PhyRds_(物理读取数)和 _Rdratio_(读取比)绘制的图形的形状也可以深入了解系统性能的预期水平,帮助您制定容量计划。 我们将在以后的帖子中深入探讨 Caché 的存储 IO。 _PhyRds_ 只是从磁盘到 Caché 数据库的物理读取 IOPS,您应该看到逻辑磁盘和物理磁盘的操作系统指标中反映了相同的值。 注意,查看操作系统 IOPS 可能还会显示来自非 Caché 应用程序的 IOPS。 不考虑预期的 IOPS 就调整存储大小会导致灾难,您需要了解系统在高峰时段的 IOPS 是多少,才能制定适当的容量计划。 下图显示了午夜零点到 15:30 之间的 _PhyRds_。 ![物理读取数](https://community.intersystems.com/sites/default/files/inline/images/phyrds.png "物理读取数") 注意 05:30 到 10:00 之间的读取数激增。 其他较短的峰值在 11:00 以及 14:00 之前。 您认为这些峰值是由什么引起的? 您的服务器有这些类型的峰值吗? _Rdratio_ 更有趣一点,它是逻辑块读取数与物理块读取数的比值。 也就是内存中的 global 缓冲区(逻辑)的读取次数与磁盘的读取次数之比,后者的读取速度要慢几个数量级。 _Rdratio_ 高是好事情,但长时间降至接近于零就不好了。 ![读取比](https://community.intersystems.com/sites/default/files/inline/images/rdratio.png "读取比") 注意读取数高的同时,_Rdratio_ 降至接近于零。 我曾被要求调查过这个站点,当时 IT 部门接到用户电话,报告系统长时间运行缓慢。 当我被要求查看系统时,这种情况已在几个星期内看似随机地出现。 > _**由于 pButtons 已设定为每天 24 小时运行,因此可以相对简单地回溯几周的数据,以查看与支持电话相关的高 _PhyRds_ 和低 _Rdratio_ 的模式。*** 经过进一步分析后,原因追溯到一名新的轮班员工身上,他当时运行了多个报告,输入了“错误”参数,加上写得不好的查询,并且没有适当的索引,导致数据库读取数很高。 这就解释了看似随机的缓慢。 由于这些长时间运行的报告将数据读取到 global 缓冲区中,结果是交互用户的数据从物理存储中获取,而不是从内存以及用于为读取提供服务的存储中获取。 监视 _PhyRds_ 和 _Rdratio_ 将让您了解系统的节拍率,也许还可以追踪不良报告或查询。 高 _PhyRds_ 可能有合理的原因 - 也许必须在某个时间运行报告。 使用现代 64 位操作系统和具有大容量物理内存的服务器,您应该能够将生产系统上的 _PhyRds_ 降到最低。 > 如果您在系统上看到高 _PhyRds_,可以考虑以下几种策略: - 通过增加数据库 (global) 缓冲区(和系统内存)的数量来提高性能。 - 可以将长时间运行的报告或提取移出办公时间。 - 可以在单独的影子服务器或异步镜像上运行长时间运行的只读报告、批处理作业或数据提取,以最大限度地降低对交互用户的影响,并减少对 CPU 和 IOPS 等系统资源的使用。 通常,低 _PhyRds_ 是好事情,这也是我们在确定系统规模时的目标。 然而,如果您的 _PhyRds_ 较低,而用户正在抱怨性能,仍然可以进行一些检查以确保存储不是瓶颈 - 读数低的原因可能是系统无法再提供服务。 我们将在以后的帖子中进一步探讨存储。 # 总结 在本帖中,我们研究了将 pButtons 中收集的指标图形化如何让运行状况检查可以一目了然地进行。 在接下来的帖子中,我将深入探讨系统和 Caché 指标之间的关系,以及如何利用这些指标来规划未来。
文章
Michael Lei · 五月 24, 2021

InterSystems 数据平台和性能 – 第 1 篇

您的应用程序已部署,一切运行正常。 很好,击个掌! 然后电话突然响个不停 – 用户投诉应用程序有时很“慢”。 这是什么意思? 有时? 您有哪些工具,查找和解决这个缓慢问题应查看哪些统计数据? 您的系统基础架构是否能承担用户负载的任务? 在投入生产之前,应该询问哪些基础架构设计问题? 如何自信地为新硬件规划容量,而不会过度规定? 如何停止电话铃声? 如何一开始就不让它响? * * * [本系列其他帖子的列表](https://cn.community.intersystems.com/post/intersystems-数据平台的容量规划和性能系列文章) * * * ## 这将是一次旅程 这是本系列的第一个帖子,本系列将探讨可用于对系统性能进行监视、审查和故障排除的工具和指标,以及影响性能的系统和架构设计注意事项。 在旅程中,我们将朝多个方向前进,了解 Caché、操作系统、硬件、虚拟化以及根据评论中的反馈变为热门的其他方面的性能。 我们将关注反馈循环,其中性能数据提供了一个视角,通过它可查看已部署的应用程序和基础架构的优势和局限性,然后形成反馈以实现更好的设计和容量计划。 不言而喻,您应该不断检查性能指标,但不幸的是,如果客户只是查看数据,他们会多次对长期可见的性能问题感到惊讶。 但问题当然是 - 什么数据? 我们将从收集一些基本的 Caché 和系统指标来开始这一旅程,这样我们可以对您的系统当前的运行状况有一个感觉。 在以后的帖子中,我们将深入了解主要指标的含义。 有多个可用于系统监视的选项 – 来自 Caché 内部和外部,我们将在本系列中探讨其中的许多选项。  首先,我们将了解我最喜欢的用于连续收集数据的必备工具 ^pButtons,它已经安装在每个 Caché 系统上。 为确保您拥有最新的 pButtons 副本,请查看以下帖子: ## 收集系统性能指标 - ^pButtons Caché 的 pButtons 实用工具可根据其创建的日志文件生成可读的 HTML 性能报告。 pButtons 输出的性能指标可以被轻松提取、绘图和审核。  pButtons html 文件中收集的数据包括: * Caché 设置:配置、驱动器映射等。 * mgstat:Caché 性能指标 - 大多数的值是每秒平均数。 * Unix:vmstat 和 iostat:操作系统资源和性能指标。 * Windows:性能监视器:Windows 资源和性能指标。 * 其他有用的指标。 pButtons 数据收集对系统性能的影响非常小,这些指标已经由系统收集,pButtons 只是将它们打包以便归档和传输。  要保存基准以进行趋势分析和故障排除,好的做法是在一个完整的业务周期内每天收集 24 小时 pButtons(午夜到午夜)。 一个业务周期可能是一个月或更长时间,例如,从月末处理中捕获数据。 如果没有任何其他外部性能监视或收集,则可以全年运行 pButtons。  应注意以下关键点: * 将日志目录更改为远离生产数据的位置,以存储累积的输出文件,避免出现磁盘满的问题! * 定期运行操作系统脚本或以其他方式压缩和存档 pButtons 文件,这在 Windows 上尤其重要,因为文件可能很大。 * 定期审核数据! 如果出现需要立即分析的问题,可以预览(立即收集)pButtons 数据,同时继续存储指标,以便在当天运行结束时进行收集。 有关 pButtons 的更多信息(包括预览、停止运行和添加自定义数据收集),请参见最新的 Caché 文档中的 _Caché 监视指南_:  http://docs.intersystems.com 可以将 pButtons HTML 文件数据分离并提取(例如提取为 CSV 文件),以通过脚本或简单的剪切和粘贴将其处理成图形或进行其他分析。 我们以后将在下一个帖子中看到图表输出的例子。 当然,如果您有紧急的性能问题,请联系 WRC。 ### 计划 24 小时 pButtons 数据收集 ^pButtons 可以手动从终端提示符启动,也可以按计划启动。 要计划每天 24 小时收集: 1. 启动 Caché 终端,切换到 %SYS 命名空间,然后手动运行一次 pButtons 以设置 pButtons 文件结构: %SYS>d ^pButtons Current log directory: /db/backup/benchout/pButtonsOut/ Available profiles: 1 12hours - 12 hour run sampling every 10 seconds 2 24hours - 24 hour run sampling every 10 seconds 3 30mins - 30 minute run sampling every 1 second 4 4hours - 4 hour run sampling every 5 seconds 5 8hours - 8 hour run sampling every 10 seconds 6 test - A 5 minute TEST run sampling every 30 seconds 选择选项 6 test - 5 minute TEST run sampling every 30 seconds。 请注意,您的编号可能有所不同,但 test 应该是显而易见的。 在运行期间,运行 Collect^pButtons(如下所示),您将看到包括 runid 在内的信息。 在此例中为“20160303\_1851\_test”。 %SYS>d Collect^pButtons Current Performance runs: <strong>20160303_1851_test</strong> ready in 6 minutes 48 seconds nothing available to collect at the moment. %SYS> 注意到这个 5 分钟运行还剩 6 分 48 秒吗? pButtons 为所有运行增加了 2 分钟宽限期,以便有时间将日志收集和整理成 html 格式。  2. 重要!更改 pButtons 日志输出目录 – 默认的输出位置为 <缓存安装路径>/mgr 文件夹。 例如,在 unix 上,日志目录的路径可能如下所示: do setlogdir^pButtons("/somewhere_with_lots_of_space/perflogs/") 确保 Caché 有该目录的写权限,并且有足够的磁盘空间用于累积输出文件。 3. 运行以下命令以创建一个新的 24 小时配置文件,间隔为 30 秒: write $$addprofile^pButtons("<strong>My_24hours_30sec</strong>","24 hours 30 sec interval",30,2880) 检查该配置文件是否已添加到 pButtons: %SYS>d ^pButtons Current log directory: /db/backup/benchout/pButtonsOut/ Available profiles: 1 12hours - 12 hour run sampling every 10 seconds 2 24hours - 24 hour run sampling every 10 seconds 3 30mins - 30 minute run sampling every 1 second 4 4hours - 4 hour run sampling every 5 seconds 5 8hours - 8 hour run sampling every 10 seconds 6 My_24hours_30sec- 24 hours 30 sec interval 7 test - A 5 minute TEST run sampling every 30 seconds select profile number to run: 注意:您可以更改收集间隔 – 30 秒对于例行监视是可以的。 对于例行 24 小时运行,我不会选择低于 5 秒的间隔 (…”,5,17280),因为 pButtons 在每个间隔都会收集数据,而导致输出文件变得非常大。 如果您要对一天中的某个特定时间进行故障排除,并需要更细化的数据,请使用默认的配置文件之一,或创建一个新的自定义配置文件,取较短的时间段,例如 1 小时,间隔为 5 秒 (...",5,720)。 多个 pButtons 可以同时运行,因此可以同时运行一个间隔为 5 秒的短 pButtons 和一个 24 小时 pButtons。 4. 提示 对于 UNIX 站点,可审查磁盘命令。 “iostat”命令使用的默认参数可能未包括磁盘响应时间。 首先显示当前配置了哪些磁盘命令: %SYS>zw ^pButtons("cmds","disk") ^pButtons("cmds","disk")=2 ^pButtons("cmds","disk",1)=$lb("iostat","iostat ","interval"," ","count"," > ") ^pButtons("cmds","disk",2)=$lb("sar -d","sar -d ","interval"," ","count"," > ") 要收集磁盘统计数据,请使用适合您的 UNIX 安装版的命令来编辑语法。 注意尾部空格。 以下是一些示例: LINUX: set $li(^pButtons("cmds","disk",1),2)="iostat -xt " AIX: set $li(^pButtons("cmds","disk",1),2)="iostat -sadD " VxFS: set ^pButtons("cmds","disk",3)=$lb("vxstat","vxstat -g DISKGROUP -i ","interval"," -c ","count"," > ") 您可以同时运行 iostat 和 sar 命令来创建非常大的 pButtons html 文件。 对于定期的性能审查,我通常只使用 iostat。 要仅配置一个命令: set ^pButtons("cmds","disk")=1 有关配置 pButtons 的更多详细信息,请参见在线文档。 5. 在 Management Portal > System Operation > Task Manager 中安排 pButtons 在午夜启动: Namespace: %SYS Task Type: RunLegacyTask ExecuteCode: Do run^pButtons("My_24hours_30sec") Task Priority: Normal User: superuser How often: Once daily at 00:00:01 ### 收集 pButtons 数据 最新版的 InterSystems 数据平台中随附的 pButtons 包括自动收集功能。 要手动收集数据并整理成一个 html 文件,请在 %SYS 命名空间中运行以下命令以生成未完成的 pButtons html 输出文件: do Collect^pButtons 该 html 文件将位于您在步骤 2 设置的日志目录中(如果您未设置,就**现在去设置!**)。 否则默认位置为 <Caché 安装目录/mgr> 文件将命名为 <主机名\_实例\_名称\_日期\_时间\_配置文件名.html>,例如 vsan-tc-db1\_H2015\_20160218\_0255_test.html ### Windows 性能监视器注意事项 如果操作系统是 Windows,则可以使用 Windows 性能监视器 (perfmon) 收集数据,与所收集的其他指标同步。 在 pButtons 的旧版 Caché 发行版中,需要手动配置 Windows perfmon。 如果帖子评论有需求,我将写一篇帖子介绍如何创建 perfmon 模板来定义要监视的性能计数器,并安排与 pButtons 相同的运行期间和间隔。 ### 总结 我们从本帖开始收集一些要研究的数据。 在本周晚些时候,我将开始研究一些样本数据及其含义。 您可以使用您在自己的系统上收集的数据。 到时见。
文章
Michael Lei · 六月 15, 2021

InterSystems 最佳实践之--LVM PE 条带化使超融合存储吞吐量最大化

本帖概述了通过为 InterSystems 数据平台(InterSystems IRIS、Caché 和 Ensemble)上的数据库磁盘创建 LVM 物理盘区 (PE) 条带来实现低延迟存储 IO 的最佳实践配置,并提供了有用链接。 一致的低延迟存储是获得最佳数据库应用程序性能的关键。 例如,对于在 Linux 上运行的应用程序,经常在数据库磁盘中使用逻辑卷管理器 (LVM) ,因为它能够扩展卷和文件系统,或者为在线备份创建快照。 对于数据库应用程序,在使用 LVM PE 条带化逻辑卷的情况下,并行写入还可提高数据 I/O 的效率,从而有助于提高大规模连续读取和写入的性能。 ---- 本帖重点介绍在 HCI 中使用 LVM PE 条带,也受到了社区中发布的[软件定义的数据中心 (SDDC) 和超融合基础架构 (HCI) – InterSystems 客户的重要注意事项](https://community.intersystems.com/post/software-defined-data-centers-sddc-and-hyper-converged-infrastructure-hci-%E2%80%93-important "SDDC whitepaper")白皮书的启发。 该白皮书推荐“对 Linux 虚拟机使用 LVM PE 条带化,从而将 IO 分布在多个磁盘组”以及“对于 Linux 虚拟机上的所有数据库和写入映像日志 (WIJ) 文件使用异步 IO 及 rtkaio 库”。 本帖提供了这些要求和示例的一些上下文信息。 ---- __注:__ > 目前有多个超融合、融合和软件定义的供应商平台,我在本帖中不会提供每个平台的详细说明,而是以__在 VMware ESXi 和 vSAN 上运行的 Red Hat Enterprise Linux (RHEL) 7.4 上的 InterSystems IRIS 或 Caché __的配置作为示例进行说明。 不过,其他解决方案的基本过程是相似的,特别是在 InterSystems IRIS 或 Caché 和操作系统层面。 如果您不确定如何将这些说明转换到其他平台,请联系各供应商的支持人员,了解他们的最佳实践。 InterSystems 技术专家还可以直接向客户和供应商或通过社区提供建议。 还需要注意的是,本帖中关于 LVM PE 条带化的指南既适用于 HCI,也适用于“传统”存储。 ---- ## 是否必须使用 LVM 条带化? 对于磁盘阵列等传统存储,简短的答案是“否”。 对数据库磁盘运行 LVM 条带化卷并不是必需的,尤其是使用现代全闪存阵列的情况下;如果性能尚可,并且您没有 LVM 需求,则无需改动。 但是,如上文所述,建议在 Nutanix 和 VMware VSAN 等超聚合和存储解决方案上的数据库磁盘中使用 LVM 条带,以便在 IO 操作中可以使用更多主机节点和磁盘组。 ## 为什么对数据平台使用 LVM 条带? 特别建议 HCI 上的数据库磁盘使用 LVM 条带,以降低某些架构功能的性能开销,例如减轻写入守护进程 (WD) 对数据库写入和日志写入的影响。 使用 LVM 条带将数据库突发写入分散到更多磁盘设备和多个磁盘组。  此外,本帖还将说明如何增加大规模 IO 写入映像日志 (WIJ) 的并行性,从而减少对其他 IO 的延迟影响。 > 注意:在本帖中,当我提到“磁盘”时,我指的是 NVMe、Optane、SATA 或 SAS SSD,或者任何其他闪存设备。 ## vSAN 存储架构概述 HCI 存储(例如在 vSAN 上运行 ESXi 时)使用两个磁盘层:一个缓存层和一个容量层。 对于全闪存架构__(必须使用全闪存,不要使用旋转磁盘!)__,所有写入操作都在缓存层进行,随后数据最终会转移到容量层。 读取来自容量层(也可能来自缓存层上的缓存)。 HCI 集群中的每个主机都可以有一个或多个磁盘组。 在使用磁盘组的情况下(例如使用 VSAN 时),每个磁盘组都由一个缓存磁盘和多个容量磁盘组成。 例如,缓存磁盘是单个 NVMe 磁盘,容量磁盘是三个或更多写密集型 SAS SSD 磁盘。 有关 HCI(包括 vSAN 磁盘组)的更多详细信息,请参见社区上的帖子“[超融合基础架构 (HCI)](https://community.intersystems.com/post/intersystems-data-platforms-and-performance-%E2%80%93-part-8-hyper-converged-infrastructure-capacity "HCI")”或联系您的 HCI 供应商。 ## LVM 条带化逻辑卷概述 [Red Hat 支持](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/logical_volume_manager_administration/lv_overview "Red Hat support")网站上提供了很好的 Linux LVM 概述,[其他地方,例如这里的面向系统管理员的教程也非常好](https://sysadmincasts.com/episodes/27-lvm-linear-vs-striped-logical-volumes "Striped")。 ## 数据平台存储 IO 了解 InterSystems 数据平台生成的 IO 类型很重要。 [社区中提供了存储 IO 模式](https://community.intersystems.com/post/data-platforms-and-performance-part-6-cach%C3%A9-storage-io-profile "Storage IO")的概述。 ---- # 创建 LVM PE 条带的过程 ## 先决条件和步骤 在我们深入讨论该过程之前,您还应该记住,其他变数也可能影响存储性能。 仅创建 LVM 条带并不能保证实现最佳性能,还必须考虑存储类型,以及整个 IO 路径,包括 IO 队列和队列深度。 本示例适用于 VMware,您还应该阅读 [InterSystems IRIS VMware 最佳实践指南](https://community.intersystems.com/post/intersystems-data-platforms-and-performance-%E2%80%93-part-9-intersystems-iris-vmware-best-practice "VMware best practice guide"),并应用其中的建议。 尤其是存储方面的注意事项,例如跨 PVSCSI 控制器分离存储 IO 类型。 ### 概述 以下示例展示了在 VMware ESXi 和 VSAN 6.7 上运行的 Red Hat Enterprise Linux (RHEL) 7.4 上使用 InterSystems IRIS 或 Caché 的最佳实践。 下文介绍以下步骤: 1. ESXi 配置 2. RHEL 配置 3. Caché/InterSystems IRIS 配置 ---- ## 1. ESXi 配置 ### a) 创建 VMDK 磁盘 必须按照 [InterSystems IRIS VMware 最佳实践指南](https://community.intersystems.com/post/intersystems-data-platforms-and-performance-%E2%80%93-part-9-intersystems-iris-vmware-best-practice "VMware best practice guide")创建磁盘;数据库、日志和 WIJ 在不同的 PVSCI 设备上。 创建的 VMDK 数量取决于您的规模调整要求。 在本示例中,数据库文件系统将由四个 255 GB VMDK 磁盘组成,这些磁盘将一起条带化,为数据库文件系统创建一个 900GB 逻辑磁盘。 #### 步骤: 1. 在添加 VMDK 前关闭虚拟机。 2. 在 vCenter 控制台中创建多个磁盘 (VMDK),每个磁盘为 255GB,单个 LVM 条带中的所有磁盘都必须与同一个 PVSCSI 控制器关联。 3. 启动虚拟机。 在启动过程中,将在操作系统中创建新磁盘,例如 `/dev/sdi` 等。 > __为什么创建多个 255 GB VMDK?__在 vSAN 中,存储组件以 256 GB 区块为单位创建,我们将 VMDK 大小保持在恰好低于 256 GB,是为了强制使组件位于不同的磁盘组上。 从而实施另一个层面的条带化(在我的测试中是这样,但我不保证 vSAN 实际也是如此)。 注意:在创建过程中,vSAN 将磁盘组件分布到所有主机和磁盘组,以确保可用性。 例如,在允许的故障数 (FTT) 设置为 2 的情况下,每个磁盘组件有三个副本,加上两个小的见证组件,全部都在不同的主机上。 如果磁盘组、主机或网络发生故障,应用程序将使用其余磁盘组件继续运行,而不会丢失数据。 我们对这个过程可能多虑了! 在 vSAN 等 HCI 解决方案中,无法控制组成 VMDK 的组件在某个时间点位于哪个物理磁盘上。 事实上,由于维护、重新同步或重建的原因,随着时间的推移,VMDK 可能会移动到不同的磁盘组或主机上。 这是正常的。 ---- ## 2. RHEL 配置 ### a) 确认对于每个磁盘设备,RHEL IO 调度器都为 NOOP。 最佳实践是使用 ESXi 内核的调度器。 有关设置调度器的更多信息,请参见 [Red Hat 知识库文章](https://access.redhat.com/solutions/109223 "Setting noop")。 我们建议在启动时为所有设备设置该选项。 要验证是否已正确设置调度器,可以显示磁盘设备(例如,在本例中为 `/dev/sdi`)的当前设置,如下所示: [root@db1 ~]# cat /sys/block/sdi/queue/scheduler [noop] deadline cfq 您可以看到 noop 已启用,因为它放在方括号中突出显示。 ### b) 创建条带化的 LVM 和 XFS 文件系统 现在,我们准备在 RHEL 中创建 LVM 条带和数据库文件系统。 以下是所涉及步骤的示例,请注意,对于您的环境,需要替换虚构的名称 vgmydb、lvmydb01 和路径 /mydb/db。 #### 步骤 **1.** 使用 `vgcreate` 命令创建带有新磁盘设备的卷组。 vgcreate -s 4M 例如,如果创建磁盘 /dev/sdh、/dev/sdi、/dev/sdj 和 /dev/sdk: vgcreate -s 4M vgmydb /dev/sd[h-k] **2.** 使用 `lvcreate` 命令创建条带化逻辑卷。 建议至少四个磁盘。 从 4MB 条带开始,但是对于非常大的逻辑卷,系统可能会提示您选择更大的大小,如 16M。 lvcreate -n -L -i -I 4MB 例如,要创建带有 4 个条带的 900GB 磁盘,且条带大小为 4 MB: lvcreate -n lvmydb01 -L 900G -i 4 -I 4M vgmydb **3.** 使用 `mkfs` 命令创建数据库文件系统。 mkfs.xfs -K 例如: mkfs.xfs -K /dev/vgmydb/lvmydb01 **4.** 创建文件系统挂载点,例如: mkdir /mydb/db **5.** 编辑 `/etc/fstab` 以添加以下挂载条目并挂载文件系统。 例如: /dev/mapper/vgmydb-lvmydb01 /mydb/db xfs defaults 0 0 **6.** 挂载新的文件系统。 mount /mydb/db ---- ## 3. Caché/InterSystems IRIS 配置 本节我们将配置: - 异步和直接 IO,以实现数据库和 WIJ 的最佳写入性能。 这也为数据库读取操作启用了直接 IO。 > 注意:由于直接 IO 会绕过文件系统缓存,因此在配置直接 IO 后,操作系统文件复制操作(包括 Caché 在线备份)将非常慢。 为提高 **RHEL** 上的 WIJ 的性能并实现最低延迟(SuSE 9 及更高版本不支持),并减少对其他 IO 的影响,我们还将配置: - 将 `rtkaio` 库用于使用 Caché 的 RHEL 系统。 **注意:IRIS 不需要这个库。** > 注:对于 Linux 上版本号以 2017.1.0. 开头的 Caché、Ensemble 和 HealthShare 发行版 (仅当备份或异步镜像成员配置为使用 rtkaio 时),必须应用 [ RJF264,可通过 InterSystems 全球响应中心 (WRC) 的特别分发获取](https://www.intersystems.com/support-learning/support/product-news-alerts/support-alert/alert-linux-defects-can-corrupt-mirror-copies-journal-files/ "RJF264 from WRC")。   #### 步骤 步骤为: 1. 关闭 Caché 2. 编辑 `/cache.cpf` 文件 3. 重启 Caché 在 cache.cpf 文件中,将以下三行添加到 `[config]` 部分的顶部,其他行保持不变,如下例所示: [config] wduseasyncio=1 asyncwij=8 对于 RHEL Caché(不是 IRIS),还要将以下内容添加到 `[config]` 部分: LibPath=/lib64/rtkaio/ 注意:当 Caché 重新启动后,这些行将在 `[config]` 部分中按字母顺序排序。 ---- ## 总结 本帖给出了创建 900GB LVM PE 条带和为 vSAN 上的数据库磁盘创建文件系统的示例。 为了通过 LVM 条带获得最佳性能,您还学习了如何配置 Caché/InterSystems IRI 来为数据库写入和 WiJ 启用异步 IO。
文章
Jingwei Wang · 七月 21, 2022

InterSystems SQL 的使用 - 第四部分 - 视图

视图为存储查询,提供了物理表的所有灵活性和安全权限。所有的视图都是可更新的或只读的。 注意:不能对只读的数据库中的数据创建视图。不能对存储在通过ODBC或JDBC网关连接的Informix表中的数据创建视图。这是因为InterSystems IRIS查询转换在FROM子句中使用子查询,而Informix不支持FROM子句的子查询。 创建视图 视图名称可以是合格的的或不合格的。一个没有限定的视图名称是一个简单的标识符。MyView。一个合格的视图名称由两个简单的标识符组成,一个schema名称和一个视图名称,用句号隔开, 例如MySchema.MyView。视图名和表名遵循相同的命名规则,并对未限定的名称执行相同的schema名称解析。同一模式中的视图和表不能有相同的名称。 你可以通过几种方式定义视图: 使用SQL CREATE VIEW命令(在DDL脚本中或通过JDBC或ODBC)。 CREATE VIEW MySchema.MyView (ViewCol1, ViewCol2, ViewCol3) AS SELECT TableCol1, TableCol2, TableCol3 FROM MyTable 使用管理门户的创建视图界面。 系统操作 -> SQL -> 操作 -> 创建视图 这将显示 "创建视图 "窗口,如图所示: schema:您可以决定将视图包含在现有schema中,或者创建一个新的schema。 视图名称:一个有效的视图名称。在同一模式中,你不能对表和视图使用相同的名称。 带检查选项:选项有READONLY、LOCAL、CASCADED。 授予视图的所有权限给_PUBLIC:如果选择了这个选项,这个选项会给所有用户执行这个视图的权限。默认是不给所有用户访问该视图的权限。 查看文本:你可以通过以下三种方式中的任何一种指定视图文本。 在 "查看文本 "区域键入一个SELECT语句。 使用查询生成器创建一个SELECT语句,然后按确定将此查询提供给视图文本区。 如果你在管理门户SQL界面左侧选择一个缓存查询名称(例如%sqlcq.USER.cls4),然后调用创建视图,这个缓存查询就会提供给视图文本区。注意,在视图文本区,你必须在保存视图文本之前用实际值替换变量引用(问号)。 使用Objectscript执行DDL ClassMethod CreateTable() As %String { &sql(CREATE VIEW Sample.VSrStaff AS SELECT Name AS Vname,Age AS Vage FROM Sample.Person WHERE Age>75) IF SQLCODE=0{ WRITE "Created a view"} ELSEIF SQLCODE=-201 { WRITE "View already exists" RETURN SQLCODE} ELSE { WRITE "Serious SQL Error, returing SQLCODE " RETURN SQLCODE_" "_%msg} } $SYSTEM.SQL.Schema.ViewExists()方法可以用来确定一个视图名称是否已经存在。 查看视图定义 视图信息 SELECT * FROM INFORMATION_SCHEMA.VIEWS 视图的依赖表 NFORMATION.SCHEMA.VIEWTABLEUSAGE持久化类显示当前命名空间中的所有视图和它们所依赖的表。 通过SQL脚本显示视图依赖表 SELECT View_Schema,View_Name, Table_Schema,Table_Name FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE 通过ObjectScript显示依赖表 SET statemt = ##class(%SQL.Statement).%New() SET cqStatus = statemt.%PrepareClassQuery("%Library.SQLCatalog","SQLViewDependsOn") IF cgStatus '= 1 { WRITE "PrepareClassQuery failed:" DO $System.Status.DisplayError(cgStatus) QUIT } SET rset = statemt.%Execute("vschema.vname") DO rset.%Display() 如果调用者没有视图所依赖的表的权限,该表及其模式将被列为NOT PRIVILEGED。这允许没有表权限的调用者确定视图所依赖的表的数量,但不能确定表的名称。 View ID: %VID InterSystems IRIS为视图或FROM子句返回的每条记录分配一个整数的视图ID(%VID)。与表的行ID号一样,这些视图的行ID号也是系统分配的、唯一的、非空的、非零的和不可修改的。这个%VID通常对用户来说是不可见的,只有在明确指定时才会返回。它作为数据类型INTEGER返回。因为%VID值是连续的整数,如果视图返回有序的数据,它们就更有意义;视图只有在与TOP子句配对时才能使用ORDER BY子句。 CREATE VIEW Sample.VSrStaff AS SELECT TOP ALL Name AS Vname,Age AS Vage FROM Sample.Person WHERE Age>75 ORDER BY Name 下面的例子返回VSrStaff视图定义的所有数据(使用SELECT *),并且还指定要返回每一行的视图ID。与表的行ID不同,视图的行ID在使用星号语法时不会显示;只有在SELECT中明确指定时才会显示。 SELECT *,%VID AS ViewID FROM Sample.VSrStaff %VID可以用来进一步限制SELECT从视图返回的行数,如下面的例子所示。 SELECT *,%VID AS ViewID FROM Sample.VSrStaff WHERE %VID BETWEEN 5 AND 10 因此,%VID可以用来代替TOP(或者作为TOP的补充)来限制查询返回的记录的数量。一般来说,TOP子句用于返回数据记录的一个小子集;%VID用于返回大部分或全部数据记录,将记录返回到小子集的中。这个功能可能很有用,特别是对于Oracle查询(%VID很容易映射到Oracle ROWNUM)。然而,用户应该意识到,与TOP相比,使用%VID有一些性能限制。 %VID不执行time-to-first-row的优化。TOP的优化是尽可能快地返回第一行数据。%VID的优化是为了尽可能快地返回完整的数据集。 如果查询指定了排序的结果,%VID不会执行有限的排序(这是由TOP执行的特殊优化)。查询首先对完整的数据集进行排序,然后使用%VID对返回的数据集进行限制。TOP是在排序前应用的,所以SELECT执行的是有限的排序,只涉及一个受限制的行子集。 为了保持对第一行的优化时间和有限的排序优化,你可以使用一个带有TOP和%VID组合的FROM子句子查询。 SELECT *,%VID AS SubQueryID FROM (SELECT TOP 10 Name,Age FROM Sample.Person WHERE Age > 75 ORDER BY Name) WHERE %VID > 4 不能对指定了%VID的查询进行并行执行,即使明确指定了%PARALLEL关键字。
文章
Jingwei Wang · 七月 14, 2022

InterSystems SQL 的使用 - 第二部分 - 基础介绍

本文概述了InterSystems SQL的特点,特别是那些没有被SQL标准所涵盖或与InterSystems IRIS 数据平台的统一数据架构有关的特点。假定你已有SQL的知识,本文不是SQL概念或语法的介绍。 表 在InterSystems SQL中,数据是在表内呈现的。每个表都被定义为包含若干列。一个表可以包含零个或多个数据值的行。以下术语大致上是等同的。 数据 关系型数据库术语 InterSystems SQL术语 InterSystems IRIS术语 database schema schema package database table table persistent class field column column property record row row schema SQL schema提供了一种将相关表、视图、存储过程和缓存查询分组的方法。模式的使用有助于防止在表一级的命名冲突,因为一个表、视图或存储过程的名称必须只在其schema内是唯一的。一个应用程序可以在多个schema中指定表。 SQL schema对应于IRIS中持久化的类包。通常情况下,一个模式的名称与它对应的包的名称相同,但是这些名称可能会因为不同的模式命名惯例而不同,或者因为不同的名称被故意指定。 命名:schema.name。如果没有指定schema:例如只有name。InterSystems IRIS会按以下方式提供模式。 对于DDL操作,InterSystems IRIS使用全系统默认的schema名称SQLUser。这个默认是可配置的。它适用于所有命名空间。 对于DML操作,InterSystems IRIS可以使用用户提供的schema搜索路径或全系统默认的schema名称。在动态SQL、嵌入式SQL和SQL Shell中,使用不同的技术来提供schema搜索路径。 在管理门户中查看一个命名空间内的所有现有schema: 从管理门户中选择系统资源管理器,然后选择SQL。用页面顶部的切换选项选择一个命名空间;这将显示可用的命名空间的列表。选择一个命名空间。选择屏幕左边的模式下拉列表。这将显示当前命名空间中的schema列表。从这个列表中选择一个schema; SQL 查询 查询有两种类型:检索数据的查询(SELECT语句)和修改数据的查询(INSERT、UPDATE和DELETE语句)。 你可以以多种方式使用SQL查询: 在ObjectScript中使用嵌入式SQL。 在ObjectScript中使用动态SQL。 调用使用CREATE PROCEDURE或CREATE QUERY创建的存储过程。 使用一个类查询。 使用来自其他环境的ODBC或JDBC接口。 SELECT查询在本指南的查询数据库一章中有描述。 查询是InterSystems IRIS对象或ObjectScript程序的一部分。 Privileges 特权 InterSystems SQL提供了一种方法,通过权限来限制对表、视图等的访问。你可以定义一组用户和角色,并授予他们各种权限(读、写等等)。 数据显示 SelectMode InterSystems SQL使用SelectMode选项来指定数据的显示或存储方式。可用的选项有逻辑模式、显示模式和ODBC模式。 数据在内部以逻辑模式存储,并可以以任何模式显示。每个数据类型类都可以通过使用LogicalToDisplay(), LogicalToODBC(), DisplayToLogical(), ODBCTtoLogical()方法来定义内部逻辑格式和显示格式或ODBC格式之间的转换。 当SQL SelectMode是显示模式时,LogicalToDisplay转换被应用,返回的值被格式化以用于显示。默认的SQL选择模式是逻辑模式;因此默认返回的值是以其存储格式显示的。 模式会影响查询结果集数据的显示格式,也会影响数据值的提供格式,如果提供的数据值与SelectMode不匹配,可能会导致错误或错误的结果。 例如,例如在WHERE子句中,如果DOB是一个以$HOROLOG逻辑格式存储的日期,而WHERE子句指定WHERE DOB > 2000-01-01(ODBC模式),SelectMode = ODBC返回预期的结果。但是,如果SelectMode = 显示模式,则生成SQLCODE -146 无法将日期输入转换为有效的逻辑日期值。如果SelectMode = 逻辑模式,则试图将2000-01-01解析为一个逻辑日期值,并返回0行。 对于大多数数据类型,三种SelectMode模式返回相同的结果。以下数据类型受到SelectMode选项的影响。 日期、时间和时间戳数据类型。 %List数据类型 - 在ODBC选择模式下,列表项之间用逗号分隔符显示。在显示选择模式下,列表项之间以空白分隔符显示。 指定VALUELIST和DISPLAYLIST的数据类型。对于必填字段,如果您在显示模式下,在字段有DISPLAYLIST的表中插入一个值,您输入的显示值必须与DISPLAYLIST中的一个项目完全匹配。对于非必填字段,不匹配的值被转换为NULL值。 空字符串,和空BLOB(流字段)。在逻辑模式下,空字符串和BLOBs由非显示字符$CHAR(0)表示。在显示模式下,它们由一个空字符串("")表示。 SQL的SelectMode可以按以下方式指定。 对于当前进程,使用SetOption("SelectMode")方法。 对于InterSystems SQL Shell会话,使用SET SELECTMODE命令。 对于来自管理门户 "执行查询 "用户界面(系统浏览器,SQL)的查询结果集,使用 "显示模式 "下拉列表。 对于一个动态SQL %SQL.Statement实例,使用%SelectMode属性。 对于嵌入式SQL,使用ObjectScript的 #SQLCompile Select 预处理器指令设置。这个指令允许第四个值,Runtime,它将选择模式设置为RuntimeMode属性的任何设置。RuntimeMode默认为逻辑模式。 #SQLCOMPILE SELECT=Logical #SQLCOMPILE SELECT=Display #SQLCOMPILE SELECT=ODBC 对于的SQL命令CREATE QUERY、CREATE METHOD、CREATE PROCEDURE和CREATE FUNCTION, 使用SELECTMODE关键字。 对于SQL查询中的单个列,使用%EXTERNAL、%INTERNAL和%ODBCOUT函数。 SELECT TOP 5 DOB,%EXTERNAL(DOB) AS ExtDOB Data Collation data collation规定了数值的排序和比较方式,它是InterSystems SQL和InterSystems IRIS对象的一部分。 你可以指定collation类型作为字段/属性定义的一部分。除非另有规定,否则字符串字段/属性默认为命名空间的默认排序。默认情况下,字符串的命名空间默认排序是SQLUPPER。SQLUPPER排序法将字符串转换为大写字母,以便进行排序和比较。因此,除非另有规定,否则字符串的排序和比较是不分大小写的。 你可以指定一个collation类型作为索引定义的一部分,或者使用被索引字段的collation类型。 一个SQL查询可以通过对字段名应用一个collation函数来覆盖已定义的collation类型的字段/属性。ORDER BY子句指定了一个查询的结果集顺序;如果一个指定的字符串字段被定义为SQLUPPER,查询结果顺序是不区分大小写的。 SQL 执行 编写和执行SQL代码的方法包括: 嵌入式SQL:在ObjectScript代码中嵌入SQL代码。 动态SQL:从ObjectScript中执行SQL代码,使用%SQL.Statement类。 Execute()方法:使用%SYSTEM.SQL类的Execute()方法执行SQL代码。 包含SQL代码的存储过程:使用CREATE PROCEDURE或CREATE QUERY创建。 SQL Shell:从终端界面执行的SQL语句。 从管理门户执行的SQL语句:系统资源管理器 -> SQL。 使用InterSystems IRIS对象(类和方法): 定义一个持久的类(一个SQL表)。 定义一个索引。 定义和使用一个类查询。
文章
Jingwei Wang · 七月 14, 2022

InterSystems SQL 的使用 - 第三部分 - 表

创建表 可以通过以下方式定义表: 通过DDL定义表 使用任意数据库管理工具执行DDL(使用ODBC,JDBC连接) MyApp.Person表可以使用DDL CREATE TABLE语句来定义,指定SQL schema.table名称。成功执行这个SQL语句会生成一个相应的持久化类,包名MyApp,类名Person。当使用DDL命令定义一个表时,你不需要指定USEEXTENTSET或创建一个位图范围索引。InterSystems SQL会自动应用这些设置,并将它们包含在预测的持久化类中。默认情况下,CREATE TABLE在相应的类定义中指定了Final类的关键字,表示它不能有子类。 CREATE TABLE MyApp.Person ( Name VARCHAR(50) NOT NULL, SSN VARCHAR(15) DEFAULT 'Unknown', DateOfBirth DATE, Sex VARCHAR(1) ) 使用Objectscript执行DDL 在ObjectScript中使用 Embedded SQL. ClassMethod CreateTable() As %String { &sql(CREATE TABLE Sample.Employee ( EMPNUM INT NOT NULL, NAMELAST CHAR (30) NOT NULL, NAMEFIRST CHAR (30) NOT NULL, STARTDATE TIMESTAMP, SALARY MONEY, ACCRUEDVACATION INT, ACCRUEDSICKLEAVE INT, CONSTRAINT EMPLOYEEPK PRIMARY KEY (EMPNUM))) IF SQLCODE=0{ WRITE "Table created" RETURN "Success"} ELSEIF SQLCODE=-201 { WRITE "Table already exists" RETURN SQLCODE} ELSE { WRITE "Serious SQL Error, returing SQLCODE " RETURN SQLCODE_" "_%msg} } 这个方法试图创建一个Sample.Employee表(以及相应的Sample.Employee类)。如果成功,SQLCODE变量被设置为0;如果不成功,SQLCODE包含一个SQL错误代码,表明失败的原因。 像这样的DDL命令,最常见的失败原因是: SQLCODE -99(特权侵犯)。这个错误表明你没有权限执行所需的DDL命令。一般来说,这是因为应用程序没有确定谁是当前用户。你可以使用$SYSTEM.Security.Login()方法以编程方式完成这个任务。 DO $SYSTEM.Security.Login(username,password) 使用 Dynamic SQL. Class Sample.NewT { ClassMethod DefTable(user As %String, pws As %String) [Language = objectscript] { Do ##class(%SYSTEM.Security).Login(user,pws) SET myddl = 2 SET myddl(1)="CREATE TABLE Sample.MyTest " SET myddl(2)="(NAME VARCHAR(30) NOT NULL,SSN VARCHAR(15) NOT NULL)" SET tStatement = ##class(%SQL.Statement).%New() SET qStatus = tStatement.%Prepare(.myddl) IF qStatus '= 1 { WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT } SET rset = tStatement.%Execute() IF rset.%SQLCODE =0 {WRITE "Created a table"} ELSEIF rset.%SQLCODE =-201 {WRITE "table already exists"} ELSE {WRITE "Unexpected error SQLCODE=",rset.%SQLCODE} } } 批量执行DDL脚本文件 使用$SYSTEM.SQL.Schema.Run()方法从终端会话中交互式地导入InterSystems SQL DDL脚本文件 使用$SYSTEM.SQL.Schema.ImportDDL("IRIS")方法作为后台作业。这个方法可以导入和执行多个SQL命令,使你能够使用一个txt脚本文件来定义表和视图,并为它们填充数据。 针对特定供应商的%SYSTEM.SQL.Schema Load方法。特定供应商的SQL被转换为InterSystems的SQL并执行。错误和不支持的功能被记录在日志文件中。例如下面的Oracle示例。 SET $namespace = "MYNAMESPACE" DO $SYSTEM.SQL.Schema.LoadOracle() 通过持久化类定义表 当编译时,这个持久化类会自动投射到一个与类定义相对应的关系表中:每个类代表一个表;每个属性代表一个列,以此类推。这个定义在MyApp schema中创建了MyApp.Person持久化类和相应的SQL表Person。持久类的名称Person被用作SQL表的名称。要提供一个不同的SQL表名,你可以使用SqlTableName类的关键字。 Class MyApp.Person Extends %Persistent { Parameter USEEXTENTSET = 1; //USEEXTENTSET 类参数被定义并设置为1,这个参数将表的存储组织成一个更有效的globals集合。 Property Name As %String(MAXLEN=50) [Required]; Property SSN As %String(MAXLEN=15) [InitialExpression = "Unknown"]; Property DateOfBirth As %Date; Property Sex As %String(MAXLEN=1); Index BitmapExtent [Extent, Type = bitmap ] //位图范围索引为范围集中的所有ID创建一个索引。这种设置使得计数和其他操作更加有效。 } 使用持久化类定义在编译时可以创建的相应的表,但是这个表定义不能使用SQL DDL命令进行修改或删除(或者使用管理门户的Drop操作),这些命令会给你提示"'schema.name'类不启用DDL...")。你必须在表类定义中指定[DdlAllowed]以允许这些操作。 Class MyApp.Person Extends %Persistent [DdlAllowed] 根据现有的表(或表或视图)来定义和填充一个新的表。 你指定一个查询和一个新的表名。现有的表名和/或新的表名可以是限定的或非限定的。查询可以包含JOIN语法。查询可以提供列名别名,成为新表中的列名。 可以使用: CREATE TABLE AS SELECT命令 CREATE TABLE Sample.YoungPeople AS SELECT Name,Age FROM Sample.People WHERE Age < 21 $SYSTEM.SQL.Schema.QueryToTable()方法执行。 DO $SYSTEM.SQL.Schema.QueryToTable("SELECT Name,Age,AVG(Age) AS AvgInit FROM Sample.Person WHERE Age < 21","Sample.Youth",1,.errors) QueryToTable()复制了现有表的DDL定义,并将其指定为新表的名称。它复制查询中指定的字段的定义,包括数据类型、最大长度和最小值/最大值,但不复制字段的数据约束,如默认值、要求值或唯一值。它不会从一个字段复制引用到另一个表中。 如果查询指定SELECT *或SELECT %ID,原始表的RowID字段将被复制为数据类型为整数的非必填、非唯一的数据字段。QueryToTable()为新表生成了一个唯一的RowID字段。如果复制的RowID被命名为ID,生成的RowID被命名为ID1。 QueryToTable()为这个新表创建一个相应的持久化类。该持久化类被定义为DdlAllowed。新表的所有者是当前用户。 新表被定义为默认存储=YES和支持位图索引=YES,不管源表中的这些设置如何。为新表创建的唯一索引是IDKEY索引,没有生成位图范围索引。被复制的字段的索引定义不会被复制到新表中。 $SYSTEM.SQL.Schema.TableExists()方法可以用来确定一个表的名字是否已经存在。 RowID 在SQL中,每条记录都由一个唯一的整数值来标识,称为RowID。 在InterSystems SQL中,你不需要指定一个RowID字段。当你创建一个表并指定所需的数据字段时,会自动创建一个RowID字段。这个RowID在内部使用,但没有被映射到一个类属性。默认情况下,只有当一个持久化类被投射到一个SQL表时,它的存在才是可见的。在这个投射表中,会出现一个额外的RowID字段。 默认情况下,这个字段被命名为 "ID "并被分配到第1列,且这个字段是自增的,不会被重复使用。因此,如果记录被插入和删除,RowID值将是升序的数字序列,但可能不是数字连续的。且ALTER TABLE不能修改或删除RowID字段的定义。RowID计数器可以通过TRUNCATE TABLE命令被重置,但它不会被DELETE命令重置,即使DELETE命令删除了表中的所有记录。如果没有数据被插入到表中,或者TRUNCATE TABLE被用来删除所有表的数据,IdLocation存储关键字的global是未定义的。 默认情况下,InterSystems IRIS将这个字段命名为 "ID",然而这个字段名并不保留。RowID字段名在每次编译表的时候都会重新建立。如果用户定义了一个名为 "ID "的字段,当表被编译时,InterSystems IRIS将RowID命名为 "ID1"。例如,如果用户随后使用ALTER TABLE来定义一个名为 "ID1 "的字段,表的编译就会将RowID重命名为 "ID2",以此类推。在一个持久化的类定义中,你可以使用SqlRowIdName类关键字来直接指定这个类所投射的表的RowID字段名。由于这些原因,应该避免用名字来引用RowID字段。 InterSystems SQL提供了%ID伪列名(别名),它总是返回RowID值,不管分配给RowID的字段名是什么。(InterSystems TSQL提供了$IDENTITY伪列名,它也做同样的事情)。 默认情况下,使用CREATE TABLE定义的表使用$SEQUENCE执行ID分配,允许多个进程同时快速填充表。当$SEQUENCE被用来填充表时,一个RowID值的序列被分配给一个进程,然后按顺序分配它们。因为并发的进程使用他们自己分配的序列来分配RowID,所以不能假设由一个以上的进程插入的记录是按照插入的顺序进行的。 当使用CREATE TABLE创建一个表时,RowID默认是隐藏的。一个隐藏的字段不会被SELECT *显示,并且是PRIVATE。当你创建一个表的时候,你可以指定%PUBLICROWID关键字来使RowID不被隐藏并且是公开的。这个可选的%PUBLICROWID关键字可以在CREATE TABLE逗号分隔的表元素列表中的任何地方指定,但不能在ALTER TABLE中指定。 当创建一个投射为表的持久化类时,RowID默认不会被隐藏。它通过SELECT *显示,并且是公共的。你可以通过指定类的关键字SqlRowIdPrivate来定义一个RowID为隐藏和PRIVATE的持久化类。 作为外键引用的RowID必须是公共的。默认情况下,一个具有公共RowID的表不能被用作源表或目标表,例如使用 INSERT INTO Sample.DupTable SELECT * FROM Sample.SrcTable 将数据复制到一个重复的表。 你可以使用管理门户SQL界面来查看RowID是否被隐藏。 基于其他字段的RowID 通过定义一个投射表的持久化类,你可以将RowID定义为来自一个字段或一个字段组合的值。要做到这一点,用IdKey索引关键字指定一个索引。例如,通过PatientName字段的值指定索引定义 IdxId On PatientName [IdKey]; 或者通过PatientName和SSN字段的合并值指定索引定义 IdxId On (PatientName,SSN) [IdKey] 但是,基于字段的RowID比采取系统分配的连续正整数的RowId效率低。 在INSERT中:为构成RowId的字段或字段组合指定的值必须是唯一的。指定一个非唯一的值会产生一个SQLCODE -119 "UNIQUE或PRIMARY KEY约束在INSERT时唯一性检查失败"。 在UPDATE中:默认情况下,组成RowId的每个字段的值是不可修改的。试图修改这些字段之一的值会产生一个SQLCODE -107 "不能UPDATE RowID或基于字段的RowID"。 当一个RowID基于多个字段时,RowID的值是由||操作符连接的每个组成字段的值。例如,Ross,Betsy||123-45-6789。InterSystems IRIS试图确定基于多个字段的RowID的最大长度;如果它不能确定最大长度,RowID长度默认为512。 主键 InterSystems IRIS提供两种方法来唯一地识别表中的行:RowID和主键。 可选的主键是一个有意义的值,应用程序可以用它来唯一地识别表中的一行(例如在连接中)。一个主键可以是用户指定的数据字段,也可以是一个以上的数据字段的组合。主键值必须是唯一的,但不要求是整数值。RowID是一个内部使用的整数值,用于识别表中的一行。通常情况下,主键是一个由应用程序生成的值,而RowID是一个由InterSystems IRIS生成的唯一整数值。 系统会自动创建一个master map来访问使用RowID字段的数据行。如果你定义了一个主键字段,系统会自动创建并维护一个主键索引。 显然,有两个不同的字段和索引来识别行,这种双重性不一定是好事。你可以通过以下两种方式中的任何一种解决单一的行标识符和索引: 使用应用程序生成的主键值作为IDKEY。你可以通过在类定义中使用关键字PrimaryKey和IdKey来识别主键索引,当然,也可以从DDL中这样做。这使得主键索引成为表的主映射。因此,主键将被用作行的主要内部地址。如果主键由一个以上的字段组成,或者主键值不是整数,这可能会降低效率。 不要使用应用程序生成的主键值,而是使用应用程序内系统生成的RowID整数作为应用程序使用的主键(例如在连接中)。这样做的好处是,整数的RowID适合于更有效的处理,包括使用位图索引。 根据应用程序的性质,你可能希望解决一个单一的行标识符和索引,或者为应用程序生成的主键和系统生成的RowID设置单独的索引。 特殊字段:RowVersion字段 , 自增字段, 和 Serial 计数器字段 InterSystems SQL支持三种特殊用途的数据类型,用于自动递增计数器的值。这三种数据类型都是扩展%Library.BigInt数据类型类的子类。 %Library.RowVersion: 计算对所有RowVersion表的插入和更新的命名空间。只有包含ROWVERSION字段的表的插入和更新才会增加这个计数器。ROWVERSION值是唯一的,不可修改的。这个全命名空间的计数器从不重置。可以通过指定一个数据类型为ROWVERSION(%Library.RowVersion)的字段来创建一个RowVersion字段。你只能在每个表中指定一个ROWVERSION数据类型字段。试图创建一个有一个以上ROWVERSION字段的表会导致5320编译错误。RowVersion字段不应该被包含在唯一键或主键中。RowVersion字段不能成为IDKey索引的一部分。 %Library.Counter(也被称为SERIAL计数器字段)。计算插入到表中的次数。默认情况下,这个字段接收一个自动递增的整数。然而,用户可以为这个字段指定一个非零的整数值。用户可以指定一个重复的值。如果用户提供的值大于系统提供的最高值,自动递增计数器被设置为从用户指定的值开始递增。这个计数器通过TRUNCATE TABLE命令被重置为1。它不会被DELETE命令重置,即使DELETE命令删除了表中的所有记录。分片的表不能有SERIAL计数器字段。 %Library.AutoIncrement: 计算插入到表中的次数。默认情况下,这个字段接收一个自动递增的整数。然而,用户可以为这个字段指定一个非零的整数值。用户可以指定一个重复的值。指定一个用户值对自动递增计数器没有影响。 所有这三个字段和IDENTITY字段都返回AUTO_INCREMENT = YES,如下面的例子所示。 查看表定义 表信息 INFORMATION.SCHEMA.TABLES持久化类显示当前命名空间中所有表(和视图)的信息。包括模式和表名,表的所有者,以及是否可以插入新记录。TABLETYPE属性表明它是一个基础表还是一个视图。 SELECT Table_Type,Table_Schema,Table_Name,Owner FROM INFORMATION_SCHEMA.TABLES INFORMATION.SCHEMA.CONSTRAINTTABLEUSAGE持久化类为当前命名空间中的每个表定义的每个主键(显性或隐性)、外键或唯一约束。 INFORMATION.SCHEMA.KEYCOLUMNUSAGE为当前命名空间中的每个表的每个已定义的约束。 也可以使用管理门户SQL界面中的目录详情来查看表信息。 列信息 GetColumn 方法 SET stat = ##class(%SYSTEM.SQL.Schema).GetAllColumns("MyApp.Person",.byname,.bynum) IF stat=1 { SET i=1 WHILE $DATA(bynum(i)) { WRITE "name is ",bynum(i), "column is ", i, ! } }ELSE{ WRITE "GetAllColumns() cannot locate specified table"} 生成结果: name is ID col num is 1 name is Age col num is 2 name is Home col num is 3 name is Name col num is 4 SQL脚本 INFORMATION_SCHEMA.COLUMNS可以列出指定schema的所有列名: SELECT TABLE_NAME,COLUMN_NAME,ORDINAL_POSITION,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,COLUMN_DEFAULT,IS_NULLABLE,UNIQUE_COLUMN,PRIMARY_KEY FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='MyApp' ​ 或者 ​ SELECT TOP 0 * FROM tablename. Constraints信息 INFORMATION.SCHEMA.TABLECONSTRAINTS持久化类列出了表名,约束类型和约束名称。约束类型包括UNIQUE, PRIMARY KEY, 和 FOREIGN KEY。 SELECT Table_Schema,Table_Name,Constraint_Type,Constraint_Name FROMINFORMATION_SCHEMA.TABLE_CONSTRAINTS INFORMATION.SCHEMA.CONSTRAINTCOLUMNUSAGE持久化类列出了表名、列名和约束名称。如果一个约束涉及到多个列,那么每一个列都会列出一个单独的项目。 SELECT Table_Schema,Table_Name,Column_Name,Constraint_Name FROMINFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE INFORMATION.SCHEMA. REFERENTIALCONSTRAINTS持久化类列出了外键约束,包括引用表(CONSTRAINT_SCHEMA, CONSTRAINT_TABLE_NAME),被引用表(UNIQUE_CONSTRAINT_SCHEMA, UNIQUE_CONSTRAINT_TABLE),外键名称(CONSTRAINT_NAME),以及UPDATE和DELETE参考动作(UPDATE_RULE,DELETE_RULE),值为NO ACTION,SET DEFAULT,SET NULL,或CASCADE。 SELECT Constraint_Table_Name,Unique_Constraint_Table,Constraint_Name,Update_Rule,Delete_Rule FROMINFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 连接外部表 在InterSystems SQL中,你也可以有 "外部表",即在SQL字典中定义的表,但存储在一个外部关系数据库中。外部表的作用就像它们是本地的InterSystems IRIS表一样:你可以对它们发出查询,执行INSERT、UPDATE和DELETE操作。 对外部数据库的访问是由InterSystems SQL Gateway提供的,它使用ODBC或JDBC提供透明的连接。
公告
Claire Zheng · 八月 11, 2022

网络研讨会:使用ECP在AWS上扩展 InterSystems FHIR Server

Hi 社区成员们, 我们很高兴地宣告 社区网络研讨会 回归了! 我们诚邀您参加 @Ron.Sweeney1582 主讲的 使用ECP在AWS上扩展InterSystems FHIR Server 网络研讨会。 Join this webinar to make a technical deep dive, see a demonstration, and benchmark horizontal scaling InterSystems FHIR Server on Amazon Web Services with Enterprise Cache Protocol (ECP). 欢迎加入此次网络研讨会,深入了解技术,观看演示,并在AWS上使用企业缓存协议(ECP)基准测试水平扩展InterSystems FHIR Server。 ⏱ 时间: 8月18日(周四)8am (美国东部时间) | 2:00pm (中欧夏季时间)| 8:00pm (北京时间)👨‍🏫 主讲人: @Ron.Sweeney1582, 全栈架构师,来自Integration Required 关于 Integration Required: 我们是一个针对InterSystems®工作负载的全栈技术交付团队,可根据您的安全状况和组织部署标准进行定制。凭借InterSystems®十年的合作伙伴关系和对客户满意度的严格坚持,客户对我们充满信任,我们能够实现最佳实践。 那么,不要错过这次机会!来了解更多关于扩展FHIR、ECP和AWS的知识吧! Don't miss this opportunity to learn more about scaling FHIR, ECP and AWS and how to mix it all! >> 点击注册 <<
公告
Michael Lei · 十月 26, 2021

InterSystems IRIS和InterSystems IRIS for Health的完整套装版本供开发人员使用!

InterSystems很高兴地宣布一个全新的 开发者下载网站 提供InterSystems IRIS社区版和InterSystems IRIS for Health社区版的完整配套版本。 这些都是免费提供给应用开发者使用的。 你可以选择直接从 InterSystems开发者社区 直接 下载 InterSystems IRIS. 这些实例包括一个免费的内置13个月的许可证。 它们限制在10GB的用户数据,将在8个核心的机器上运行,支持5个并发连接,并支持应用开发。可用的平台。RedHat, Ubuntu, SUSE, Windows和macOS InterSystems IRIS 和 InterSystems IRIS for Health医疗版也可以从Docker Hub获得容器版. 请在这里查看如何开始,访问我们网站上的InterSystems IRIS 数据平台或InterSystems IRIS for Health 医疗版,了解更多关于我们的产品,并访问 开发者资源页面深入了解开发。 如果您之前注册了InterSystems登录账户(如开发者社区或WRC),您可以使用这些账户来访问开发者下载网站 。