文章
Jingwei Wang · 七月 14 阅读大约需 6 分钟

精华文章 InterSystems SQL 的使用 - 第一部分 - 架构及特性介绍

 


InterSystems SQL为存储在IRIS数据库中的数据提供不折不扣的、标准的关系型访问。

InterSystems SQL具有以下优点。

高性能和可扩展性 - InterSystems SQL的性能和可扩展性优于其他关系型数据库产品。

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

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

支持标准SQL查询 - InterSystems SQL支持SQL-92标准语法和命令。

你可以将InterSystems SQL用于许多目的,包括。

基于对象和Web应用程序 - 你可以在InterSystems Object和Caché Server Page应用程序中使用SQL查询,以执行强大的数据库操作,如查询和搜索。

在线事务处理 - InterSystems SQL为插入和更新操作以及通常在事务处理应用程序中发现的查询类型提供出色的性能。

BI和数据仓库 - IRIS多维数据库引擎和位图索引技术的结合使其成为数据仓库式应用的绝佳选择。

点对点查询和报告 - 你可以使用InterSystems SQL包含的全功能ODBC和JDBC驱动来连接到流行的报告和查询工具。

企业应用集成 - InterSystems SQL网关使你能以SQL方式无缝访问存储在符合ODBC或JDBC标准的外部关系型数据库中的数据。这使得在IRIS应用程序中整合各种来源的数据变得很容易。

架构

IRIS SQL的核心由以下部分组成。

统一数据字典 - 所有元信息的存储库,以一系列的类定义的形式存储。自动为每个存储在统一字典中的持久类创建关系访问(表)。

SQL处理器和优化器 - 是一套解析和分析SQL查询的程序,为给定的查询确定最佳搜索策略,并生成执行查询的代码。

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

 

特性

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

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

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

执行事务的能力,包括INSERT、UPDATE和DELETE操作。当执行并发操作时,InterSystems SQL使用行级锁。

能够定义和使用索引以提高查询效率。

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

能够定义用户和角色并给他们分配权限。

能够定义外键和其他完整性约束。

能够定义INSERT, UPDATE, 和DELETE触发器。

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

能够以不同的格式返回数据。ODBC模式用于客户端访问;显示模式用于基于服务器的应用程序(如CSP页面)。

 

SQL-92标准

InterSystems SQL支持完整的入门级SQL-92标准,但有以下例外:

不支持在表定义中添加额外的CHECK约束。

不支持SERIALIZABLE隔离级别。

分隔标识符不区分大小写;标准规定它们应该区分大小写,例如create table "user info" (id number); 和 create table "USER INFO" (id number); 在InterSystems SQL中不区分大小写。

在包含HAVING子句的子查询中,人们应该能够引用HAVING子句中 "可用 "的min(),max(),avg()。这不被支持。即 aggregate函数无法在 WHERE 或 GROUP BY 子句中使用。例如Select DeptID , Avg(Salary) From Employee GROUP BY DeptID, Avg(Salary) HAVING Avg(Salary) > 1000, 但是可以使用Select DeptID , Avg(Salary) From Employee GROUP BY DeptID HAVING Avg(Salary) > 1000

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。

 

扩展功能

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

其中一些扩展包括:

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

用于跟踪对象引用的特殊语法。

支持子类化和继承。

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

控制用于表的存储结构的一些机制,以实现最大的性能。

 

支持ODBC,JDBC

使用JDBC驱动和ODBC驱动

 

嵌入式SQL

在ObjectScript中,InterSystems SQL支持嵌入式SQL:在方法(或其他代码)的内部放置SQL语句的能力。

使用嵌入式SQL,你可以查询一条记录,或者定义一个游标并使用它来查询多条记录。

嵌入式SQL是被编译的;它可以与ObjectScript例程同时被编译(默认),或者你可以将嵌入式SQL的编译推迟到运行时。

当与IRIS的对象访问能力结合使用时,嵌入式SQL是相当强大的。例如,下面的方法可以找到具有给定Name值的记录的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
 
}

 

 

Dynamic SQL

作为标准库的一部分,InterSystems IRIS提供了一个%SQL.Statement类,你可以用它来执行动态(即在运行时定义)的SQL语句。你可以在ObjectScript方法中使用动态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"
}

当你prepare一个查询时,该查询的优化版本被存储为一个缓存的查询。这个缓存的查询在随后的查询调用中被执行,避免了每次执行查询时重新优化的开销。

 

限制

注意InterSystems SQL的以下限制:

NLS可以用来指定$ORDER的行为,用于特定的国家地区语言行为的Global,以及当前运行进程中的本地变量。InterSystems SQL可以在任何国家语言区划内使用,并且运行良好。然而,目前InterSystems SQL的一个限制是,对于任何特定的进程,它所引用的所有相关的globals都必须使用与当前进程locale相同的国家locale。

0
0 45
讨论 (0)1
登录或注册以继续