清除过滤器
文章
姚 鑫 · 三月 4, 2021
# 第三章 SQL语言元素(二)
# 算术运算符和函数
InterSystems SQL支持以下算术运算符:
- `+` 加法操作符。
例如,`17+7 = 24`。
- `–` 减法运算符。
例如,`17-7等于10`。
注意,这些字符中的一对是InterSystems SQL注释指示器。
因此,要指定两个或多个减法操作符或负号,必须使用空格或圆括号。
例如,`17- -7或17-(-7)等于24`。
运算符 | 描述
---|---
`+` | 加法操作符。
`–` | 减法运算符。例如,`17-7等于10`。注意,这些字符中的一对是InterSystems SQL注释指示器。因此,要指定两个或多个减法操作符或负号,必须使用空格或圆括号。
`*` |乘法运算符。例如,`17*7等于119`。
`/` | 除法操作符。例如:`17/7 = 2.428571428571428571`。
`\` | 整数除法运算符。例如,`17\7等于2`。
`#` | 模运算符。例如,`17 #7等于3`。注意,因为#字符也是一个有效的标识符字符,要将它用作模运算符,应该指定它与操作数之间用前后空格分隔
`E` | 求幂(科学记数法)运算符。可以是大写或小写。例如:`7E3 = 7000`。指数过大会导致`SQLCODE -7`“指数超出范围”错误。例如1E309、7E308。
`()`| 分组操作符。用于嵌套算术运算。除非使用了圆括号,否则在InterSystems SQL中算术操作的执行顺序是严格的从左到右的顺序。例如,`17+7*2等于48`,但`17+(7 * 2)等于31`。
`||` | 连接运算符。例如,`17||7等于177`。
算术运算是对标准形式的数字进行的。
## 产生的数据类型
当对两个具有不同数据类型的数值执行算术运算时,结果数据类型确定如下:
对于加法(`+`),减法(`-`),整数除法(`\`),和取模(`#`):
描述 |NUMERIC| INTEGER| TINYINT| SMALLINT| BIGINT| DOUBLE
---|---|---|---|---|---|---
NUMERIC| NUMERIC| NUMERIC| NUMERIC |NUMERIC| NUMERIC |DOUBLE
INTEGER |NUMERIC| BIGINT |BIGINT| BIGINT| BIGINT| DOUBLE
TINYINT |NUMERIC| BIGINT| SMALLINT| INTEGER |BIGINT| DOUBLE
SMALLINT| NUMERIC |BIGINT| INTEGER| INTEGER |BIGINT| DOUBLE
BIGINT| NUMERIC| BIGINT| BIGINT| BIGINT| BIGINT| DOUBLE
DOUBLE| DOUBLE| DOUBLE| DOUBLE| DOUBLE |DOUBLE |DOUBLE
对于乘法(`*`)或除法(`/`):
描述 |NUMERIC| INTEGER| TINYINT| SMALLINT| BIGINT| DOUBLE
---|---|---|---|---|---|---
NUMERIC| NUMERIC| NUMERIC| NUMERIC| NUMERIC| NUMERIC| DOUBLE
INTEGER| NUMERIC| NUMERIC| NUMERIC| NUMERIC| NUMERIC| DOUBLE
TINYINT| NUMERIC| NUMERIC| NUMERIC| NUMERIC| NUMERIC| DOUBLE
SMALLINT| NUMERIC| NUMERIC| NUMERIC| NUMERIC| NUMERIC| DOUBLE
BIGINT| NUMERIC| NUMERIC| NUMERIC| NUMERIC| NUMERIC| DOUBLE
DOUBLE| DOUBLE| DOUBLE| DOUBLE| DOUBLE| DOUBLE |DOUBLE
连接任意数据类型的两个数字将产生VARCHAR字符串。
在动态SQL中,可以使用SQL列元数据来确定结果集字段的数据类型。
## 运算符优先级
SQL-92标准在操作符优先级方面不精确;
关于这个问题的假设在不同的SQL实现中有所不同。
InterSystems SQL可以配置为支持任意一种优先级:
- 在InterSystems IRIS 2019.1及其后续版本中,InterSystems SQL默认支持算术运算符的ANSI优先级。
这是一个系统范围的配置设置。
当配置ANSI优先级时,`"*"`、`"\"`、`"/"`和`"#"`操作符的优先级高于`"+"`、`"-"`和`"||"`操作符。
优先级高的操作符在优先级低的操作符之前执行。
因此,`3+3*5 = 18`。
如果需要,可以使用括号覆盖优先级。
因此,`(3+3)*5 = 30`。
在安装InterSystems IRIS 2019.1时,支持默认的ANSI优先级;
升级InterSystems IRIS 2018.1到InterSystems IRIS 2019.1时,操作符优先级仍然配置为InterSystems IRIS 2018.1 default:严格从左到右的顺序。
- 在InterSystems IRIS 2018.1中,InterSystems SQL默认不提供算术运算符的优先级。
默认情况下,InterSystems SQL严格按照从左到右的顺序执行算术表达式,没有操作符优先级。
这与ObjectScript中使用的约定相同。
因此,`3+3*5 = 30`。
可以使用括号来强制要求的优先级。
因此,`3+(3*5)= 18`。
谨慎的开发人员应该使用圆括号来明确地表达他们的意图。
**可以使用`$SYSTEM.SQL.SetANSIPrecedence()`方法在系统范围内配置任意一种SQL操作符优先级。
`1 = ANSI优先`;
`0 =严格从左到右的计算`。**
要确定当前设置,调用`$SYSTEM.SQL.CurrentSettings()`。
更改此SQL选项将立即在系统范围内生效。
更改此选项将导致在系统范围内清除所有缓存的查询。
更改SQL优先级对ObjectScript没有影响。
ObjectScript总是严格遵循从左到右的算术运算符执行。
## 精度和等级
数字结果的精度(数字中存在的最大数字数)为:
- 使用以下算法确定加减:`resultprecision=max(scale1, scale2)+ max(precision1-scale1, precision2-scale2)+1`。
当计算结果精度大于36时,将精度值设置为36。
- 乘法使用以下算法确定:`resultprecision=min(36, precision1+precision2+1)`。
- 除法(value1 / value2)通过以下算法确定:`resultprecision=min(36, precision1-scale1 +scale2+max(6, scale1+precision2+1))`。
以下数字结果的比例(最大小数位数):
- 加法或减法使用以下算法确定:`resultscale=max(scale1, scale2)`。
- 乘法使用如下算法确定:`resultscale=min(17, scale1+scale2)`。
- 除法(value1 / value2)通过如下算法确定:`resultscale=min(17, max(6, scale1+precision2+1))`。
## 算术和三角函数
InterSystems SQL支持以下算术函数:
代码 | 描述
---|---
ABS |返回数字表达式的绝对值。
CEILING|返回大于或等于数字表达式的最小整数。
EXP| 返回数值表达式的对数指数(以e为底)值。
FLOOR| 返回小于或等于数字表达式的最大整数。
GREATEST| 从逗号分隔的数字列表中返回最大的数字。
ISNUMERIC| 返回一个布尔码,指定表达式是否为有效数字。
LEAST| 从逗号分隔的数字列表中返回最小的数字。
LOG|返回数字表达式的自然对数(以e为基数)值。
LOG10| 返回数字表达式的以10为基数的日志值。
MOD| 返回除法运算的模值(余数)。与#操作符相同。
PI| 返回数值常量pi。
POWER| 返回数值表达式的指定幂的值
ROUND| 返回四舍五入(或截断)到指定数字数目的数字表达式。
SIGN|返回数值代码,指定数值表达式的计算结果是正、零还是负。
SQRT| 返回数值表达式的平方根。
SQUARE| 返回数值表达式的平方。
TRUNCATE|返回截断为指定数字数目的数字表达式。
InterSystems SQL支持下列三角函数。
代码 | 描述
---|---
ACOS| 返回数值表达式的反余弦值。
ASIN| 返回数字表达式的反正弦值。
ATAN| 返回数值表达式的正切。
COS |返回数值表达式的余弦值。
COT |返回数值表达式的余切。
SIN |返回数值表达式的正弦值。
TAN |返回数值表达式的切线。
DEGREES| 将弧度转换为角度。
RADIANS |将角度转换为弧度。
# 关系运算符
条件表达式的计算结果为布尔值。条件表达式可以使用以下关系运算符:
代码 | 描述
---|---
`=`| 等于运算符。
`!=` ``|不等于运算符。这两种句法形式在功能上是相同的。
``| 大于运算符。
`=`| 大于或等于运算符。
比较表格字段值时,这些相等运算符将使用字段的默认排序规则。 InterSystems IRIS默认值不区分大小写。比较两个文字时,比较区分大小写。
比较浮点数时,应避免使用等号运算符(等于或不等于)。浮点数(数据类型为`%Library.Decimal`和`%Library.Double`类)存储为二进制值,而不是固定精度的数字。在转换过程中,舍入运算可能会导致两个浮点数不完全相等,这些浮点数旨在表示相同的数字。使用小于/大于测试来确定两个浮点数是否“相同”至所需的精度。
## 包含并跟随运算符
InterSystems SQL还支持“包含”和“跟随”比较运算符:
- `[` 包含运算符。返回包含操作数的所有值,包括等于该操作数的值。该运算符使用`EXACT`(区分大小写)排序规则。取反是`NOT [`。
- `Contains`运算符确定一个值是否包含指定的字符或字符串。区分大小写。
- `%STARTWITH`谓词条件确定值是否以指定的字符或字符串开头。它不区分大小写。
- InterSystems SQL搜索可用于确定值是否包含指定的单词或短语。 SQL Search执行上下文感知匹配。它不区分大小写。
- `]` 跟随运算符。返回排序规则序列中跟随操作数的所有值。排除操作数值本身。该运算符使用字段的默认排序规则。 InterSystems IRIS默认值不区分大小写。反之则不是`]`。
例如,`SELECT Age FROM MyTable,其中Age] 88`返回89或更大的值,但也返回9,因为在排序序列中9在88之后。
`SELECT Age FROM MyTable WHERE Age > 88`返回89以上;
它不会返回9。
字符串操作数,如`' ABC '`,排序在任何包含附加字符的字符串(如`' ABCA '`)之前;
因此,要从`[`操作符或`>`操作符中排除操作数字符串,必须指定整个字符串。
`Name ] ‘Smith,John’ `包含 `‘Smith,John’` 不包含 `‘Smith,John P.’`
# 逻辑运算符
SQL逻辑运算符用于评估为True或False的条件表达式中。这些条件表达式在`SELECT`语句`WHERE`和`HAVING`子句,`CASE`语句`WHEN`子句,`JOIN`语句`ON`子句和`CREATE TRIGGER`语句`WHEN`子句中使用。
## 非一元运算符
可以使用`NOT`一元逻辑运算符来指定条件的逻辑逆,如以下示例所示:
```sql
SELECT Name,Age FROM Sample.Person
WHERE NOT Age>21
ORDER BY Age
```
```sql
SELECT Name,Age FROM Sample.Person
WHERE NOT Name %STARTSWITH('A')
ORDER BY Name
```
可以将`NOT`运算符放在条件之前(如上所示)。或者,不能将`NOT`放在单字符运算符之前;例如,`NOT =65
ORDER BY Age
```
```sql
SELECT Name,Age FROM Sample.Person
WHERE Age>20
& Age=40 & (Age # 2)=0
! Age>=65
ORDER BY Age
```
可以使用括号将逻辑运算符分组。这将建立分组级别;评估从最低的分组级别到最高的分组级别进行。在下面的第一个示例中,“与”条件仅应用于第二个“或”条件。它返回来自MA的任何年龄的人,以及来自NY的小于25岁的人:
```sql
SELECT Name,Age,Home_State FROM Sample.Person
WHERE Home_State='MA' OR Home_State='NY' AND Age < 25
ORDER BY Age
```
使用括号对条件进行分组会得出不同的结果。以下示例返回来自MA或NY的年龄小于25的人员:
```sql
SELECT Name,Age,Home_State FROM Sample.Person
WHERE (Home_State='MA' OR Home_State='NY') AND Age < 25
ORDER BY Age
```
- SQL执行使用短路逻辑。如果条件失败,将不会测试其余的`AND`条件。如果条件成功,则将不会测试其余的`OR`条件。
- 但是,由于SQL优化了`WHERE`子句执行,因此无法预测并且不应该依赖多个条件(在同一分组级别)的执行顺序。
# 注释
InterSystems SQL支持单行注释和多行注释。注释文本可以包含任何字符或字符串,当然,指示注释结尾的字符除外。
注意:使用嵌入式SQL标记语法`(&sql(...))` 对SQL注释的内容强加了限制。如果使用标记语法,则SQL代码中的注释可能不包含字符序列“)``”。
可以使用`preparse()`方法返回去除注释的SQL DML语句。 `preparse()`方法还用`?`替换每个查询参数。字符并返回这些参数的`%List`结构。以下示例中的`preparse()`方法返回查询的解析版本,除去单行和多行注释以及空格:
```sql
/// d ##class(PHA.TEST.SQL).Null5()
ClassMethod Null5()
{
SET myq=4
SET myq(1)="SELECT TOP ? Name /* first name */, Age "
SET myq(2)=" FROM Sample.MyTable -- this is the FROM clause"
SET myq(3)=" WHERE /* various conditions "
SET myq(4)="apply */ Name='Fred' AND Age > 21 -- end of query"
DO ##class(%SQL.Statement).preparse(.myq,.stripped,.args)
WRITE stripped,!
WRITE $LISTTOSTRING(args)
}
```
```sql
DHC-APP>d ##class(PHA.TEST.SQL).Null5()
SELECT TOP ? Name , Age FROM Sample . MyTable WHERE Name = ? AND Age > ?
?,?,c,Fred,c,21
```
## 单行注释
单行注释由两个连字符前缀指定。注释可以在单独的行上,也可以与SQL代码显示在同一行上。当注释在同一行上跟随SQL代码时,至少一个空格必须将代码与双连字符注释运算符分隔开。注释可以包含任何字符,包括连字符,星号和斜杠。注释继续到该行的末尾。
下面的示例包含多个单行注释:
```sql
-- This is a simple SQL query
-- containing -- (double hyphen) comments
SELECT TOP 10 Name,Age, -- Two columns selected
Home_State -- A third column
FROM Sample.Person -- Table name
-- Other clauses follow
WHERE Age > 20 AND -- Comment within a clause
Age < 40
ORDER BY Age, -- Comment within a clause
Home_State
-- End of query
```
## 多行注释
多行注释由`/ * 开头定界符和 * /`结束定界符指定。注释可以出现在一个或多个单独的行上,或者可以与SQL代码在同一行上开始或结束。注释定界符应与SQL代码分隔至少一个空格。注释可以包含任何字符,包括连字符,星号和斜杠,但* /字符对显然是例外。
下面的示例包含多个多行注释:
```sql
/* This is
a simple
SQL query. */
SELECT TOP 10 Name,Age /* Two fields selected */
FROM Sample.Person /* Other clauses
could appear here */ ORDER BY Age
/* End of query */
```
当注释掉嵌入式SQL代码时,请始终在`&sql`指令之前或括号内开始注释。下面的示例正确注释掉了两个嵌入式SQL代码块:
```sql
SET a="default name",b="default age"
WRITE "(not) Invoking Embedded SQL",!
/*&sql(SELECT Name INTO :a FROM Sample.Person) */
WRITE "The name is ",a,!
WRITE "Invoking Embedded SQL (as a no-op)",!
&sql(/* SELECT Age INTO :b FROM Sample.Person */)
WRITE "The age is ",b
```
## SQL代码保留为注释
嵌入式SQL语句可以保留为例程的.INT代码版本中的注释。这是通过设置`$SYSTEM.SQL.SetRetainSQL()`方法完成的。若要确定当前设置,请调用`$ SYSTEM.SQL.CurrentSettings()`,它将显示“将SQL保留为注释”设置。默认值为1(“是”)。
将此选项设置为“是”以将SQL语句保留为例程的.INT代码版本中的注释。将此选项设置为“是”还会在注释文本中列出SQL语句使用的所有非%变量。这些列出的变量也应该在ObjectScript过程的PUBLIC变量列表中列出,并使用NEW命令重新初始化。 有用 欢迎来投票:) 讲的很细,非常有帮助! 非常不错的学习资料,十分感谢! 技术博主👍
公告
Michael Lei · 五月 13, 2021
Intersystems RIS 机器学习工具包, 包括Python/R/Julia, 支持协调管理基于云的高级分析服务,如微软Azure数据工厂和机器学习。
文章
Michael Lei · 六月 15, 2021
本帖概述了通过为 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。
公告
Claire Zheng · 四月 11, 2022
Hi开发者们,
我们非常高兴地向大家宣布此次 InterSystems Globals开发者竞赛的获奖者!
第19届编程大赛的优胜者名单如下:
专家提名奖(Experts Nomination)- 获奖者由我们特别挑选的专家团选出:
🥇 第一名,奖金 $4,000 获奖项目 global-mindmap 开发者 @Yuri.Gomes
🥈 第二名,奖金 $2,000 获奖项目 globals-tool 开发者 @Dmitry.Maslennikov
🥉 第三名,奖金 $1,000 获奖项目 iris-globals-graphDB 开发者 @Muhammad.Waseem
更多获奖者:
🏅 奖金$100 ,获奖项目 python-globals-serializer-example 开发者 @José.Pereira
🏅 奖金$100 ,获奖项目 global-archiver 开发者 @Lorenzo.Scalese
🏅 奖金$100 ,获奖项目 blockchain - [ IRIS python ] 开发者 @davimassaru.teixeiramuta
🏅 奖金$100 ,获奖项目 Globals: Embedded Python vs. ObjectScript 开发者 @Robert.Cemper1003
🏅 奖金$100 ,获奖项目 zpm-generate-ui 开发者 @MikhailenkoSergey
🏅 奖金$100 ,获奖项目 GlobalToJSON-XL-Academic 开发者 @Robert.Cemper1003
🏅 奖金$100 ,获奖项目 Cubes 开发者 @Sean.Connelly
🏅 奖金$100 ,获奖项目 GlobalToJSON-Efficient 开发者 @Robert.Cemper1003
🏅 奖金$100 ,获奖项目 iris-globals-contest 开发者 @Oliver.Wilms
🏅 奖金$100 ,获奖项目 GlobalToJSON-Compact 开发者 @Robert.Cemper1003
🏅 奖金$100 ,获奖项目 global-name-search 开发者 @Jailton.Viçôzo
🏅 奖金$100 ,获奖项目 React-UI-Global 开发者 @Evgeniy.Potapov
社区提名奖(Community Nomination)- 获得总投票数最多的应用:
🥇 第一名,奖金 $1,000 ,获奖项目 globals-tool 开发者 @Dmitry.Maslennikov
🥈 第二名,奖金 $750 ,获奖项目 python-globals-serializer-example 开发者 @José.Pereira
🥉 第三名,奖金 $500 ,获奖项目 iris-globals-graphDB 开发者 @Muhammad.Waseem
恭喜所有优胜者!
感谢大家对本次比赛的关注和付出,是你们的付出让这次大赛熠熠生辉!ღ( ´・ᴗ・` )比心🙌
接下来呢?
如果没有获奖,也不要灰心气馁!要知道,失败是成功之母,坚持下去就能成功 (^-^)V
准备好,期待五月的大赛吧! 😎
文章
Michael Lei · 六月 11, 2022
在检查我们的^pButtons(在IRIS中改名为^SystemPerformance)性能监控工具的文档时,一位客户告诉我。"我理解所有内容,但我希望它能更简单......更容易定义配置文件,管理它们等等"。
在这次会议之后,我认为尝试为其提供一些更简单的人机界面是一个不错的试验。
这方面的第一步是在现有的pButtons例程上包裹一个基于类的API。
我还能够添加一些更多的 "功能",比如显示当前正在运行的配置文件,它们剩余的运行时间,以前运行的进程等等。
下一步是在这个API的基础上添加一个REST API类。
有了这个工件(pButtons REST API),人们就可以在上面建立一个比较时髦的用户界面。
举个🌰: -
我在这里分享这个方法的几个步骤:
两个类是 "Basic "API –
以及REST API(包括一些单元测试类来测试这些)。
一个用于REST API的Swagger JSON。为了构建这个,我使用了当时(2017年)InterSystems IRIS中尚未发布的REST管理功能。在InterSystems IRIS提供的基本Swagger JSON的基础上,我添加了更多的信息。
以及一个更加简单的angular UI界面 (基于 http://websystique.com/angularjs/angularjs-crud-application-using-ngresource/)
几个重点提示:
大多数的 "Basic "API方法都使用有文档的和官方支持的pButtons/SystemPerformance rountine的入口点。但有些方法是访问由pButtons工具管理的内部结构。这些方法没有被记录下来,也不被支持,这些方法在升级后可能会停止工作而不被通知。
这段代码不应该作为使用InterSystems IRIS构建基于REST的Angular应用程序的 "最佳实践 "范例。UI部分只是作为一个例子/"预告 "和示例的起点,[例如,它并不完整--"常规部分"(例如,日志文件夹位置管理的占位符)没有实现;刷新内容并不完全工作,以及其他一些 "已知问题..."]
这段代码最早是在很久之前写的--所以:
(a) 我重新检查/测试/修改确保能在IRIS上运行 (包括改些名字等等).
(b) REST API并没有使用需求/设计优先的方法--我最初确实玩过(当时)IRIS-beta对生成Swagger的支持,现在用它把这个变成了需求/设计优先的方法.
(c) 这个可能没有用到最新的特性.
(d) 我现在还增加了对在Docker容器中运行的支持(有相关的Docker文件等)。
(e) 我还增加了能作为ZPM包安装的支持。
应用和源代码:https://openexchange.intersystems.com/package/sys-perf-restapi
公告
Claire Zheng · 十一月 23, 2023
大家好!
终于到了宣布获奖名单的时间!
🏆InterSystems开发者社区中文版第二届技术征文大赛🏆(←点击链接进入参赛页面,浏览所有参赛文章)已经结束,此次大赛收到了来自8名参赛者的12篇参赛文章,最终进入评选的文章为10篇,感谢大家的积极参与!
以下是获奖名单!
专家提名奖:活动期间发布文章且成功参赛后,由InterSystems专家评选得出
🥇第一名,姚 鑫,作品:浅谈一下个人基于IRIS后端业务开发框架的理解
🥈第二名,王喆 👀, 作品:IRIS自动安装集群--manifest(安装清单)
🥉第三名,Yuxiang Niu,作品:关于Cache中查看关键锁的几种方式
🏆第四名,liu bo,作品:通过自定义数据类型实现参数统一验证优化重构代码
开发者社区奖:活动期间发布文章且成功参赛后,由社区成员点赞评选得出
🥇第一名,Yongfeng Hou ,作品:IRISHealth在DBServer和ECPApp之间启用SSL/TLS安全双向认证加密通信
🥈第二名,Meng Cao ,作品:使用支持SSL的ODBC连接IRIS数据库
🥉第三名,water huang,作品:进程表
🏆第四名,haoyinhang Hao ,作品:通过XSL自动生成消息模型
恭喜获奖者!
感谢大家的积极参与!
奖品领取
请获奖者点击【获奖者信息提交】提交信息,以便我们及时与您联系奖品寄送事宜。
提醒:填写前请准备好自己的社区主页链接(点击头像右上角进入个人主页,复制浏览器链接即可,如:https://cn.community.intersystems.com/user/claire-zheng)
文章
姚 鑫 · 一月 20, 2023
# 第五十一章 使用 ^SystemPerformance 监视性能 - Apple macOS 平台的 InterSystems IRIS 性能数据报告
- `%SS` - 使用 `ALL^%SS` 命令在运行过程中采集了四个样本。
- `Configuration *` - 来自服务器的 `IRIS` 实例名称和主机名、完整的 `IRIS` 版本字符串、许可客户名称和许可订单号。
- `cpf file *` - 当前活动配置文件的副本。
- `irisstat -c` - 使用命令 `irisstat cache -p-1 -c-1 -e1 -m8 -n2 -N127` 在运行过程中以均匀的间隔采集四个样本。以下是对每个参数的简要说明:
- `-p-1`: 对进程表进行采样以包括进程和全局状态信息。
- `-c-1`: 对共享内存的计数器部分进行采样以显示日志、锁、磁盘和资源使用统计信息。
- `-e1: SYSLOG` 错误表。
- `-m8`: 文件表,其中包括所有 `IRIS.DAT` 文件及其属性。
- `-n2`: 网络结构表,包括本地到远程数据库的映射。
- `-N127`: 客户端和服务器连接的 `ECP` 统计信息。
- `irisstat -D` - 使用命令 `irisstat cache --f1 -D10,100` 在运行过程中以均匀的间隔采集八个样本。以下是对每个参数的简要说明:
- `-fl`: 基本标志。
- `-D10,100`: 在 `10` 秒的总采样周期内,每 `100` 毫秒对块碰撞进行采样。
- `ipcs *` - 进程间通信配置信息,包括共享内存、信号量和消息队列; `ipcs -a` 命令的输出。
- `license *` - 使用 `Decode^%LICENSE` 和 `counts^%LICENSE` 的 `IRIS` 许可使用信息。
- `macOS Info *` - 操作系统版本和硬件信息。 `sw_vers`、`uname` `-a、mount` 和 `netstat` 命令的输出。
- `mgstat` - 使用 `^mgstat` 实用程序在运行过程中获取 `IRIS` 特定数据。请参阅 `Monitoring Guide` 的 `Monitoring Performance Using ^mgstat` 部分。
- `Profile *` - 有关创建此日志的 `^SystemPerformance` 配置文件的信息。
- `ps:` - 使用命令 `ps -eflv` 在运行过程中以均匀的间隔采集四个样本。
- `sar -d` - 磁盘(块)设备吞吐量和延迟统计信息。
- `sar -g` - 页面输出率。
- `sar -n DEV` - 网络设备吞吐量。
- `sar -n EDEV` - 网络设备错误率。
- `sar -p` - 页入和页错误率。
- `sar -u` - CPU 使用统计。
- `sysctl -a *` - 内核和系统参数设置。
- `vm_stat *` - 内存页面信息。
文章
姚 鑫 · 一月 21, 2023
# 第五十二章 使用 ^SystemPerformance 监视性能 - IBM AIX® 平台的 InterSystems IRIS 性能数据报告
- `%SS` - 使用 `ALL^%SS` 命令在运行过程中采集了四个样本。
- `AIX info *` - `oslevel` 的输出。 `uname -a`、`prtconf` 和 `lspv `命令
- `Configuration *` - 来自服务器的 `IRIS` 实例名称和主机名、完整的 `IRIS` 版本字符串、许可客户名称和许可订单号。
- `cpf file *` - 当前活动配置文件的副本。
- `cpu type *` - 有关安装的处理器以及是否启用 `SMT` 的信息; `lsattr -El proc0` 的输出。
- `irisstat -c` - 使用命令 `irisstat cache -p-1 -c-1 -e1 -m8 -n2 -N127` 在运行过程中以均匀的间隔采集四个样本。以下是对每个参数的简要说明:
- `-p-1`: 对进程表进行采样以包括进程和全局状态信息。
- `-c-1`: 对共享内存的计数器部分进行采样以显示日志、锁、磁盘和资源使用统计信息。
- `-e1`: `SYSLOG` 错误表。
- `-m8`: 文件表,其中包括所有 `IRIS.DAT` 文件及其属性。
- `-n2`: 网络结构表,包括本地到远程数据库的映射。
- `-N127`: 客户端和服务器连接的 `ECP` 统计信息。
- `irisstat -D` - 使用命令 `irisstat cache --f1 -D10,100` 在运行过程中以均匀的间隔采集八个样本。以下是对每个参数的简要说明:
- `-fl`: 基本标志。
- -`D10,100`: 在 `10` 秒的总采样周期内,每 `100` 毫秒对块碰撞进行采样。
- `df -k *` - 有关挂载文件系统的信息,包括挂载点、逻辑卷和可用空间; `df -k` 命令的输出。
- `filesystems *` - 当前 `/etc/filesystems` 文件。
- `ioo -a *` - `I/O`可调参数的当前值; `ioo -a` 命令的输出。仅当启动 `^SystemPerformance` 配置文件运行的用户具有 `root` 访问权限时才包括在内。
- `iostat -DIT` - 带有 `IBM AIX® 5.3` 及更新版本采样时间的扩展磁盘/设备统计信息的长列表; `iostat -DIT` 命令的输出。信息因 `IBM AIX® 5.3` 之前的发行版而异。
- `ipcs *` - 进程间通信配置信息,包括共享内存、信号量和消息队列; `ipcs -a` 命令的输出。
- `license *` - 使用 `Decode^%LICENSE` 和 `counts^%LICENSE` 的 `IRIS` 许可使用信息。
- `mount *` - 有关所有文件系统及其挂载选项的信息。
- `mgstat` - 使用 `^mgstat` 实用程序在运行过程中获取 `IRIS` 特定数据。请参阅 `Monitoring Guide` 的 `Monitoring Performance Using ^mgstat` 部分。
- `Profile *` - 有关创建此日志的 `^SystemPerformance` 配置文件的信息。
- `ps:` - 使用命令 `ps aux` 在运行过程中以均匀的间隔采集四个样本。
- `sar -d` - 仅当启动 `^SystemPerformance` 配置文件运行的用户具有 `root` 访问权限并且 `/usr/sbin/sar` 存在时才包括在内。
- `sar -r` - 仅当启动 `^SystemPerformance` 配置文件运行的用户具有 `root` 访问权限并且 `/usr/sbin/sar` 存在时才包括在内。
- `sar -u` - 包括微分区信息(如果使用)的 `CPU` 统计信息。仅当启动 `^SystemPerformance` 配置文件运行的用户具有 `root` 访问权限并且 `/usr/sbin/sar` 存在时才包括在内。
- `vmo –a` - 虚拟内存可调参数的当前值; `vmo -a` 命令的输出。仅当启动 `^SystemPerformance` 配置文件运行的用户具有 `root` 访问权限时才包括在内。
- `vmstat -s *` - 虚拟内存统计的绝对计数,包括总页入和页出。
- `vmstat -t` - 带有时间戳的虚拟内存和 `CPU`(分页、排队和 CPU)统计信息。
- `vmstat -v *` - 示例虚拟内存统计信息,包括可用页面、`pbuf` 使用情况和 `fsbuf` 使用情况。
问题
e Neo · 七月 31, 2023
vscode通过插件:intersystems Server Manager 连接测试开发环境,配置连接后无法使用
配置参数:
"intersystems.servers": {
"local": {
"webServer": {
"scheme": "http",
"host": "127.0.0.1",
"port": 52773
},
"test": {
"webServer": {
"scheme": "https",
"host": "xxx.xxx.xxx.xxx",
"port": 2443
},
"description": "test",
"username": "_system"
}
错误信息:
Server Could not be accessed by ‘“_system”
看起来是_system用户没有通过vscode接入平台的权限,如果换成SuperUser之类的客户是否可以接入?
公告
Claire Zheng · 十月 23, 2022
各位开发者社区的同学们,大家好!
经过一个多月的赛期,我们举办的🏆InterSystems开发者社区中文版首届技术征文大赛🏆(←点击链接进入参赛页面,浏览所有参赛文章)即将步入尾声!
InterSystems开发者社区(中文版)首届技术征文大赛的“征文&投票”环节将于12小时后结束(截至10月23日24:00)!抓住最后的时间为你喜欢的作品投票吧!
10月24日19:30开始,我们将通过“InterSystems首届技术征文大赛线上分享会”发布获奖名单、进行征文作品分享&点评、探讨热门话题,同期还将举办多轮抽奖!
欢迎参会,锁定#腾讯会议
会议主题:InterSystems首届技术征文大赛线上分享会会议时间:2022/10/24 19:30-21:00 (GMT+08:00) 中国标准时间 - 北京
点击链接入会,或添加至会议列表:https://meeting.tencent.com/dm/nVHWgZcY5NfZ
#腾讯会议:372-615-324
文章
Claire Zheng · 二月 28, 2023
这是InterSystems 2022年全球峰会上来自客户 Cognetivity Neuroscience 的分享。InterSystems IRIS 数据平台助力 Cognetivity Neurosciences 打造脑健康管理评估工具CognlCA。CognlCA 能够在正确的时间将数据提供给正确的人,推动脑健康评估、筛查和管理的节点前置,从而促进脑健康管理的普惠化。
文章
Michael Lei · 四月 10, 2022
系统实用类:SYS.Database中的查询FreeSpace可以用来在任何时候检查磁盘上的自由空间。
下面是在IRIS终端中的尝试方法(进入%SYS命名空间,然后运行它)。
zn "%SYS"
set stmt=##class(%SQL.Statement).%New()
set st=stmt.%PrepareClassQuery("SYS.Database","FreeSpace")
set rset=stmt.%Execute()
// 一次性显示所有
do rset.%Display()
输出结果示例如下。
*在命令执行的例子中,所有的数据库都放在同一个磁盘上,所以所有的磁盘空闲空间(DiskFreeSpace)返回相同的值。
Dumping result #1
DatabaseName Directory MaxSize Size ExpansionSize AvailableFreeDiskFreeSpace Status SizeInt AvailableNum DiskFreeSpaceNum ReadOnly
IRISSYS c:\intersystems\irishealth3\mgr\ 無制限 159MB 系统默认 ト 18MB 11.32 245.81GB マウント/RW 159 18 2517050
ENSLIB c:\intersystems\irishealth3\mgr\enslib\ 無制限 226MB システムデフォル ト 19MB 8.4 245.81GB マウント/R 226 19 2517051
<一部省略>
IRISTEMP c:\intersystems\irishealth3\mgr\iristemp\ 無制限 51MBシス テムデフォルト 49MB 96.07 245.81GB マウント/RW 51 49251705 0
USER c:\intersystems\irishealth3\mgr\user\ 無制限 31MB システムデフォル ト 8.5MB 27.41 245.81GB マウント/RW 31 8.5 2517050
如果你想指定你要参考的数据库目录,请执行以下操作。
// 使用$LISTBUILD()函数准备好要引用的数据库目录的完整路径。
set dbdir=$LISTBUILD("c:\intersystems\irishealth3\mgr","c:\intersystems\irishealth3\mgr\user")
set rset=stmt.%Execute(dbdir)
do rset.%Display()
如果你只想获得指定数据库目录的数据库名称(DatabaseName)、当前大小(Size)MB、可用自由空间(Available)MB、自由大小(Free)%、自由磁盘空间大小(DiskFreeSpace)GB,你可以执行以下流程(在VSCode或Studio中连接到%SYS命名空间时创建例程/类并编写代码)。
Class ZMyClass.Utils
{
ClassMethod GetDiskFreeSpace()
{
set dbdir=$LISTBUILD("c:\intersystems\irishealth3\mgr","c:\intersystems\irishealth3\mgr\user")
set stmt=##class(%SQL.Statement).%New()
set st=stmt.%PrepareClassQuery("SYS.Database","FreeSpace")
set rset=stmt.%Execute(dbdir)
while(rset.%Next()) {
write rset.%Get("DatabaseName")," - ",
rset.%Get("Size")," - ",rset.%Get("Available")," - ",
rset.%Get("Free"),"% - ",rset.%Get("DiskFreeSpace"),!
}
}
}
注意:如果你把用户定义的例程或类放在%SYS名称空间中,创建它们的名称以Z开头,这样用户定义的源代码就会在升级安装后保留下来。
下面是一个运行的例子。
USER>zn "%SYS"
%SYS>do ##class(ZMyClass.Utils).GetDiskFreeSpace()
IRISSYS - 159MB - 18MB - 11.32% - 245.81GB
USER - 31MB - 8.5MB - 27.41% - 245.81GB
%SYS>
问题
争取在天亮前起床 · 三月 15, 2024
日志总是出现如下“严重”级别报错,这个错误要紧吗?
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 的资料太少了,想买本书来学习都买不到。 这是级别2的错误,是后台写进程的一个告警。如果是发生在生产系统上,应该找技术支持WRC团队确定问题。社区里有不少Cache', IRIS文章,另外,最左边这个线上学习网站(Learning)有大量主题可选的免费课程,欢迎注册。
好的,非常感谢!
公告
Anastasia Dyubaylo · 一月 16
🚨 计划维护公告 🚨
由于计划中的维护,开发者社区网站可能会在2025年1月20日(星期一)期间出现短暂的停机现象。
对于由此可能带来的不便,我们深表歉意,并感谢您的理解。感谢您耐心等待,我们将努力提升我们的平台!
🚨 更新通知:2025年1月21日 – 维护已完成 🚨
开发者社区网站的计划维护已成功完成!尽管网站已恢复运行,但我们仍在进行额外测试,因此可能会偶尔出现一些问题。
对于给您带来的任何不便,我们深表歉意,并衷心感谢您的耐心等待。如果您发现任何异常情况,请随时告诉我们。
感谢您的理解和支持!
公告
Claire Zheng · 四月 7, 2022
4月12日,新一期“极客俱乐部”在线分享即将推出,InterSystems中国技术总监乔鹏将分享“InterSystems数据平台与三级等保”这一主题,聊聊数据平台如何保护信息安全,以及如何配置、管理数据平台,以满足三级等保要求。点击链接报名参会,或扫描下方二维码参会。