第1章丨IRIS SQL —— 简介

写在前面

InterSystems IRIS 提供高性能、功能齐全的 SQL。您可以将 SQL 与 InterSystems IRIS 结合使用,其规模从在单个 CPU 内核上运行的查询,到使用数十个内核的并行查询,再到跨 InterSystems IRIS 服务器集群的分布式查询。

InterSystems IRIS 中各种规模的 SQL 功能包括:

  • Joins
  • 灵活、高性能的索引
  • 聚合函数和分组
  • 用 SQL 或 InterSystems ObjectScript 编写的存储过程(下面称为“ObjectScript”)
  • JDBC 和 ODBC 连接
  • 自动并行查询执行
  • 透明分布的查询

InterSystems SQL 提供了强大的工具来实现最佳的 SQL 查询性能。其中一个工具是压缩位图索引:使用紧凑,高效的结构和矢量化的CPU指令,InterSystems SQL可以执行聚合并检查每秒数十亿行的逻辑条件,只需一个内核。

InterSystems SQL 提供了一整套标准关系功能,包括定义表架构、执行查询以及定义和执行存储过程的功能。

  1. 可以从管理门户以交互方式执行 InterSystems SQL,也可以通过使用 SQL shell 接口以编程方式执行 InterSystems SQL。
  2. 嵌入式 SQL 使您能够在 ObjectScript 代码中嵌入 SQL 语句,
  3. Dynamic SQL 使您能够在运行时从 ObjectScript 执行动态 SQL 语句。

1. 优点

InterSystems SQL 为存储在 InterSystems IRIS® 数据平台数据库中的数据提供不折不扣的标准关系访问

InterSystems SQL具有以下优点:

  • 高性能和可扩展性 — InterSystems SQL 提供的性能和可扩展性优于其他关系数据库产品。此外,InterSystems SQL在各种硬件和操作系统上运行;从笔记本电脑到高端多CPU系统。

  • 与 InterSystems IRIS 对象技术集成 — InterSystems SQL 与 InterSystems IRIS 对象技术紧密集成。您可以混合使用关系访问和对象访问数据,而不会牺牲任何一种方法的性能。

  • 低维护 — 与其他关系数据库不同,InterSystems IRIS 应用程序不需要在已部署的应用程序中重建索引和表压缩。

  • 支持标准 SQL 查询 — InterSystems SQL 支持 SQL-92 标准语法和命令。在大多数情况下,您可以将现有的关系应用程序迁移到 InterSystems IRIS,而这并不困难,并自动利用 InterSystems IRIS 的更高性能和对象功能。


您可以将 InterSystems SQL 用于多种用途,包括:

  • 基于对象和 Web 的应用程序 — 您可以在 InterSystems IRIS 对象和 Web Server 页面应用程序中使用 SQL 查询来执行强大的数据库操作,如查找和搜索。

  • 联机事务处理 — InterSystems SQL 为插入和更新操作以及事务处理应用程序中常见的查询类型提供了出色的性能。

  • 商业智能和数据仓库 — InterSystems IRIS 多维数据库引擎和位图索引技术的结合使其成为数据仓库式应用程序的绝佳选择。

  • 即席查询和报告 — 您可以使用 InterSystems SQL 附带的全功能 ODBC 和 JDBC 驱动程序连接到常用的报告和查询工具。

  • 企业应用程序集成 — InterSystems SQL 网关可让您对存储在符合 ODBC 或 JDBC 标准的外部关系数据库中的数据进行无缝的 SQL 访问。这使得在InterSystems IRIS应用程序中集成来自各种来源的数据变得容易。

2. 构成

InterSystems SQL的核心由以下组件组成:

  • 统一数据字典 — 存储为一系列类定义的所有元信息的存储库。InterSystems IRIS 自动为统一字典中存储的每个持久性类创建关系访问(表)。

  • SQL 处理器和优化器 — 一组程序,用于分析 SQL 查询,确定给定查询的最佳搜索策略(使用基于开销的复杂优化器),并生成执行查询的代码。

  • InterSystems SQL Server — 一组 InterSystems IRIS 服务器进程,负责与 InterSystems ODBC 和 JDBC 驱动程序的所有通信。它还管理常用查询的缓存;当多次执行同一查询时,可以从查询缓存中检索其执行计划,而不必再次由优化程序处理。

3. 特征

InterSystems SQL包括一整套标准的关系功能。这些包括:

  • 定义表和视图(DDL 或数据定义语言)的能力。

  • 对表和视图执行查询的功能(DML 或数据操作语言)。

  • 执行事务的能力,包括插入、更新和删除操作。执行并发操作时,系统间 SQL 使用行级锁。

  • 能够定义和使用索引以实现更高效的查询。

  • 能够使用各种数据类型,包括用户定义的类型。

  • 定义用户和角色并为其分配权限的能力。

  • 定义外键和其他完整性约束的能力。

  • 定义插入、更新和删除触发器的功能。

  • 定义和执行存储过程的能力。

  • 以不同格式返回数据的能力:用于客户端访问的ODBC模式;在基于服务器的应用程序中使用的显示模式。

4. 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 约束。

  • 不支持可序列化隔离级别。

  • 分隔标识符不区分大小写;标准规定它们应该区分大小写。

  • 在 HAVING 子句中包含的子查询中,应该能够引用该 HAVING 子句中“可用”的聚合。这不受支持。

5. 扩展

InterSystems SQL支持许多有用的扩展。其中许多与InterSystems IRIS提供对数据的同时对象和关系访问这一事实有关。

其中一些扩展包括:

  • 支持用户可定义的数据类型和函数。

  • 用于以下对象引用的特殊语法。

  • 支持子类化和继承。

  • 支持对存储在其他数据库中的外部表进行查询。

  • 用于控制用于表的存储结构以实现最佳性能的多种机制。

6. 互操作性

InterSystems SQL支持多种与其他应用程序和软件工具进行关系互操作的方法。

6.1 JDBC

InterSystems IRIS 包括一个符合标准的 4 级(全纯 Java 代码)JDBC 客户端。

InterSystems JDBC 驱动程序提供以下功能:

  • 高性能
  • 纯 Java 实现
  • Unicode 支持
  • 线程安全

您可以将 InterSystems JDBC 与支持 JDBC 的任何工具、应用程序或开发环境一起使用。

6.2 ODBC

InterSystems SQL 的 C 语言调用级接口是 ODBC。与其他数据库产品不同,InterSystems ODBC 驱动程序是一个本机驱动程序 — 它不是建立在任何其他专有接口之上的。

系统间 ODBC 驱动程序提供以下功能:

  • 高性能

  • 可移植性

  • 原生 Unicode 支持

  • 线程安全

您可以将 InterSystems ODBC 与支持 ODBC 的任何工具、应用程序或开发环境一起使用.

6.3 嵌入式 SQL

ObjectScript 中,InterSystems SQL 支持 Embedded SQL:将 SQL 语句放在方法(或其他代码)的正文中的能力。

  • 使用嵌入式 SQL,您可以查询单个记录,也可以定义游标并使用它来查询多个记录。
  • 编译嵌入式 SQL。默认情况下,它是在首次执行时(运行时)编译的,而不是在编译包含它的routines时编译的。因此,在运行时检查 SQLCODE 错误非常重要。还可以在编译嵌入式 SQL 的同时编译包含它的 ObjectScript routine

嵌入式 SQL 在与 InterSystems IRIS 的对象访问功能结合使用时,功能非常强大。例如,以下方法查找具有给定名称值的记录的 RowID:

ClassMethod FindByName(fullname As %String)
 {
    &sql(SELECT %ID INTO :id FROM Sample.MyTable 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
 }

6.4 动态 SQL

作为其标准库的一部分,InterSystems IRIS 提供了一个 %SQL.Statement 可用于执行动态(即在运行时定义)SQL 语句的类。您可以在 ObjectScript 方法中使用 Dynamic SQL。例如,以下方法查询 21 世纪出生的指定人数。该查询选择 1999 年 12 月 31 日之后出生的所有人员,按出生日期对所选记录进行排序,然后选择前 x 条记录:

ClassMethod Born21stC(x) [ language=objectscript ]
{
  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"
 }

准备查询时,该查询的优化版本将存储为缓存查询。执行此缓存查询是为了后续调用查询,从而避免了每次执行查询时重新优化查询的开销。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值