Hey Community,
Play the new video on InterSystems Developers Bilibili官方频道:
Hey Community,
Play the new video on InterSystems Developers Bilibili官方频道:
各位开发者好
欢迎观看InterSystems Bilibili官方频道的最新视频 InterSystems Developers Bilibili:
索引分析器工具用来分析索引的使用情况,对DBA和开发者非常有用。 他们需要知道那些查询进行了全表扫描,那些查询缺失了索引, 而那些索引从来又从来没有被用过。多余的索引降低系统性能,浪费了磁盘空间。
索引使用情况
到“管理门户”的" 系统 > SQL 性能工具 > SQL 索引分析器", 点击**“索引使用情况”**, 您将看到这样的图

执行SQL语句查询会带来更多的灵活性。上面的查询可以写成下面这个SQL,
SELECT TableName, indexname, UsageCount
FROM %SYS_PTools.UtilSQLAnalysisDB order by usagecount desc
2016年以后的Caché版本就已经有了'索引使用情况'的查询。使用管理门户没有区别, 但SQL语句不同,使用的是比较老的类和表名,各位请参考文档。
注意上图中另外几个按钮,它们的介绍在文档的这个链接, 简单的做个翻译:
全表扫描的查询:
可识别当前命名空间中进行全表扫描的所有查询。应尽可能避免全表扫描。全表扫描并非总能避免,但如果某个表有大量全表扫描,则应检查为该表定义的索引。通常情况下,表扫描列表和临时索引列表会重叠;修复一个会移除另一个。结果集列出了从最大块计数到最小块计数的表。显示计划链接可显示语句文本和查询计划。
SQL Performance Analysis Toolkit,或者叫SQL性能分析工具,并不是给维护人员使用的。
在RIS文档里是这么说的: 这个工具包里的工具收集SQL执行的详细信息,用来找出一个查询计划的特殊问题。 使用这些信息,开发人员改善这个查询的效率。 它可以非常大的增加服务器的开销。..., 它不应该被持续执行。
要做分析,首先您需要打开一个采集“SQL runtime Statistics"的开关来收集详细信息,这个开关默认的状态是OFF。 文档里说: The SQL Performance Analysis Toolkit offers support specialists the ability to profile specific SQL statements or groups of statements.
这里的"support specialists"指的是厂家的技术支持人员。
因此,总结如下:
为什么要读Query Plan, 在线文档中有句话是这么说的:
While the SQL compiler tries to make the most efficient use of data as specified by the query, sometimes the author of the query knows more about some aspect of the stored data than is evident to the compiler. In this case, the author can make use of the query plan to modify the original query to provide more information or more guidance to the query compiler.
翻译一下是这样:系统给你的查询计划并不总是最好的,如果您能对查询计划,可以人工做更精细的优化。
我们先看看读Query Plan的几个基本知识:
MAP
An SQL table is stored as a set of maps. 您有看到3种map: Master map, index map, bitmap.
# 回表读主数据,
- Read master map DWBC.CT_Dept.
人工智能不仅限于通过带有说明的文本生成图像,或通过简单的指示创建叙事。
您还可以制作图片的变体,或为已有图片添加特殊背景。
此外,您还可以获得音频转录,无论其语言和说话者的语速如何。
让我们来分析一下文件管理是如何工作的。
此视频帮助大家了解InterSystems如何帮助CRO来加快临床数据采集和更快地推广市场。
演讲嘉宾:
Jim Coutcher, Senior Director/Principal, Global Head of Enriched Studies, Real World Solutions, IQVIA
Qi Li, Physician Executive, InterSystems
Matt Stannard, life Sciences Advisor, InterSystems
欢迎大家来我们的 Bilibili主页观看更多视频!
.png)
生成人工智能是能够使用生成模型生成文本、图像或其他数据的人工智能,通常是响应提示。生成式人工智能模型学习输入训练数据的模式和结构,然后生成具有相似特征的新数据。
生成式人工智能是能够生成文本、图像和其他类型内容的人工智能。它之所以成为一项出色的技术,是因为它使人工智能民主化,任何人都可以使用它,只需文本提示,即用自然语言编写的句子。
大型语言模型如何工作

✓ 三月有 41 位新成员加入
✓ 截至目前共发布了 2,080 篇帖子
✓ 截至目前共有 1,752 位成员加入
2024年3月26日,InterSystems数据平台全球主管Scott Gnau发文,宣布InterSystems IRIS数据平台新增了向量搜索(vector search)功能。
本文作者为Scott Gnau,InterSystems数据平台全球主管。
2023.12.31之前的所有百讲课程,总计261讲。IRIS、Cache编程知识的免费课程。2024年3月29日-3月31日,由国家卫生健康委医院管理研究所主办、《中国数字医学》杂志社有限公司承办的“2024中华医院信息网络大会(CHINC)”将在青岛国际会展中心(红岛馆)举办。InterSystems诚邀您莅临展会,我们带来了内容丰富的Demo演示,包括:InterSystems IRIS 2024.1新特性、 InterSystems IRIS矢量存储和矢量查询、InterSystems FHIR数据资产化解决方案,以及InterSystems IRIS医疗版互联互通套件解决方案。
2024 CHINC期间,InterSystems在合作伙伴东华医为展位(B3馆-A02)设立Demo演示区,即日起即可预约现场Demo咨询,欢迎点击【此处】注册预约。
日志总是出现如下“严重”级别报错,这个错误要紧吗?
03/13/24-09:44:12:182 (39059) 2 [SYSTEM MONITOR] WriteDaemon Alert: Write Daemon still on pass 581
在 Documentation 里搜索关键词也只有如下信息,哪里还能找到更详细的教程或说明呢?
SYS.History.WriteDaemon — The properties in this class describe the performance of write daemon cycles. The system automatically keeps track of the last 20 write daemon cycles, and the History Monitor stores the data for the cycles that occurred in each interval. Typically, there are multiple cycles within each interval.
Cache 的资料太少了,想买本书来学习都买不到。
这个帖子内容有点深。如果您读的有困难,请直接跳过这篇,对绝大多数IRIS/Caché使用者,它一点都不重要。
数据库表的Collation(排序规则)本来是一个非常简单的概念。说到它是因为曾经发现过由Collation引起的性能问题。
我试图用一句话来解释数据库的排序规则:
很简单,在表一级定义Collation的SQL语句是:
CREATE TABLE Sample.MyNames (
LastName CHAR(30),
FirstName CHAR(30) COLLATE SQLstring)
事情在IRIS/Caché里变的有点复杂。
这是在 IRIS 中完全运行向量搜索演示的尝试。
没有外部工具,您需要的只是终端/控制台和管理门户。
特别感谢Alvin Ryanputra作为他的软件包iris-vector-search的基础
灵感和测试数据的来源。
我的软件包基于 IRIS 2024.1 版本,需要注意您的处理器功能。
我尝试用纯 ObjectScript 编写演示。
仅描述向量的计算是在嵌入式Python中完成的
计算 2247 个记录的 384 维向量需要时间。
在我的 Docker 容器中,它正在运行 01:53:14 来完全生成它们。
然后被警告了!
所以我将这一步调整为可重入,以允许暂停向量计算。
每 50 条记录,您就会收到一次停止的提议。
该演示如下所示:
用户>做^A.DemoV 测试向量搜索 ============================= 1 - 初始化表 2 - 生成数据 3 - VECTOR_余弦 4 - VECTOR_DOT_产品 5 - 制作苏格兰威士忌 6 - 加载 Scotch.
Bitmap索引是指对某个,或者某几个字段建立的bit map(位图映射)。如果是对整个表的记录,也就是表的%ID做位图映射,得到的特殊的bitmap索引在IRIS/Caché里被称为Bitmap Extent。
建立Bitmap Extent索引的目的就是加快COUNT(*)的执行。提高了多少呢? 下面两个显示的是最简单的全表查询花费的时间:
相差有几百倍。
.png)
.png)
有关Bitmap Extent你需要了解:
Index DDLBEIndex [ Extent, SqlName = "%%DDLBEIndex", Type = bitmap ];
CREATE BITMAPEXTENT INDEX Patient ON TABLE Sample.Patient
本文汇聚了与FHIR相关的内容,包括新闻资讯、线上研讨会、视频、客户案例、行业洞察等,欢迎收藏保存!
01| 新闻资讯
02 | 线上研讨会
**复合索引(combined index)**也被称为组合索引或者联合索引,顾名思义,就是一个索引建立在多个字段上。当用这些字段为条件查询时,相比对每个字段单独做索引,复合索引能给出很好的性能,还能减少索引的数量。
为什么能减少索引的数量? 通常来说,也就是在其他数据库,联合索引符合”最左匹配“的原则。在BING上搜索“复合索引,得到的第一个搜索结果的这篇文章就说的就很简单明了:
下面这个SQL语句在 列X,列Y,列Z 上建立了一个复合索引。
CREATE INDEX 索引名 ON 表名(列名X, 列名Y, 列名Z);其实这相当于建立了三个索引,分别是:
- 单列索引(列X)
- 复合索引(列X, 列Y)
- 复合索引(列X,列Y,列Z)
而Caché/IRIS是不承认最左匹配原则的,Caché/IRIS的原则非常简单粗暴: 既然定义了索引在这些字段上,查询中必须同时有所有这些字段。 也就是说,这个复合索引
CREATE INDEX 索引名 ON 表名(列名X, 列名Y, 列名Z);
单按列名X,或者“列名X and 列名Y”做SQL查询都用不到这个索引。
正确的使用Bitmap Index (位图索引)来代替普通索引,可以成百上千倍的提高SQL查询性能。
先来看看Bitmap索引和普通索引的区别。我来在Patient表的Sex字段上创建两个索引
然后创建10个病人数据,查看索引的内容:
# 普通索引
^User.PatientI("idxSex"," F",1) = ""
^User.PatientI("idxSex"," F",6) = ""
^User.PatientI("idxSex"," F",8) = ""
^User.PatientI("idxSex"," M",2) = ""
^User.PatientI("idxSex"," M",3) = ""
^User.PatientI("idxSex"," M",4) = ""
^User.PatientI("idxSex"," M",5) = ""
^User.PatientI("idxSex"," M",7) = ""
^User.PatientI("idxSex"," M",9) = ""
^User.PatientI("idxSex"," M",10) = ""
# bitmap索引
^User.InterSystems IRIS ®,InterSystems IRIS ® for Health TM和HealthShare ® Health Connect 2024.1版现已全面上市 (GA)。
发布亮点
在此版本中,您可以期待许多令人兴奋的更新,包括:
请通过开发者社区分享您的反馈,以便我们共同构建更好的产品。
有关所有突出显示功能的详细信息可通过以下链接获得:
Caché/IRIS的特点是运行Global的修改,而这个修改和SQL是无关的,因此非常容易出现数据库表数据完整性的问题,也就是表中的数据是不是符合定义的表约束。
这样的情况非常常见。有些是人为的对Global的错误修改, 有些是应用系统的事务性管理写的不对,造成事务回滚的时候破坏了索引的完整性。无论什么原因,只要使用Global操作,破坏SQL的完整性非常难以避免。结果就是SQL查询给出错误结果。
最简单的解决方法就是执行“索引检查(Validate Indices)"
我们来做个实验
- 先修改一个global: 如下图, 将Patient表的一个记录的SEX字段,从'M'改到‘F'.

运行索引检查, 结果会提示您问题在什么地方。
SAMPLES>do ##class(Patient).%ValidateIndices()
Checking index integrity for class 'User.Patient'
Begin time: 03/19/2024 15:25:43
Verifying data from data map 'IDKEY' is indexed correctly.上个帖子写了TuneTable的执行, 提到了SQL优化器使用的那些统计数据, 这里逐一的介绍一下这些统计项。了解它们看懂和分析SQL执行计划的基础。 如果您不需要做单个查询的优化工作,可以调过这部分内容。
表的统计项
您还需要了解:表创建的时候Extent Size会获得一个初始值,而之后的插入修改数据并不自动修改这个值。而只有执行TuneTable才会修改这个。 这也就是为什么没有执行过TuneTable的数据库SQL性能好不了的原因。下图中的Patient表,可以看出有1,000,000记录
.png)
字段的统计项
请看下面的图
.png)
选择性取值可以是1或者一个百分数。取值为1说明这是个unique的字段,比如上图的ID, PatientNumber。 %表示的值,取值越高说明唯一性越低。比如上图中的Name的选择性是1.2987%,说明不是唯一值,有重复的姓名,但比例不高。 相反,Sex的选择性是50%, 说明只有两个取值。
始用于Caché2014.
IRIS/Caché查询慢,主要原因有以下几个:
这是慢的原因,不是慢的离谱的原因。数据模型是产品设计的范畴, 这里不讨论, 本文只讨论优化。
虽然还是设计问题,但可以在实施中或者维护中给出优化方案。
IRIS/Caché数据平台的一个特点是允许跳过SQL约束,对底层数据的直接修改。坏的代码或者应用可能破坏表数据和表索引的约束,造成SQL性能的下降。维护人员应该知道怎么避免,和处理这样的问题。
比如Tune Table(调整表), 这是必须做的工作,但可惜很有些项目没有执行过。
还有些其他暂时没想到的原因。我会在以下链接的帖子里和各位分享我的参与的一些知识和经验。这些经验是从一些SQL优化的工作中学到的,包括Caché 2010, 2016, IRIS, HealthConnect/Ensemble的项目。比如在最近的一个IRIS项目中, 我和另一个合作伙伴的工程师将IRIS 2021上的HIS数据库的100个SQL查询的平均查询时间从几十秒降低到几秒, 最慢的查询从50分钟降低到10几秒钟。
TuneTable(调整表)收集数据库中表的统计信息,用来为SQL引擎制定最优的执行计划。在其他数据库产品里,这个动作被称为“gather stats job"或者类似的名字,相比较TuneTable不是那么直白,但作用是一样的。
一定要。
在IRIS 2023版本, 第一次加入了TuneTable的自动执行功能,在此之前的所有IRIS/Caché版本, 如果没有人工执行TuneTable, SQL引擎无法保证给出最好的查询计划。 即使是IRIS2023有了自动执行功能,也还需要人工执行TuneTable的操作,后面解释。
到“管理门户>SQL"页面, 打开一个表, 看“目录详情”,如下图, 如果其中的“选择性”,"离群值选择性“, ”离群值“,“平均字段大小”这些字段有数据, 说明这个表至少做过了一次TuneTable.

除了“字段”按钮页,在“表信息”还有统计项 “ExtentSize", “索引”页,包含每个索引的统计信息项。
关于这些统计项的想象解释, 我会在下个帖子里介绍。
简单的说:对于查询所用的表,SQL引擎要有以上有统计信息,而且足够准确。
解释以下“足够准确”。
近来生成式大语言模型掀起了革命性的AI浪潮。生成式大语言模型是什么原理?我们怎么在业务中利用它?
生成式大语言模型是生成式人工智能底层的机器学习模型,是一种用于自然语言处理的深度学习模型。
人工智能、机器学习与大语言模型的关系如下图:
.png)
大语言模型的“大”体现在多个方面:
大语言模型是事先训练好的模型。
训练时,大语言模型基于各种语料 - 人类知识库(例如Wikipedia)、公共数据集、网络爬虫数据,让模型进行“填空”练习,并经过人工编辑和“校对” 训练出来的,需要成千上万的GPU建立集群进行训练。根据Meta的信息,其Llama 2 的训练数据达到了两万亿个token,上下文长度为4096,对话上也是使用100万人类标记的数据微调。
运行时,训练产生的大语言模型可以在小的多的硬件上运行。
冰冻三尺,非一日之寒;滴水穿石,非一日之功。生成式大语言模型能够落地经历了相当漫长的技术积累与进步。
IRIS 2024.1已经发布,它引入了诸多新特性,其中之一是JSON_TABLE。
数据表达和交换中,JSON已经是日益主流的存在。在之前的IRIS版本中,可以轻易将JSON数据以对象解析并保存到IRIS,也可以将IRIS数据使用SQL、对象等多种方式输出为JSON。对于得到的JSON序列化的数据,如果我们想通过SQL去解析,甚至进行检索和查询,就可以利用JSON_TABLE这个新特性。
对于一些大规模的JSON序列化数据,例如从FHIR服务器查询获得的FHIR资源Bundle,里面包含了大量数据。例如下面的FHIR查询结果,后面的示例以这个的复杂的JSON作为用例:
{
"resourceType": "Bundle",
"id": "cf34e50f-e350-11ee-821c-005056b6b4c5",
"type": "searchset",
"timestamp": "2024-03-16T04:51:10Z",
"total": 2,
"link": [
{
"relation": "self",
"url": "http://172.19.85.随着科技的发展,医疗行业也在不断的进步,人类也往往更加关注自身的健康,
通过计算机学习和处理数据集,可以预测疾病。
前提条件:使用 FHIR 和 ML的能力
首先,我们的数据集从kaggle获得,并根据患者性别、年龄、ALP或ALT转化为FHIR资源,并导入到FHIR资源库中
要导入FHIR资源库,我们可以使用以下命令:
Set sc= ##class (HS.FHIRServer.Tools.DataLoader).SubmitResourceFiles( "/usr/local/src/json/" , "FHIRSERVER" , "/csp/healthshare/fhirserver/fhir/r4" )其中文件地址和fhir资源库URL可以根据情况进行修改。
.png)
.png)
配置转换规则,这一点非常重要。它们可以获得你想要的数据,也可以省略患者的一些敏感信息,保证数据安全
.png)
配置完成后,创建一个投影,以查询数据库中的相应表
.png)
创建投影后,通过创建表或视图将表汇总成训练所需的结构
create view T2.HepatitisData AS SELECT TP.ID, TP.
这是 IRIS 与 RAG(检索增强生成)示例的一个简单演示。
后端是使用 IRIS 和 IoP用 Python 编写的,LLM 模型是 orca-mini 并由 ollama 服务器提供。
前端是用 Streamlit 编写的聊天机器人。
RAG 是 Retrieval Augmented Generation(检索增强生成)的缩写,它带来了使用带有知识库的 LLM 模型(GPT-3.
在上一篇文章中,我们了解了如何恢复存储在特定 HIS 数据库中的资源,因此今天我们将了解如何在 HIS 中添加新记录,其来源是我们在系统中收到的 FHIR 资源。
FHIR 的主要功能之一是通过 Rest API 支持 CRUD 操作,这意味着任何使用 FHIR 的系统都必须提供对 GET、POST、PUT 和 DELETE 类型的 HTTP 调用的支持。在今天的文章中,我们将了解如何管理对安装 FHIR 适配器时自动配置的端点的 POST 调用。
如果我们回顾资源存储调用的 FHIR 规范,我们会发现它告诉我们,用于调用的 URL 必须遵循以下格式:
http(s)://server_url/{endpoint}/{Resource}
在我们的示例中,我们将不使用安全调用,因此我们的 URL 将如下所示:
http://localhost:52774/Adapter/r4/Patient
由于我们想要记录新患者,因此我们必须在调用正文中使用患者数据进行 POST 调用。在我们的例子中,调用格式将是 application/fhir+json,不过我们也可以使用XML格式的application/fhir+xml,不会有任何问题。
在上一篇文章中我们已经看到了Patient资源的定义,所以这里不再重复,我们将看到的是我们格式化的测试患者是什么样子的。
人工智能(AI)最近受到广泛关注,因为它可以改变我们生活的许多领域。更好的计算机能力和更多数据帮助人工智能完成了许多惊人的事情,例如改进医学测试和制造自动驾驶汽车。人工智能还可以帮助企业做出更好的决策,提高工作效率,这也是人工智能越来越流行和广泛应用的原因。如何将 OpenAI API 调用集成到现有的 IRIS 互操作性应用程序中?
