使用链接服务器在异构数据库中查询数据

2022-06-16 13:50:25 浏览数 (1)

SQL Server提供了链接服务器用于分布式查询异构数据库。通过链接服务器可以链接到Oracle、Sybase、DB2、SQL Server等大型关系数据库,也可以连接到Access、Excel等文件数据库,甚至可以连接到目录服务(AD)、索引服务等。要链接到一种数据库需要使用相应的接口。微软为很多数据库提供了驱动接口,所以可以直接使用,但是对于没有提供驱动的数据库比如Sybase,则需要在服务器上安装对应数据库厂商提供的驱动。

使用SSMS或者使用T-SQL语句配置成功链接服务器后便可通过:

[服务器名].[数据库名].[架构名].[对象名]

的形式来访问数据库。例如要访问Oracle数据库中的一个表,则对应的查询语句是:

代码语言:javascript复制
SELECT *
FROM ORA..MARY.ORDERS
WHERE ORDERCODE='20080808008'

其中ORA是链接服务器名,MARY是用户架构名,ORDERS是表或视图名。运行查询SQL Server将返回查询的结果。

但是当Oracle中的这个表数据量较大,比如有几十万行或者几百万行时,这个查询将会耗费很长时间。在SQL Server中运行该脚本可能要等上10秒、20秒或者1分钟、5分钟才可能查询出结果。但是如果将脚本在Oracle服务器上直接运行,则1秒钟不到就查询出结果了。造成这种情况的是SQL Server查询链接服务器的机制。

不同的数据库对应的SQL语言是有所不同的。而对于Oracle数据库,通过链接服务器查询数据时,SQL Server为了保证T-SQL语句能够正常使用,但是Oracle数据库可能不认识这些T-SQL语句,所以SQL Server将会把查询中所用到的Oracle表数据从Oracle数据库读出来,一直到满足查询条件为止。对于代码16.18中的查询,SQL Server会将Oracle数据库中的ORDERS表全部读取到SQL Server数据库中,一边读取一边查找ORDERCODE = '20080808008'的数据,直到全部数据读取完为止。对于上十万百万级的数据表来说,全部读取数据当然会造成系统缓慢。如果将上面的查询修改为如下的方式,则可能速度会快上很多。

代码语言:javascript复制
SELECT TOP 1 *
FROM ORA..MARY.ORDERS
WHERE ORDERCODE='20080808008'

这是因为SQL Server从Oracle中顺序的读取ORDERS 表,一边读取一边比较ORDERCODE='20080808008'一旦查找到了结果,由于我们写了TOP 1,所以系统判断满足条件了,就将结果返回,而不需要再继续向Oracle读取剩下的数据。但是这样做按照概率来说也要查一半的数据才能找到结果,仍然很慢。

SQL Server为了解决这个问题,提供了OPENQUERY函数用于将查询语句直接送到链接服务器中,由链接服务器的数据库引擎负责查询,而不是由SQL Server将全部数据读取到本地来查询。OPENQUERY函数的语法格式为:

OPENQUERY ( linked_server ,'query' )

其中linked_server表示链接服务器名称的标识符。'query'在链接服务器中执行的查询字符串。该字符串的最大长度为8KB。于是上面的查询我们可以改写为如下的形式:

代码语言:javascript复制
SELECT *
FROM OPENQUERY(ORA,
'SELECT * FROM MARY.ORDERS WHERE ORDERCODE=''20080808008''')

这样条件查询将会在Oracle数据库中运行,Oracle将查询的结果返回给SQL Server,然后SQL Server再将结果返回给用户。

0 人点赞