搜索​​​​

清除过滤器
文章
Qiao Peng · 二月 22, 2023

InterSystems IRIS的面向对象数据库特性

面向对象编程的优势 在应用程序开发时,我们使用的大多数开发语言都是面向对象编程 object-oriented programming (OOP)语言,例如大家熟悉的Java、.NET。而TIOBE的2023年2月的最新开发语言流行排行榜上,前5大语言都是面向对象编程语言,连排名第六的Visual Basic都有了越来越多的OO特性: 为什么使用面向对象编程这么流行?因为它有诸多优势: 封装:将数据和操作数据的代码封装在一个单元中,在确定范围的数据上进行编程。方便代码的开发、管理与分享。 抽象:将业务数据概括为不同的对象类型,从而进行业务分组开发、简化程序。 继承:一个类可以从另一个类继承它属性和行为,从而实现更大范围的代码复用。 多态:多个对象可以创建自一个类,且可以有不同的行为。一段灵活的代码能实现多种形态的业务,它进一步降低了代码开发量和调用难度。 而这4个优势正是面向对象编程的核心特征。 关系型数据库的对象/关系错配 虽然面向对象编程是绝对的主流,但数据通常被保存到关系型数据库中。关系型数据库的行和列二维关系与复杂的对象并不匹配: 面向对象的核心特性:封装、抽象、继承、多态,关系数据库都无法直接支持。 对象可以表达复杂的多维度、多类型的数据集,关系性数据库只能表达二维(行和列)、简单类型的数据集。例如对于集合类型-列表或数组,面向对象可以直接将其作为对象的属性,而关系型数据库只能用额外的关联子表或序列化为字符串/字符流等进行表达。 面向对象间通过继承、引用等方式建立对象间关系,关系性数据库通过外键建立表之间的关系。例如人和患者这两个业务概念,在面向对象编程中可以是两个有继承关系的对象类 – 子类患者的属性和方法多数是由人继承来的;而在关系数据库中,只能表达为没有关系的两张表,无法体现这种关系。 在表达和操作数据的方式上, 面向对象基于封装原则,其中数据和操作该数据的代码被组合到一个单元中。而关系数据库基于规范化原则,其中数据被分成单独的表以最小化数据冗余并提高查询性能。例如患者和其病历这两个业务概念,在面向对象编程中病历是患者对象类中的一个集合属性,通过患者可以直接操作病历集和每一份病历;而在关系数据库中,只能表达为通过外键关联的两张表:患者表和病历表。还要保证一个业务对象操作时对应多张表的事务一致性问题。 简单比喻一下这种错配,这就像一辆车,我们使用面向对象方式操作时,是以整车的形式操纵它;但存这辆车时,我们要把它先拆成零件 – 发动机、轮胎、车架… - 分类保存,取车时,再把零件组装起来才能上路。 为了应对这种对象关系错配,通常有三种方法: 自己开发数据映射逻辑,将一个对象拆成对应的多张表,自己维护保存对象数据时的SQL(可能是复杂的存储过程)和从SQL获取数据后组合为对象的代码。 使用对象关系映射 (ORM)框架,例如Hibernate,来自动实现对象模型和关系模型间的映射。它增加了系统的复杂度、降低了性能和可靠性。 直接使用面向对象数据库管理系统。 InterSystems IRIS的面向对象特性 InterSystems Caché和InterSystems IRIS作为多模型数据库管理系统,其面向对象数据库特性在全球面向对象数据库排名中分列第1、第2位。它提供了丰富的面向对象特性和对包括SQL的支持。 完整的OO特性 InterSystems IRIS提供了完整的面向对象特性:封装、多重继承、多态。 封装 InterSystems IRIS可以将数据、逻辑和复杂的模型关系封装在类中。在类中,可以定义: 属性: 支持任意复杂的属性类型,包括简单数据类型、对象型类型、关系型类型、集合类型、透明类型、计算类型等。并支持对属性的复杂约束,例如取值范围约束、模式约束、唯一性约束等 参数:静态属性 方法:操作对象的方法,可以是静态方法或实例方法。方法可以是私有方法,从而不会被继承。InterSystems IRIS提供方法生成器的概念:方法是创建方法实现的程序。使用方法生成器,可以创建类、为不同的情况自动生成特定的应用代码。 索引:用于加速数据检索等索引,支持多种索引类型,包括普通索引、位图索引、位片索引;支持复合索引 查询:封装好的对数据的查询方法,可以基于对象或SQL构建对数据的查询,并可封装为SQL视图或SQL存储过程 持久化方案:可以动态调整的底层多维存储方案。调整持久化方案,不影响以对象和SQL方式对数据的操作与查询代码 /// 人 Class User.Person Extends (%Persistent, %XML.Adaptor, %Populate) { /// 属性: 姓名 /// 类型: 字符串 Property Name As %String; /// 属性: 性别 /// 类型: 字符串 /// 约束取值范围为男和女 Property Gender As %String(VALUELIST = ",男,女"); /// 属性: 家庭住址 /// 类型: User.Address Property HomeAddress As User.Address; /// 索引: 基于Gender的位图索引 Index bmIndGender On Gender [ Type = bitmap ]; } 支持纯虚类开发,同时InterSystems IRIS提供庞大的、功能完善的类库,方便用户直接使用或继承。 多重继承 多重继承让一个子类可以同时从多个的父类那里继承属性和行为(方法)。InterSystems IRIS通过多重继承能力,可以快速构建代码。子类可以覆盖父类的属性和方法。 /// 患者,继承与人 Class User.Patient Extends User.Person { /// 患者病案号 Property MRN As %String; } 多态 InterSystems IRIS多态特性让程序可以用父类打开子类的实例,运行这个实例上的方法时,执行的是子类覆盖过的方法。通过多态特性,避免父类的代码臃肿、降低维护难度。 例如1号实例是人,6号实例是患者。都用类User.Person打开对应对象,并用XMLExport输出对象的XML序列化结果,可以看到6号患者的记录输出了它独有的病案号信息: USER>do ##class(User.Person).%OpenId(1).XMLExport() <Person><Name>Ximines,Joe U.</Name><Gender>男</Gender><HomeAddress><City>Washington</City><Street>3006 Washington Blvd</Street></HomeAddress></Person> USER>do ##class(User.Person).%OpenId(6).XMLExport() <Patient><Name>Geoffrion,Clint R.</Name><Gender>女</Gender><HomeAddress><City>Fargo</City><Street>908 Franklin Place</Street></HomeAddress><MRN>H7768</MRN></Patient> 透明的持久化 通过继承父类%Persistent,任何的类都可以自动获得透明的持久化 (存取到数据库) 的能力: 能够使用方法来新建、打开、修改、保存和删除对象。 当打开一个对象实例并引用对象类型的属性时,系统也会自动打开该对象。这个过程被称为swizzling(也被称为懒惰加载)。然后就可以对该对象进行操作。在下面的例子中,当User.Person对象被打开时,相应的User.Address对象被刷新了。 Set person=##class(User.Person).%OpenId(3) Set person.Name="张小明" Set person.HomeAddress.City="北京" Do person.%Save() 同样,当保存一个对象时,系统也会自动保存其所有的对象类型属性 - 这被称为深度保存。InterSystems IRIS可以通过选项设置执行浅保存。 ACID InterSystems IRIS的面向对象编程提供事务管理和锁机制,完全支持ACID事务。 在打开一个持久化对象时,可以指定并发锁定的程度,因为持久化对象有可能被多个用户或多个进程使用。锁定程度选项包括:无锁、原子读、共享锁、共享/保留锁、排他/保留锁。 在操作多个持久化对象时,可以将这些操作纳入一个事务进行管理,从而确保事务完整提交或全部回滚。 SQL访问 对于事务性操作来说,面向对象开发非常合适;但对于批量数据操作和数据的查询检索来说,SQL是目前大家最熟悉和便捷的操作语言。多数面向对象数据库使用专用的API来操作数据,而不支持SQL,这影响了开发的便捷性、提高了开发门槛。 InterSystems IRIS在支持面向对象建模和开发的同时,也支持关系型的数据操作,这是它多模型特性的一部分。 父类%Persistent提供了InterSystems IRIS中对象 - SQL投射关系的框架。它提供如下核心能力: 自动建立并维护对象-SQL的投射关系。这种投射是双向的:使用对象建模,会自动投射出SQL表模型;如果使用SQL DDL建模,同样会生成对应的对象模型。这种投射会选择合适的投射逻辑,例如将对象型属性投射为SQL子表、将关系型属性投射为SQL外键。 开发者可以干预对象-SQL的投射关系,从而得到更适合自己的模型。例如对于对象模型中的列表集合类型,默认会投射为表的一个字段,而开发者可以通过设置将它投射为一张子表。 对象-SQL投射并不会拷贝一份不同模型的数据,而是通过投射,将一份数据投射为不同的模型,供开发者在最适合的场景下使用最高效的模型。 投射出的SQL和对象模型同时支持ACID的读写操作。也就是说使用对象方式建模,依然可以使用SQL插入、更新、删除数据。 在类方法中,可以直接使用SQL;同样可以直接将类的Query发布为SQL视图、将类的方法发布为SQL存储过程。在持久化类中,可以定义SQL触发器。 对SQL的对象模式扩展:为了在面向对象应用程序中更容易地使用SQL,InterSystems IRIS提供SQL的一系列对象扩展。其中最有趣的是使用隐式连接运算符("->")提供对象引用的能力,通常被称为 "箭头语法",它可以很大程度上简化SQL的编写。例如,假设你有一个Vendor类,它引用了另外两个类Contact和Region作为属性。在SQL投射上,会看到3张表:Vendor表、Contact表和Region表。要获得Vendor的完整信息,标准SQL需要类似于这样的实现: SELECT Vendor.ID,Vendor.Name,Contact.Name FROM Vendor LEFT OUTER JOIN Contact ON Contact.ID = Vendor.ContactInfo LEFT OUTER JOIN Region ON Region.ID = Vendor.Region AND Region.Name = '南极洲' 而使用隐式连接运算符,可以在SQL中把引用类型的字段当作对象,使用相关类的属性: SELECT ID,Name,ContactInfo->Name FROM Vendor WHERE Vendor->Region->Name = '南极洲' 另外,InterSystems SQL层面也能体现出很多面向对象的特性。例如,上面的User.Person和User.Patient这两个类投射出Person表和Patient表,如果创建了5条Person的记录,又创建了5条Patient记录,在Patient表中将看到5条记录,而在Person表中将看到10条记录,因为这5个Patient也是Person。这种实现极大方便数据的查询和利用,而关系型数据库很难实现。 从Patient表中获取到5条Patient记录: 从Person表中,获取到10条记录,包括ID为6-10的Patient记录,因为它们也是Person记录: 数据分片 InterSystems IRIS提供数据分片技术(Sharding),将超大数据集分片到不同实例上,形成可弹性横向扩展的集群。 可以在类定义中将持久化类声明为需要数据分片保存的类。同时,可以在数据分片集群上的任何节点上执行对象方法,获得全数据分片集群上其它节点保存的对象数据,并更改它们。 列存储 InterSystems IRIS同时支持基于行存储和列存储的储存模型。列存储对于超大数据上的分析类查询能显著降低I/O、利用现代CPU/GPU的SIMD(Single Instruction Multiple Data)芯片级优化极大提升性能。 对象模型可以直接声明成列存储模型: Class Sample.TransactionHistory Extends %Persistent [ DdlAllowed, Final ] { Parameter STORAGEDEFAULT = "columnar"; Parameter USEEXTENTSET = 1; Property AccountNumber As %Integer; Property TransactionDate As %Date; Property Description As %String(MAXLEN = 10); Property Amount As %Numeric(SCALE = 2); Property Type As %String(VALUELIST = "-Deposit-Withdrawal-Transfer"); Index BitmapExtent [ Extent, Type = bitmap ]; } 或仅对对象模型中的特定字段使用列存储的混合模型: Class Sample.BankTransaction Extends %Persistent [ DdlAllowed ] { Parameter STORAGEDEFAULT = "row"; Parameter USEEXTENTSET = 1; Property AccountNumber As %Integer; Property TransactionDate As %Date; Property Description As %String(MAXLEN = 100); Property Amount As %Numeric(SCALE = 2, STORAGEDEFAULT = "columnar"); Property Type As %String(VALUELIST = "-Deposit-Withdrawal-Transfer"); Index BitmapExtent [ Extent, Type = bitmap ]; } 无论使用行存储、列存储、混合存储, OOP代码和SQL代码都无需任何修改。 多开发语言支持 InterSystems IRIS作为一个多模型数据库,可以向外提供关系型的访问方式;外部开发语言像连接关系型数据库一样,使用XDBC、ADO.NET连接InterSystems IRIS,并使用SQL操作数据。或者使用Entity Framework将.NET对象映射到IRIS的SQL表。 对于面向对象开发而言,InterSystems提供更多的开发语言选择。 内部语言 在使用OOP开发InterSystems IRIS上的类时,使用ObjectScript建立对象模型和方法,也可以使用嵌入式Python开发类方法、或调用外部的Python库。 例如,我们可以直接用嵌入式Python,编写python方法,调用外部的Python库: /// 使用Python的xmltodict库,将XML转换为JSON ClassMethod XML2JSON(pXML As %String) [ Language = python ] { import xmltodict, json obj = xmltodict.parse(pXML) return(json.dumps(obj,ensure_ascii=False)) } 外部语言 Java、.NET和 Python都是流行的OOP语言。InterSystems IRIS可以直接将Java和.NET对象保存到数据库而无需做对象/关系映射,同时InterSystems IRIS的外部服务器(InterSystems External Servers)特性使InterSystems IRIS和这些OOP语言可以双向使用对方定义的对象。它包括以下特性: 即时访问 该特性使Java、.NET 和 Python 对象成为 InterSystems IRIS可以直接操作的对象。当你发出命令时,外部服务器会自动启动,提供对外部语言平台的即时访问,而不需要任何预先设置。 共享的会话 共享会话让 ObjectScript 和外部应用程序在相同的环境和事务中工作,共享相同的双向连接。 远程对象控制 通过代理对象,允许共享会话的任何一方实时控制另一方的目标对象。InterSystems IRIS可以创建和控制 Java、.NET 和 Python 对象,这些语言也可以创建和控制 InterSystems IRIS的对象。 完全可重入的双向连接 传统的单向客户端/服务器关系不再是一个障碍。通过双向重入,任何一方的新对象或方法调用都可以随时进入现有的共享会话。这使得共享会话中任何一方的应用程序都可以同时充当服务器和客户端,发起客户端的查询并为另一方的请求提供服务。 可重入的Native SDK方法 Native SDK方法也是完全可重入的,可以包含在共享会话中,使外部应用程序可以直接访问大量的InterSystems IRIS资源。 例如,在InterSystems IRIS中创建Java类的 java.util.Date的代理类实例,并执行其方法显示当前日期: write $system.external.getJavaGateway().new("java.util.Date").toString() 除了对象型、关系型,InterSystems IRIS还支持多维(或键值对)和文档建模和数据操作方式。它的多模型特性可以帮助开发者用最合适的模型处理数据、获得最佳的开发效率和运行效率。

#InterSystems报表

4 帖子0 关注者
文章
Claire Zheng · 四月 21, 2021

InterSystems Caché系统运维培训:InterSystems Caché系统安全

近日,InterSystems极客俱乐部举办了线上直播“InterSystems Caché系统运维培训”,这是系列视频之一。InterSystems中国资深售前顾问祝麟讲解了“InterSystems Caché系统安全”。
文章
Claire Zheng · 四月 21, 2021

InterSystems Caché系统运维培训:InterSystems Caché系统监控和性能数据采集

近日,InterSystems极客俱乐部举办了线上直播“InterSystems Caché系统运维培训”,这是系列视频之一。InterSystems中国资深售前顾问马浩讲解了“InterSystems Caché系统监控和性能数据采集”。
文章
Claire Zheng · 七月 6, 2021

InterSystems Caché系统运维培训:InterSystems Caché系统高可用与数据库镜像

近日,InterSystems极客俱乐部举办了线上直播“InterSystems Caché系统运维培训”,这是系列视频之一。InterSystems中国资深售前顾问祝麟讲解了“InterSystems Caché系统高可用与数据库镜像”。
文章
Claire Zheng · 一月 20, 2021

InterSystems IRIS数据平台:数据接收速度测试

跨行业用例大多要求具备每秒接收数千或数百万条记录的能力,同时能够支持实时同步查询,例如:股票交易处理、欺诈检测、物联网应用(包括异常检测和实时OEE监控)等。Gartner将这种能力称为“HTAP”(混合事务分析处理)。Forrester等其他公司将其称为Translytics。InterSystems IRIS是功能强大、可扩展、高性能、资源高效的事务分析型数据平台,同时具备内存数据库的高性能以及传统数据库的一致性、可用性、可靠性以及低成本的特性。 混合事务分析处理(HTAP)示例 此示例展示了InterSystems IRIS如何实现每秒接收数千条记录,同时允许对同一集群上的数据进行同步查询,该平台不仅具有很高的接收和查询性能,而且保持了较低的资源利用率。此示例可在单个InterSystems IRIS实例或云端InterSystems IRIS集群上运行。 大家也可以在SAP HANA、MySQL、SqlServer及Amazon Aurora上运行这个示例,以便对性能和资源利用率进行公平、合理的对比。 大家可以在AWS上运行该测试!以下是部分结果: 在AWS上运行InterSystems IRIS和SAP HANA: o在接收记录量方面,InterSystems IRIS比SAP HANA多39% o在查询速度方面,InterSystems IRIS比SAP HANA快3699% 在AWS上运行InterSystems IRIS和AWS Aurora(MySQL): o在接收记录量方面,InterSystems IRIS比AWS Aurora多831% o在查询速度方面,InterSystems IRIS比AWS Aurora快485% 大家可以在自己的PC上使用Docker(3个CPU和7GB RAM)运行该测试!以下是部分结果: 在个人PC上运行InterSystems IRIS和MySQL 8.0: o在接收记录量方面,InterSystems IRIS比MySQL 8.0多3043% o在查询速度方面,InterSystems IRIS比MySQL 8.0快643% 在Ubuntu系统中运行InterSystems IRIS和SQL Server 2019 o在接收记录量方面,InterSystems IRIS比SQL Server 2019多223%,速度也更快 o在查询速度方面,InterSystems IRIS比SQL Server 2019快134,632%(请注意,数字没有打错哦!) o为公平起见,我们未来将在AWS和Azure上对SQL Server进行测试。敬请期待! 在测试任何数据库的运行速度时,请先将速度测试运行一段时间进行预热,然后再记录结果。这样可以对数据库进行预扩展并执行其他操作。每次启动速度测试时,我们都需要清空表格重新开始。 1-在AWS上运行速度测试 请点击链接,查看如何在AWS上运行速度测试以便将InterSystems IRIS和其他数据库(如SAP HANA和AWS Aurora)进行对比。 2- 如何在PC上运行速度测试 在PC上运行速度测试的前提条件是: Docker和Docker Compose Git(可以克隆源代码) 目前,可以使用InterSystems IRIS、MySQL、SqlServer及SAP HANA在PC上运行本示例。 2.1 -在InterSystems IRIS Community上运行速度测试 要想在PC上运行本示例,请确保PC已经安装了Docker。您可以使用以下命令在Mac或Linux系统的PC上快速启动并运行: wget https://raw.githubusercontent.com/intersystems-community/irisdemo-demo-htap/master/docker-compose.yml docker-compose up 如果在Windows系统中运行速度测试,请将docker-compose.yml文件下载到一个文件夹中。打开命令提示符,并切换到该文件夹,然后运行docker-compose up c:\MyFolder\docker-compose up 您也可以将存储库克隆到本地计算机上,从而获得完整的源代码。这时需要安装git,并将其放在git文件夹中: git clone https://github.com/intersystems-community/irisdemo-demo-htap cd irisdemo-demo-htap docker-compose up 这两种技术都可行,并会触发示例中用于演示的镜像文件下载,之后将立刻启动所有的容器。 容器启动过程中,将出现与启动中容器相关的大量消息。这是正常的,不用担心! 启动完成后,它会一直挂在那里,不会把控制权交还给你。这也是正常的。将窗口开着就可以。如果在此窗口上按CTRL+C,docker compose将停止所有容器并停止示例演示。 在所有容器启动之后,在浏览器上打开http://localhost:10000可查看示例的界面。点击“Run Test”按钮即可运行HTAP Demo! 完成Demo演示后,返回到该终端并按CTRL+C。也可以输入以下命令,停止并删除仍在运行的容器: docker-compose stop docker-compose rm 这点很重要,特别是要在一个数据库(如InterSystems IRIS)和另一个数据库(如MySQL)之间反复运行速度测试时。 2.2 -PC上的MySQL 基于MySQL运行此示例,可以输入以下命令: wget https://raw.githubusercontent.com/intersystems-community/irisdemo-demo-htap/master/docker-compose-mysql.yml docker-compose -f ./docker-compose-mysql.yml up 现在,我们将下载一个不同的docker-compose yml文件:一个带有mysql后缀的文件。我们必须在docker-compose命令中使用-f选项来使用此文件。如前所述,将该终端窗口保持打开状态,并在浏览器上打开http://localhost:10000。 示例运行完成后,请返回终端并按CTRL+C。也可以输入以下命令,停止并删除仍在运行的容器: docker-compose -f ./docker-compose-mysql.yml stop docker-compose -f ./docker-compose-mysql.yml rm 这点很重要,特别是要在一个数据库(如InterSystems IRIS)和其他数据库之间反复运行速度测试时。 我们在测试中发现,InterSystems IRIS的数据接收速度比MySQL和Amazon Aurora快25倍。 2.3 -PC上的SQL Server 2019-GA-ubuntu-16.04 基于SQL Server运行此示例,可以输入以下命令: wget https://raw.githubusercontent.com/intersystems-community/irisdemo-demo-htap/master/docker-compose-sqlserver.yml docker-compose -f ./docker-compose-sqlserver.yml up 与前面一样,将该终端窗口保持打开状态,并在浏览器上打开http://localhost:10000。 我们在本地PC上运行速度测试后发现,InterSystems IRIS的数据接收速度比SQL Server快2.5倍,查询速率则快400倍!我们将与AWS RDS SQL Server相比较,进行速度测试并生成报告。 2.4 -PC上的SAP Hana 要在PC上基于SAP HANA运行速度测试,需要满足以下条件: 包含了Ubuntu 18 VM、docker和docker-compose的虚拟机——因为SAP HANA要求对Linux内核参数进行一些更改,否则将无法支持Mac或Windows上的Docker。另外,SAP HANA需要Linux内核4或更高版本。 该虚拟机至少配置9GB RAM,否则将无法启动!虚拟机崩溃后将显示无用的错误消息。 基于SAP HANA运行此Demo,可以输入以下命令: git clone https://github.com/intersystems-community/irisdemo-demo-htap cd ./irisdemo-demo-htap ./run.sh hana 等待下载镜像和启动容器。当docker-compose停止向屏幕写入时,一切已准备就绪。但是请耐心等待——SAP HANA大约需要6分钟才能启动!因此,屏幕会冻结一分钟左右,然后你会看到SAP HANA写入更多文本。这个重复写入过程大约持续6分钟。看到“启动完成!(Startup finished!)”后,就可以开始下一步了。如果在此过程中因为错误而发生崩溃,则可能需要配置更多的内存。 如您所知,与在InterSystems IRIS和MySQL中运行速度测试一样,使用SAP HANA测试不仅仅是运行docker-compose,还需要对Linux内核进行一些配置。大家可以通过run.sh文件来完成这些配置。 我们在虚拟机上运行速度测试后发现,InterSystems IRIS的数据接收速度比SAP HANA快1.3倍,查询数据的速度快20倍,并且使用了更少的内存。 3-资源 我们正在制作有关本示例的视频。在此期间,您可以点击链接查看一篇有意思的文章,该文章介绍了InterSystems IRIS的体系结构,并解释了为什么它能以更快的速度接收和查询数据。 4-该基准测试与YCSB或TPC-H等标准基准测试相比如何? Yahoo Cloud Serving Benchmark(YCSB)是一项开源项目,其目的是开发一个框架和一组通用的工作负载,来评估不同的“键-值存储”和“云”服务的性能。 尽管YCSB上有一些工作负载可以描述成HTAP,但YCSB不一定要依靠SQL来完成。但是该基准必须依靠SQL。 TPC-H侧重于决策支持系统(DSS),而这并不是我们正在研究的用例。 此基准测试针对的是接收速度和查询响应时间之间的关系。我们有一个表格,其中包含许多不同数据类型的列。我们想衡量一个数据库在允许响应式查询的同时,其接收记录的速度能有多快。 这是一个复杂的问题。金融服务和物联网等许多行业都要求每秒必须接收数千条记录。在如此高的接收速率下,内存消耗得非常快。传统数据库需要写入磁盘,而内存数据库也将被迫不断写入磁盘(更改log/journal,甚至在某些情况下部分数据会写入内存,就像传统数据库一样)。问题是:如果InterSystems IRIS不仅要将事务日志写入磁盘(像内存数据库一样),还要异步保持数据库的最新状态,那么InterSystems IRIS是如何做到比内存数据库更快的呢? 一切都与效率有关。接收工作负载会使数据库非常繁忙。CPU和内存都将努力运转。一些内存数据库将尝试压缩内存中的数据。其他内存数据库在内存已满时会将数据持久化到磁盘。所有这些在我们试图实时查询数据库时都有发生。 我们想要证明,在某些工作负载上(例如股票交易、高接收吞吐量[物联网]等),内存数据库的性能不及InterSystems IRIS。这就是我们设计本测试的原因。这意味着该测试比一般用途的测试要简单得多: (1)它只有一个表格,包含19个列和3种差别很大的数据类型 (2)表格上声明了主键(Primary Key)。 (3)我们执行的查询将通过主键(账户ID)获取记录,并使用固定的8个键随机查询:W1A1、W1A10、W1A100、W1A1000、W1A10000、W1A100000、W1A1000000和W1A10000000。这样做的原因如下: 我们知道,在生产系统的内存中保存所有数据是不可能的。内存数据库虽然具有复杂的体系结构,但当内存满了之后,就会将数据移出内存。为了简化测试并使其具有可比性,我们通过主键获取固定记录集,以避免对数据库中可能存在的其他类型的索引进行比较。 通过账号(主键)获取客户账户数据记录是我们许多客户的真实工作负载。数据库在高速接收数据的同时,也需要对查询做出响应。 由于账户ID是主键,因此数据库将使用它的首选(即最优)索引对其进行索引。这样在比较数据库时能够保持公平、简单。 当我们不断请求相同的账号时,数据库有可能将该数据缓存在内存中。这对于内存数据库来说是一项轻松的任务。 InterSystems IRIS是一个混合型数据库。与传统数据库一样,它也尝试将数据保存在内存中。但由于每秒需要接收成千上万的记录,因此内存清理得非常快。通过这个测试可以看到,与其他传统数据库和内存数据库相比,InterSystems IRIS在缓存方面更加智能。你会看到: (1)传统数据库在同时处理接收和查询时表现不佳 (2)内存数据库: 在测试的最初几分钟内表现良好,随着内存填满,数据压缩变得更加困难,不可避免地要写入磁盘 由于系统忙于接收、压缩数据,以及将数据移出内存等,因此查询性能表现不佳。 5-表是怎样的? 以下是我们发送到所支持的全部数据库的建表语句: CREATE TABLE SpeedTest.Account ( account_id VARCHAR(36) PRIMARY KEY, brokerageaccountnum VARCHAR(16), org VARCHAR(50), status VARCHAR(10), tradingflag VARCHAR(10), entityaccountnum VARCHAR(16), clientaccountnum VARCHAR(16), active_date DATETIME, topaccountnum VARCHAR(10), repteamno VARCHAR(8), repteamname VARCHAR(50), office_name VARCHAR(50), region VARCHAR(50), basecurr VARCHAR(50), createdby VARCHAR(50), createdts DATETIME, group_id VARCHAR(50), load_version_no BIGINT ) 插入程序Ingestion Worker会尽可能多地发送INSERT数据,以测量每秒插入的记录数据量以及每秒的兆字节数。 查询程序Query worker将通过account_id从此表中进行选择,并尝试选择尽可能多的记录来测量性能(即每秒选择的记录以及每秒选择的兆字节),以测试端到端性能,并提供工作量证明(Proof of Work)。 端到端性能与一些JDBC驱动程序最优化有关。如果仅执行查询操作,JDBC驱动程序可能不会从服务器获取记录,只有当实际请求列值后,JDBC驱动程序才会从服务器获取记录。 为了证明实际读取的正是我们选取的列,我们将返回的所有fild的字节加起来作为工作量证明。 6-如何实现接收和查询的最大吞吐量? 为了实现最大吞吐量,每个ingestion worker将启动多个线程,每个线程将: (1)为上述表格的每一列准备1000个随机值。这样做是为了让每一列具有不同的数据类型和大小。所以我们希望生成可相应变化的记录 (2)对于要插入的每个新记录,ingestion worker将在每列的1000个值中随机选择一个值,准备好之后,该记录将被添加到批处理中 (3)使用批量插入,默认批量大小为每批1000条记录 Ingestion worker的默认线程数量是15,但是可以在测试过程中单击“设置”进行更改。 另一方面,query worker也启动多个线程来查询尽可能多的记录。如上所述,我们也将提供工作量证明。我们将读取返回的列,并汇总读取的字节数,以确保数据是从数据库通过连接传输进入query worker的,从而避免某些JDBC驱动程序实现优化后,仅在实际使用数据时才通过连接传输数据。我们实际使用返回的数据,并提供每秒读取数据的兆字节总和以及读取的总兆字节数作为工作量证明。 7-占用多少磁盘空间? 在接收171,421,000条记录后,我填满了一个70Gb的数据文件系统。这意味着,每条记录平均占用439个字节(向上取整)。 我还填写了第一个日志目录的100%和第二个日志目录的59%。这两个文件系统都有100Gb,这意味着171,421,000条记录将占用大约159Gb的日志空间,换言之,每条记录平均占用996个字节。 8-HTAP Demo体系架构 HTAP Demo的体系架构如下图所示: 本示例使用docker compose启动五项服务: (1)htapui——这是用于运行示例的Angular UI。 (2)htapirisdb——由于本示例在InterSystems IRIS Community上运行,所以不需要InterSystems IRIS许可证即可运行。但请注意,InterSystems IRIS Community有两个重要限制条件: 最多5个连接 数据库最大为10Gb (3)htapmaster——这是HTAP 示例主程序。UI与主程序对话,主程序与worker对话,以及启动/停止速度测试,并收集指标。 (4)ingest-worker1——这是插入程序ingestion worker。实际上,大家可以拥有多个ingestion worker,只需给每个worker分配不同的服务名称即可。它们将尝试尽快地将记录插入数据库。 (5)query-worker1——这是查询程序query worker,大家也可以拥有多个query worker。它们将尝试尽快地从数据库中读取记录。 在PC上运行示例时,我们使用的是Docker和Docker Compose。Docker Compose需要一个docker-compose.yml来描述这些服务及其使用的Docker镜像。本示例实际上提供了许多docker-compose.yml文件,并且很快将添加更多此类文件: (1)docker-compose.yml——这是针对InterSystems IRIS Community(上述项目及图片中有所描述)运行速度测试的默认演示程序。 (2)docker-compose-mysql.yml——这是针对MySQL的速度测试。大家应该注意到,该测试结果表明,InterSystems IRIS比MySQL快25倍。在Amazon Aurora MySQL(MySQL的微调版本)上运行此测试可得到相同的结果。 (3)docker-compose-sqlserver.yml——这是针对使用Docker部署的SqlServer的速度测试。 (4)docker-compose-enterprise-iris.yml——如果要在标准版本的InterSystems IRIS上运行速度测试示例,这是一个docker-compose.yml的文件例子。 9. 可以在没有容器的情况下在InterSystems IRIS集群上运行本Demo吗? 可以!完成此示例最简便的方法是将此存储库克隆到即将运行master(主程序)和(在同一服务器上运行的)UI的每台服务器上以及每种worker类型(接收和查询worker)上。你可以根据自己的需要,拥有任意数量的接收worker和查询worker! 对于InterSystems IRIS,请查看文件夹./standalone_scripts/iris-jdbc.中的文件。每个服务器都有一个脚本: (1)在主程序上:start_master_and_ui.sh——此脚本将启动主程序和UI。 (2)在Ingestion Worker上:start_ingestion_worker.sh——此脚本将启动Ingestion Worker,后者随后将与主程序连接并进行注册。 (3)在Query Worker上:start_query_worker.sh——此脚本将启动query worker,然后query worker将与主程序连接并进行注册。 对于InterSystems IRIS,大家有两种选择: (1)可以使用start_iris.sh脚本在Docker容器上启动InterSystems IRIS服务器进行快速测试。 (2)可以手动或使用ICM设置InterSystems IRIS集群。然后做一些有趣的事情,比如: 使接收和查询worker都指向同一InterSystems IRIS 使用ECP配置InterSystems IRIS,让ingestion worker指向数据库服务器,同时让query worker指向ECP服务器 配置分片的InterSystems IRIS集群 等等 只要确保更改start_master.sh脚本中对应使用正确的InterSystems IRIS端点、用户名和密码来配置环境变量。 10-自定义 10.1 -如何配置本Demo让其与更多worker、线程等一起工作? Docker-compose.yml文件中的环境变量支持配置所有内容。docker-compose.yml文件只是个不错的起点:大家可以复制它们并对副本进行更改,从而得到更多的worker(如果在PC上运行,不会有太大区别),每个worker类型都可以得到更多线程数,还可以更改接收数据的批处理大小,以及各查询之间的等待时间(以毫秒为单位)等。 10.2 -可以更改表的名称或结构吗? 可以,但必须: (1)在PC上将复制此存储库 (2)更改源代码 (3)使用shellscript build.sh在PC上重建demo。 更改表的结构也很简单。 复制了该存储库后,需要更改/image-master/projects/master/src/main/resources文件夹下的文件。 如果更改表的结构,请确保使用与现有表相同的数据类型,这些数据类型是受支持的。另外还可以更改表的名称。 其次,需要配合更改其他* .sql脚本,如INSERT脚本、SELECT脚本等。 最后,只需运行build.sh来重建demo就可以了! 11-其他示例应用程序 我们还有一些其他涉及不同主题的InterSystems IRIS 示例应用程序,例如NLP、ML、与AWS服务的集成、Twitter服务、性能基准测试等。以下是其中的部分内容: (1)HTAP Demo——混合事务分析处理(HTAP)基准。可以测试InterSystems IRIS同时插入和查询数据的速度。你会发现它的速度比AWS Aurora快20倍! (2)欺诈预防——InterSystems IRIS通过机器学习和制定业务规则,防止金融服务交易中出现欺诈行为。 (3)Twitter情绪分析——演示InterSystems IRIS如何实时使用Tweet,并通过其NLP(自然语言处理)和业务规则功能来评估Tweet的情绪和元数据,从而决定何时与某人联系以提供支持。 (4)HL7协议和SMS(文本消息)应用程序——演示InterSystems IRIS医疗版如何解析HL7协议消息,从而给患者发送SMS(文本消息)提醒。它还演示了基于存储在标准化数据湖中预约数据的实时仪表板。 (5)Readmission Demo——患者再入院在医疗保健领域被称为"机器学习的Hello World"。针对这个问题,我们在本示例中演示了如何使用InterSystems IRIS安全地构建并运行用于实时预测的ML模型,以及如何将其集成到应用程序中。本InterSystems IRIS医疗版示例旨在展示如何构建针对再入院问题的完整解决方案。 12-支持的数据库 这是目前为止支持的数据库列表: Runing on your PC with docker-compose (NO mirroring/replication) InterSystems IRIS 2020.2 MySQL 8.0 MariaDB 10.5.4-focal MS SQL Server 2019-GA-ubuntu-16.04 SAP HANA Express 2.0 (on Linux VM only) Postgres 12.3 Running on AWS: InterSystems IRIS (with or without mirroring) AWS RDS Aurora (MySql) 5.6.10a (parallel query) with replication AWS RDS SQL Server 2017 Enterprise Edition (production deployment) with replication AWS RDS Postgres (production deployment) with replication AWS RDS MariaDB (production deployment) with replication SAP HANA Express Edition 2.0 without replication SAP Sybase ASE 16.0 SP03 PL08, public cloud edition, premium version, without replication AWS RDS Oracle (production deployment) with replication 注:本文为节选,欢迎点击原文链接,了解更多详情。
文章
Claire Zheng · 一月 20, 2021

InterSystems API 管理器简介

大家可能已经听说过,我们近期推出了InterSystems API管理器 (以下简称IAM)。InterSystems IRIS数据平台™新增了一项功能,支持用户监视、控制和管理IT基础架构中基于Web的API间通信。 在本文中,我将向大家展示如何设置IAM,并重点介绍IAM中可用的一些功能。InterSystems API管理器可提供你所需的一切功能。 监视基于HTTP的API通信,并了解谁在使用你的API、你最受欢迎的API是什么,哪些可能需要重新实现。 使用多种方式对API用户进行控制及限制。从简单的访问限制、API流量限制,到请求有效负载微调,你可以进行细粒度控制并快速做出反应。 使用集中式安全机制(如OAuth2.0或密钥和令牌身份验证)保护API。 招募第三方开发人员,为第三方开发人员提供一个专门的开发门户来满足他们的需求,并从一开始就为他们提供良好的开发体验。 扩展API需求并实现低延迟响应。 我很高兴为大家介绍IAM,让您一睹为快。 入门 从WRC Software Distribution站点下载IAM,并将其部署为自身的docker容器。 请确保满足以下最低要求: Docker引擎可用。最低支持版本是17.04.0+。 Docker-compose CLI工具可用。最低支持版本是1.12.0+。 第一步需要加载docker镜像,通过如下: docker load -i iam_image.tar 这样一来,IAM镜像可在你的计算机进行后续使用。IAM作为一个独立运行的容器,可以单独从InterSystems IRIS后端对其进行扩展。 启动IAM前,需要访问IRIS实例来加载所需的许可证信息。须进行以下配置更改: 启用/api/IAM web应用程序 启用IAM用户 更改IAM用户密码 现在,我们可以开始配置IAM容器了。在distribution tarball里可以找到一个名为“iam-setup”的Windows和Unix系统脚本。该脚本可帮助你正确地设置环境变量,使IAM容器能够与InterSystems IRIS实例建立连接。这是我在Mac终端会话中的运行示例: source ./iam-setup.sh Welcome to the InterSystems IRIS and InterSystems API Manager (IAM) setup script.This script sets the ISC_IRIS_URL environment variable that is used by the IAM container to get the IAM license key from InterSystems IRIS.Enter the full image repository, name and tag for your IAM docker image: intersystems/iam:0.34-1-1Enter the IP address for your InterSystems IRIS instance. The IP address has to be accessible from within the IAM container, therefore, do not use "localhost" or "127.0.0.1" if IRIS is running on your local machine. Instead use the public IP address of your local machine. If IRIS is running in a container, use the public IP address of the host environment, not the IP address of the IRIS container. xxx.xxx.xxx.xxx Enter the web server port for your InterSystems IRIS instance: 52773Enter the password for the IAM user for your InterSystems IRIS instance: Re-enter your password: Your inputs are:Full image repository, name and tag for your IAM docker image: intersystems/iam:0.34-1-1IP address for your InterSystems IRIS instance: xxx.xxx.xxx.xxxWeb server port for your InterSystems IRIS instance: 52773Would you like to continue with these inputs (y/n)? yGetting IAM license using your inputs...Successfully got IAM license!The ISC_IRIS_URL environment variable was set to: http://IAM:****************@xxx.xxx.xxx.xxx:52773/api/iam/licenseWARNING: The environment variable is set for this shell only!To start the services, run the following command in the top level directory: docker-compose up -dTo stop the services, run the following command in the top level directory: docker-compose downURL for the IAM Manager portal: http://localhost:8002 我隐藏了IP地址和密码,但这足以让大家了解配置是多么简单。现在我们得到了开始下一步前所需的全部内容:InterSystems IRIS实例的完整镜像名称、IP地址和端口,以及IAM用户密码。 现在可以通过执行以下命令启动IAM容器: docker-compose up -d 该命令将开始协调IAM容器,并确保以正确的顺序启动所有内容。 你可以使用以下命令检查容器的状态: docker ps 在浏览器中输入localhost:8002会出现基于web的用户界面: 因为这是一个全新的节点,所以全局报告中未显示任何吞吐量。但我们很快就会改变这个情况。我们可以看到,IAM支持“Workspace(工作区)”概念,将工作划分为“module”和/或“team”。向下滚动并选择“default”工作区会将我们带到“Dashboard”界面。我们将在“default”工作区开始首次实验。 同样,这个工作区的请求数量也是零,但是你可以先在左侧的菜单中了解一下API网关的重要概念。前两个元素——即服务和路由——是最重要的。服务是指向用户公开的API。因此,IRIS实例中的REST API被视为一种服务,就像你所使用的Google API一样。路由决定应将传入请求路由到哪些服务。每个路由都有一组特定的条件,如果满足这些条件,就会将请求路由到相关的服务。大家需要了解的是,路由可以匹配发送者的IP或域、HTTP方法、部分URI,或者其中的几种。 现在让我们创建一个IRIS实例的服务,其值如下: 保留其他所有内容的默认设置。现在让我们创建一个路由: 同样,对其他所有内容保留默认设置。默认情况下,IAM正在监听端口8000上的传入请求。从现在开始,发送到http://localhost:8000并以/api/atelier路径开头的请求将被路由到IRIS实例。 让我们在REST客户端尝试一下(我使用的是Postman)。 向http://localhost:8000/api/atelier/发送一个GET请求会从IRIS实例返回一个响应。每个请求都经过IAM,并监视HTTP状态码、延迟和用户(如果已配置)等指标。我接着发出了另外几个请求(包含对不存在的端点的两个请求,如/api/atelier/test/),可以在Dashboard中看到汇总: 使用插件 既然已经有了一个基本的路由,那么可以开始管理API流量了。现在我们可以开始添加补充服务的行为。现在可以创造奇迹了。 执行某种行为最常见的方法就是添加插件。插件可提供一些功能,并且通常可以附加到IAM的某个部分。它们可能会对全局运行产生影响,也可能只对单个用户(组)、服务或路由等产生影响。首先,我们在路由中添加限速插件。此时需要确保插件和路由之间建立的链接是路由的唯一ID。这些可以从路由的详细信息里找到。 如果按照本文的步骤进行,那么你的路由ID是不一样的。复制ID继续下一步。 单击左侧工具栏菜单上的“Plugins”。通常可以在此界面上看到所有的活动插件,但由于这个节点相对较新,所以未显示任何活动插件。选择“Add New Plugin”继续下一步。 我们要选择的插件在“Traffic Control”类中,名为“Rate Limiting”。选中该插件。由于插件非常灵活,所以我们可以在这里定义非常多的字段,但现在我们只关心两个字段: 如上所示,插件已配置并处于活动状态。你可能已经发现有多种时间间隔可以选择,比如分钟、小时或天。我特意选择了分钟,因为这样可以让我们很容易理解这个插件产生的效果。 如果在Postman中再次发送相同的请求,会发现响应返回了两个附加的头信息:XRateLimit-Limit-minute (value 5) 和XRateLimit-Remaining-minute(value 4)。这是在告诉客户端,每分钟最多可以调用5次,并且在当前时间间隔内还有4个请求可用。 如果不断地发出相同的请求,最终会用完可用配额,得到一个带有以下负载的HTTP状态码429: 等这一分钟结束后,就可以再次调用。这是一个非常方便的机制,可以完成以下工作: 1. 确保后端避免高峰值 2. 为客户端设置一个期望值,即允许以透明的方式为服务进行多少次调用 3. 引入分级制有望从API流量中获利(例如,青铜级别每小时调用100次,而黄金级别则不受限制) 你可以为不同的时间间隔设置值,从而在一定时期内平滑API流量。假设允许某条路由每小时进行600次调用,平均每分钟调用10次。但是,你没有阻止客户端在一小时的第一分钟就用光600次调用(也许这就是你想要的)。也行你想让负载在一个小时内分配得更均匀。将config_minute字段设置为20,这样就可以确保用户每分钟调用的次数不超过20次,每小时不超过600次。这将使分钟级别的间隔出现一些峰值,因为它们平均每分钟只能调用10次,但用户不能在一分钟内用完一小时配额。现在,至少需要30分钟,系统才会达到满负荷运行。客户端将在每个配置的时间间隔内收到附加标头,例如: header value X-RateLimit-Limit-hour 600 X-RateLimit-Remaining-hour 595 X-RateLimit-Limit-minute 20 X-RateLimit-Remaining-minute 16 当然,可以采用多种不同的方法配置rate-limits,这取决于你想要实现的目标。 对此我不再做过多介绍,因为作为一篇介绍InterSystems API Manager的文章,上述介绍已经足够了。IAM还可以用来实现更多的事情。我们刚刚只用了40多个插件中的一个,甚至还没有使用到所有的核心概念,你还可以实现以下任务: 为所有服务添加集中式身份验证机制 通过负载均衡请求扩展到支持同一组API的多个目标 向更小的受众介绍新特性或bugfixes,并在向大家发布之前监视的进展情况 为内部和外部开发人员提供一个专用的、可自定义的开发人员门户,记录他们有权访问的所有API 缓存常见的请求响应,以减少响应延迟和服务系统上的负载 所以,请大家试一试IAM,并在下面评论区留下建议。我们努力推出这一功能,希望了解大家可以使用这项技术克服哪些挑战。 更多资源 官方新闻稿:InterSystems IRIS Data Platform 2019.2 introduces API Management capabilities 短动画视频概述:什么是InterSystems API Manager?(英文) What is InterSystems API Manager 8分钟小视频带你了解主要亮点:InterSystems API管理器简介(英文) Introducing InterSystems API Manager 选自IRIS文档部分内容:InterSystems API管理器文档(英文) InterSystems API Manager Documentation 注:本文为译文,欢迎点击查看原文,原文由Stefan Wittmann撰写 IAM 是只能在docker 里运行吗? 对,目前IAM提供的是容器版本。如果有对IAM的需求,可以联系InterSystems的销售和销售工程师。 欢迎联系Intersystems 中国服务热线:400-601-9890,谢谢!
公告
Claire Zheng · 二月 1, 2021

InterSystems 2021年度编程大奖赛

大家好! InterSystems IRIS开发者们,我们有一个好消息要跟大家分享! 我们很高兴能够邀请大家参加我们今年的年度大奖赛,利用InterSystems IRIS数据平台创建开源解决方案! 🏆 InterSystems编程大奖赛 🏆 时间: 2021年2月8日 - 3月8日 奖金总额: $16,000 奖项设置 这次我们提升了现金奖励力度! 请看: 1. 专家提名奖(Experts Nomination)- 获奖者由我们特别挑选的专家团选出: 🥇 第一名 - $6,000 🥈 第二名 - $3,000 🥉 第三名 - $2,000 2. 社区提名奖(Community Nomination)- 获得总投票数最多的应用: 🥇 第一名 - $3,000 🥈 第二名 - $1,500 🥉 第三名 - $500 如果同时多位参赛者获得同样的票数,均被视为优胜者,将平分奖金 谁可以参加? 任何开发者社区的成员均可参加,InterSystems内部员工除外。还没有账号?现在来建一个! 参赛时间安排 根据大家的反馈意见,我们做出了调整! 我们为开发留出了更多时间!所以: 🛠 2月8日- 28日: 应用程序开发和注册阶段(在此期间,您可以持续编辑自己的项目) ✅ 3月1日-7日: 投票阶段 🎉 3月8日: 宣布优胜者! 主题 💡 InterSystems IRIS 应用程序 💡 提交使用InterSystems IRIS作为后端(API或数据库)的应用程序,使用任何类型的InterSystems IRIS API或数据模型均可。 我们欢迎您进一步改进您去年在InterSystems系列竞赛中提出的申请,并将其提交参加大奖赛。当然,也欢迎您提交一份全新的申请。 应用程序应该可以在 IRIS Community Edition 或 IRIS for Health Community Edition 或 IRIS Advanced Analytics Community Edition 上运行。 应用程序应该开源并在GitHub上发布。 资源助力 示例程序: objectscript-docker-template rest-api-contest-template native-api-contest-template integratedml-demo-template PythonGateway-template iris-fhir-template iris-fullstack-template iris-interoperability-template iris-analytics-template 如何把您的APP提交给大赛: 如何在 InterSystems Open Exchange 上发布应用程序 如何把参赛APP提交给大赛 公平公正 点击查看 投票规则. 万分期待你的精彩项目! 加入大奖赛吧! ❗️ 点击此处,查看 官方竞赛术语解读. ❗️ 顶一下 IRIS 在线培训:https://learning.intersystems.com/ 在线实验室Lab:https://learning.intersystems.com/course/view.php?id=929 恭喜发财,大家踊跃报名啊! 这次我们提升了现金奖励力度,欢迎大家积极报名! 投票通道开启,欢迎参赛选手踊跃拉票啊。 https://openexchange.intersystems.com/contest/current @jingqi.liu @Weiwei.Yang @deming.xu @Botai.Zhang very good 非常棒,都是很好的应用,我会投票的。 积极投票 踊跃投票! 这些应用都是很好的解决方案! 现在这个很火爆,可惜我不会,我也要学习编程了 可以看到这么多优秀的应用,很棒👍
文章
姚 鑫 · 二月 28, 2021

第一章 InterSystems SQL简介

# 第一章 InterSystems SQL简介 InterSystems SQL提供对InterSystems IRIS®Data Platform数据库中存储的数据的无懈可击的标准关系访问。 InterSystems SQL提供以下优势: - 高性能和可扩展性-InterSystems SQL提供优于其他关系数据库产品的性能和可扩展性。此外,InterSystems SQL可以在各种硬件和操作系统上运行;从笔记本电脑到高端多CPU系统。 - 与InterSystems IRIS对象技术集成-InterSystems SQL与InterSystems IRIS Object技术紧密集成。可以混合使用关系访问和对象访问数据,而不会牺牲任何一种方法的性能。 - 维护成本低-与其他关系数据库不同,InterSystems IRIS应用程序不需要在已部署的应用程序中重建索引和压缩表格。 - 支持标准SQL查询-InterSystems SQL支持SQL-92标准语法和命令。在大多数情况下,可以毫不费力地将现有关系应用程序迁移到InterSystems IRIS,并自动利用InterSystems IRIS更高的性能和对象功能。 可以将InterSystems SQL用于多种目的,包括: - 基于对象和基于Web的应用程序-可以在InterSystems IRIS对象和Web Server Page应用程序中使用SQL查询来执行强大的数据库操作,如查找和搜索。 - 在线事务处理-InterSystems SQL为INSERT和UPDATE操作以及事务处理应用程序中常见的查询类型提供了出色的性能。 - 商业智能和数据仓库-InterSystems IRIS多维数据库引擎和位图索引技术的结合使其成为数据仓库式应用程序的最佳选择。 - 即时查询和报告-可以使用InterSystems SQL附带的功能齐全的ODBC和JDBC驱动程序连接到流行的报告和查询工具。 - 企业应用程序集成-InterSystems SQL Gateway使能够无缝地通过SQL访问ODBC或JDBC兼容的外部关系数据库中存储的数据。这使得在InterSystems IRIS应用程序中集成来自各种来源的数据变得容易。 # 架构 InterSystems SQL的核心由以下组件组成: - 统一数据字典-存储为一系列类定义的所有元信息的存储库。InterSystems IRIS自动为统一字典中存储的每个持久类创建关系访问(表)。 - SQL处理器和优化器-一组程序,用于解析和分析SQL查询,确定给定查询的最佳搜索策略(使用复杂的基于成本的优化器),并生成执行查询的代码。 - InterSystems SQL Server-一组InterSystems IRIS服务器进程,负责与InterSystems ODBC和JDBC驱动程序的所有通信。它还管理频繁使用的查询的高速缓存;当同一查询被多次执行时,可以从查询高速缓存中检索其执行计划,而不必由优化器再次处理。 ## 特点 InterSystems SQL包括一整套标准的关系型功能。这些措施包括: - 定义表和视图(DDL或数据定义语言)的能力。 - 对表和视图(DML或数据操作语言)执行查询的能力。 - 能够执行事务,包括插入、更新和删除操作。执行并发操作时,InterSystems SQL使用行级锁。 - 为更高效的查询定义和使用索引的能力。 - 能够使用各种数据类型,包括用户定义的类型。 - 定义用户和角色并为其分配权限的能力。 - 定义外键和其他完整性约束的能力。 - 定义INSERT、UPDATE和DELETE触发器的能力。 - 定义和执行存储过程的能力。 - 能够以不同的格式返回数据:用于客户端访问的ODBC模式;用于在基于服务器的应用程序中使用的显示模式。 ## 符合SQL-92 SQL-92标准在算术运算符优先级方面是不精确的;关于这一问题的假设因SQL实现而异。InterSystems SQL支持将系统配置为以下任一系统范围的SQL算术运算符优先级替代方案: - InterSystems SQL可以配置为严格按照从左到右的顺序解析算术表达式,没有运算符优先级。这与ObjectScript中使用的约定相同。因此,3+3*5=30。可以使用括号来强制执行所需的优先顺序。因此,3+(3*5)=18。 - InterSystems SQL可以配置为使用ANSI优先级分析算术表达式,这为乘法和除法运算符提供了比加法、减法和串联运算符更高的优先级。因此,3+3*5=18。如果需要,可以使用括号覆盖此优先级。因此,(3+3)*5=30。 SQL运算符优先级的默认值取决于InterSystems IRIS版本。 InterSystems SQL支持完整的入门级SQL-92标准,但有以下例外: - 不支持向表定义添加附加的CHECK约束。 - 不支持SERIALIZABLE(序列化)隔离级别。 - 分隔标识符不区分大小写;标准规定它们应该区分大小写。 - 在HAVING子句中包含的子查询中,应该能够引用该HAVING子句中“可用”的聚合。这不受支持。 ## 拓展 - InterSystems SQL支持许多有用的扩展。其中许多都与InterSystems IRIS提供对数据的同步对象和关系访问这一事实有关。 其中一些扩展包括: - 支持用户可定义的数据类型和函数。 - 以下对象引用的特殊语法。 - 支持子类化和继承。 - 支持对存储在其他数据库中的外部表进行查询。 - 用于控制表的存储结构以实现最高性能的多种机制。 ## 互操作性 - InterSystems SQL支持多种与其他应用程序和软件工具互操作的方法。 ## JDBC InterSystems IRIS包括一个符合标准的第4级JDBC客户机(全部是纯Java代码)。 InterSystems JDBC驱动程序提供以下特性: - 高性能 - 纯JAVA代码实现 - UNICODE支持 - 线程安全 可以将InterSystems JDBC与任何支持JDBC的工具、应用程序或开发环境一起使用。 ## ODBC InterSystems SQL的c语言调用级接口是ODBC。与其他数据库产品不同,InterSystems ODBC驱动程序是一个本机驱动程序——它不是构建在任何其他专有接口之上的。 InterSystems ODBC驱动程序提供以下功能: - 高性能 - 可移植性 - 原生Unicode支持 - 线程安全 可以将InterSystems ODBC与支持ODBC的任何工具,应用程序或开发环境一起使用。 ## 嵌入式SQL 在ObjectScript中,InterSystems SQL支持嵌入式SQL: **将SQL语句放置在方法(或其他代码)主体中的能力。使用嵌入式SQL,可以查询单个记录,或定义一个游标,然后使用该游标查询多个记录。嵌入式SQL已编译。默认情况下,它是在第一次执行(运行时)时进行编译的,而不是在包含它的例程进行编译时进行的。因此,在运行时检查SQLCODE错误很重要。** 还可以与包含嵌入式SQL的ObjectScript例程同时编译嵌入式SQL。 与InterSystems IRIS的对象访问功能结合使用时,嵌入式SQL的功能非常强大。例如,以下方法查找具有给定Name值的记录的RowID: ``` /// w ##class(PHA.TEST.SQL).FindByName("姚鑫") ClassMethod FindByName(fullname As %String) { &sql(SELECT %ID INTO :id FROM Sample.Person WHERE Name = :fullname) IF SQLCODE < 0 { SET baderr="SQLCODE ERROR:"_SQLCODE_" "_%msg RETURN baderr } ELSEIF SQLCODE = 100 { SET nodata="Query returns no data" RETURN nodata } RETURN "RowID="_id } ``` ``` DHC-APP>w ##class(PHA.TEST.SQL).FindByName("姚鑫") RowID=6 ``` 注意: 如果 Name 查处多条的话 id为查询的第一条数据 指定倒序,为最后一条。 ``` &sql(SELECT %ID INTO :id FROM Sample.Person WHERE Name = :fullname order by ID desc) ``` ``` DHC-APP>w ##class(PHA.TEST.SQL).FindByName("姚鑫") RowID=14 ``` ![image](/sites/default/files/inline/images/tu_pian__0.png) # 动态SQL 作为其标准库的一部分,InterSystems IRIS提供了一个%SQL.Statement类,可以使用它来执行动态(即在运行时定义的)SQL语句。可以在ObjectScript方法中使用动态SQL。例如,下面的方法查询指定数量的21世纪出生的人。该查询选择1999年12月31日之后出生的所有人,按出生日期对所选记录进行排序,然后选择前x条记录: ``` /// w ##class(PHA.TEST.SQL).Born21stC("姚鑫") ClassMethod Born21stC(x) { /// w ##class(PHA.TEST.SQL).Born21stC("1") ClassMethod Born21stC(x) { SET myquery=2 SET myquery(1) = "SELECT TOP ? Name,%EXTERNAL(DOB) FROM Sample.Person " SET myquery(2) = "WHERE DOB > 58073 ORDER BY DOB" SET tStatement = ##class(%SQL.Statement).%New() SET qStatus = tStatement.%Prepare(.myquery) IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT} SET rset = tStatement.%Execute(x) DO rset.%Display() WRITE !,"End of data" q "" } ``` ``` DHC-APP>w ##class(PHA.TEST.SQL).Born21stC("2") Name Expression_2 Ingrahm,Susan N. 02/10/2001 Goldman,Will H. 09/22/2002 2 Rows(s) Affected End of data ``` 准备查询时,该查询的优化版本将存储为缓存查询。该缓存查询被执行用于查询的后续调用,从而避免了每次执行查询时重新优化查询的开销。 ## 限制 请注意InterSystems SQL的以下限制: NLS可用于为单个全局变量以及当前运行的进程中的局部变量指定特定国家区域设置行为的$ORDER行为。InterSystems SQL可以在任何国家语言环境中使用和良好地工作。然而,InterSystems SQL当前的一个限制是,对于任何特定进程,它引用的所有相关全局变量都必须使用与当前进程区域设置相同的国家区域设置。 文章写得非常棒!学习! 学习到新知识sql动态查询,感谢!
文章
姚 鑫 · 三月 1, 2021

第二章 InterSystems SQL基础

# 第二章 InterSystems SQL基础 本章概述了InterSystems SQL的特性,特别是那些SQL标准未涵盖的特性,或者与InterSystems IRIS®数据平台统一数据架构相关的特性。 本教程假定读者具备SQL知识,并不是为介绍SQL概念或语法而设计的。 本章讨论以下主题: - 表 - 查询 - 权限 - 数据显示选项 - 数据排序类型 - 执行SQL # 表 在InterSystems SQL中,数据显示在表中。每个表都包含许多列。一个表可以包含零个或多个数据值行。以下术语大体上等效: 数据术语 | 关系数据库术语| InterSystems IRIS术语 ---|---|--- 数据库 | 架构| 包 数据库 | 表 | persistent class(持久类) 字段 | 列 | 属性 记录 | 行 | 表有两种基本类型:基表(包含数据,通常简称为表)和视图(基于一个或多个表提供逻辑视图)。 ## 模式与架构 SQL模式提供了一种将相关表,视图,存储过程和缓存查询的集合进行分组的方法。模式的使用有助于防止表级别的命名冲突,因为表,视图或存储过程的名称在其模式内必须唯一。应用程序可以在多个架构中指定表。 SQL模式与持久性类包相对应。通常,模式与其相应的程序包具有相同的名称,但是由于不同的模式命名约定或故意指定了不同的名称,因此这些名称可能有所不同。模式到程序包的映射在SQL到类名的转换中有进一步描述。 **模式是在特定的名称空间中定义的。模式名称在其名称空间内必须是唯一的。将第一个项目分配给它时,会自动创建一个模式(及其对应的程序包),从中删除最后一个项目时,会自动将其删除。** 可以指定一个限定或不限定的SQL名称,限定名称指定模式:schema.name。 非限定名不指定模式名。 如果不指定模式,InterSystems IRIS将提供如下模式: - 对于DDL操作,InterSystems IRIS使用系统范围的默认架构名称。此默认值可配置。它适用于所有名称空间。 - 对于DML操作,InterSystems IRIS可以使用用户提供的模式搜索路径或系统范围内的默认模式名称。在动态SQL,嵌入式SQL和SQL Shell中,使用了不同的技术来提供模式搜索路径。 DML(data manipulation language): 它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言 DDL(data definition language): DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用 DCL(Data Control Language): 是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL 要查看名称空间内的所有现有模式,请执行以下操作: 1. 在管理门户中,选择“系统资源管理器”,然后选择“ SQL”。使用页面顶部的Switch选项选择一个名称空间;这将显示可用名称空间的列表。选择一个名称空间。 ![image](/sites/default/files/inline/images/tu_pian__1.png) ![image](/sites/default/files/inline/images/2_12.png) 2. 选择屏幕左侧的Schema下拉列表。这将显示当前名称空间中的架构列表。从该列表中选择一个模式;所选名称将出现在“模式”框中。 ![image](/sites/default/files/inline/images/3_10.png) 3. 如果有数据下拉列表允许选择表,视图,过程或缓存的查询,或所有属于模式的所有这些。设置此选项后,单击三角形以查看项目列表。如果没有项目,则单击三角形无效。 ![image](/sites/default/files/inline/images/4_4.png) # 查询 在InterSystems SQL中,可以通过查询查看和修改表中的数据。粗略地说,查询有两种形式:查询数据(SELECT语句)和修改数据(INSERT,UPDATE和DELETE语句)。 可以通过多种方式使用SQL查询: - 在ObjectScript中使用嵌入式SQL。 - 在ObjectScript中使用动态SQL。 - 调用使用CREATE PROCEDURE或CREATE QUERY创建的存储过程。 - 使用类查询。 - 使用来自各种其他环境的ODBC或JDBC接口。 # 权限 InterSystems SQL提供了一种通过权限来限制对表、视图等的访问的方法。 # 数据显示选项 InterSystems SQL使用SelectMode选项来指定如何显示或存储数据。 可用的选项有Logical、Display和ODBC。 数据在内部以逻辑模式存储,并且可以在这些模式中的任何一种中显示。 通过使用`LogicalToDisplay()`、`LogicalToODBC()`、`DisplayToLogical()`和`odbcological()`方法,每个数据类型类都可以在内部逻辑格式和显示格式或ODBC格式之间进行转换。 当显示SQL SelectMode时,将应用LogicalToDisplay转换,并对返回值进行格式化以便显示。 默认的SQL SelectMode是逻辑的; 因此,默认情况下返回值以存储格式显示。 SelectMode影响查询结果集数据显示的格式,SelectMode还影响应该提供数据值的格式,例如在WHERE子句中。 InterSystems IRIS根据存储模式和指定的SelectMode选择合适的转换方法。 所提供的数据值与SelectMode之间的不匹配可能导致错误或错误的结果。 例如,如果`DOB`是一个以`$HOROLOG`逻辑格式存储的日期,并且WHERE子句指定`DOB > 2000-01-01 `(ODBC格式),则SelectMode = ODBC返回预期的结果。 `SelectMode = Display`生成`SQLCODE -146`,无法将日期输入转换为有效的逻辑日期值。 `SelectMode =Logic`将 `2000-01-01`解析为逻辑日期值,并返回零行。 对于大多数数据类型,三种SelectMode模式返回相同的结果。 以下数据类型受SelectMode选项影响: - 日期,时间和时间戳数据类型。 InterSystems SQL支持多种日期,时间和时间戳数据类型(`%Library.Date`,`%Library.Time`,`%Library.PosixTime`,`%Library.TimeStamp`和`%MV.Date`)。除`%Library.TimeStamp`外,这些数据类型对逻辑,显示和ODBC模式使用不同的表示形式。在其中的几种数据类型中,InterSystems IRIS以`$HOROLOG`格式存储日期。此逻辑模式内部表示包括从任意起始日期(1840年12月31日)起的天数的整数,逗号分隔符以及从当天午夜开始的秒数的整数。 InterSystems IRIS将`%PosixTime`时间戳存储为编码的64位带符号整数。在“显示”模式下,日期和时间通常以数据类型的FORMAT参数指定的格式显示,或者当前语言环境的日期和时间格式默认为`%SYS.NLS.Format`。美国语言环境的默认值为`DD / MM / YYYY hh:mm:ss`。在ODBC模式下,日期和时间始终表示为`YYYY-MM-DD hh:mm:ss.fff`。 `%Library.TimeStamp`数据类型还将这种ODBC格式用于逻辑和显示模式。 - `%LIST`数据类型。InterSystems IRIS逻辑模式使用两个非打印字符存储列表,这两个字符出现在列表中的第一个项目之前,并显示为列表项目之间的分隔符。在ODBC SelectMode中,列表项显示时列表项之间带有逗号分隔符。在Display SelectMode中,列表项显示时,列表项之间有空格分隔符。 - 指定`VALUELIST`和`DISPLAYLIST`的数据类型。如果处于显示模式,并且在字段具有`DISPLAYLIST`的表中插入一个值,则输入的显示值必须与`DISPLAYLIST`中的一项完全匹配。 - 空字符串和空BLOB(流字段)。在逻辑模式下,空字符串和BLOB由非显示字符`$CHAR(0)`表示。在显示模式下,它们由空字符串(“”)表示。 SQL SelectMode可以指定如下: - 对于当前进程,请使用`$SYSTEM.SQL.SetSelectMode()`。 - 对于InterSystems SQL Shell会话,请使用SET SELECTMODE命令。 - 使用“显示模式”下拉列表,从管理门户“执行查询”用户界面(系统资源管理器,SQL)获得查询结果集。 - 对于动态SQL `%SQL.Statement`实例,请使用`%SelectMode`属性。 - 对于嵌入式SQL,请使用ObjectScript `#SQLCompile` Select预处理器指令设置。该伪指令允许使用第四个值Runtime,它将选择模式设置为RuntimeMode属性设置为:逻辑,显示或ODBC。 RuntimeMode的默认值为Logical。 - 对于使用SELECTMODE关键字的SQL命令CREATE QUERY,CREATE METHOD,CREATE PROCEDURE和CREATE FUNCTION。 - 通过使用`%EXTERNAL`,`%INTERNAL`和`%ODBCOUT`函数在SQL查询中的单个列。 # 数据排序 Collation种类决定了值的排序和比较方式,它是InterSystems SQL和InterSystems IRIS对象的一部分。 **可以指定排序规则类型作为字段/属性保护的一部分。除非另有说明,否则字符串字段/属性默认为命名空间默认排序规则。默认情况下,字符串的命名空间默认排序规则是SQLUPPER。 SQLUPPER排序规则将字符串转换为大写,以便排序和比较。因此,除非另有说明,字符串排序和比较不区分大小写。** 可以指定排序规则类型作为索引保护的一部分,或者使用索引字段的排序规则类型。 通过将排序函数应用于字段名,SQL查询可以覆盖未保护的字段/属性排序规则类型。ORDER BY子句指定查询的结果集序列;如果指定的字符串字段被保护为SQLUPPER,查询结果顺序不区分大小写。 # 执行SQL InterSystems IRIS支持多种方法来编写和执行SQL代码。其中包括: - 嵌入式SQL:嵌入在ObjectScript代码中的SQL代码。 - 动态SQL:使用`%SQL.Statement`类从ObjectScript中执行的SQL代码。 - `Execute()`方法:使用`%SYSTEM.SQL`类的`Execute()`方法执行SQL代码。 - 包含SQL代码的存储过程,使用CREATE PROCEDURE或CREATE Query创建。 - SQL Shell:从终端界面执行的SQL语句。 - 执行查询界面:从管理门户执行的SQL语句。 可以使用InterSystems IRIS对象(类和方法)执行以下操作: - 持久性类(SQL表)。 - 定义索引。 - 定义并使用类查询。 关于动态SQL能再详细说说吗? 实用帖,非常好的学习知识,感谢!

#InterSystems API管理器(IAM)

14 帖子0 关注者

#InterSystems IRIS FAQ

0 帖子0 关注者

#InterSystems IRIS for Health

630 帖子0 关注者
文章
Qiao Peng · 三月 5, 2021

InterSystems IRIS 元素周期表

InterSystems IRIS 元素周期表 PDF 版本: GIT 源: InterSystems IRIS 是一个具有许多功能的数据平台。 这些功能和相关的 IRIS 主题都体现在元素周期表中。