SQL 2005 - 链接服务器到 Oracle 查询极慢

Posted

技术标签:

【中文标题】SQL 2005 - 链接服务器到 Oracle 查询极慢【英文标题】:SQL 2005 - Linked Server to Oracle Queries Extremely Slow 【发布时间】:2010-08-26 16:14:47 【问题描述】:

在我的 SQL 2005 服务器上,我有一个通过 OraOLEDB.Oracle 提供程序连接到 Oracle 的链接服务器。

如果我像这样通过 4 部分标识符运行查询:

SELECT * FROM [SERVER]...[TABLE] WHERE COLUMN = 12345

完成需要一分钟多的时间。如果我像这样运行相同的查询:

SELECT * FROM OPENQUERY(SERVER, 'SELECT * FROM TABLE WHERE COLUMN = 12345')

它立即完成。是否有我在某处遗漏的设置来让第一个查询在适当的时间段内运行?还是我使用 openquery 卡住了?

【问题讨论】:

【参考方案1】:

在您使用“点”表示法的第一个示例中,使用了客户端游标引擎,并且大多数内容都是在本地评估的。如果您从大表中选择并使用 WHERE 子句,则记录将从远程数据库本地提取。一旦数据通过链接服务器被拉出,只有这样 WHERE 子句才会在本地应用。通常,此序列会影响性能。远程数据库上的索引基本上变得无用。

或者,当您使用 OPENQUERY 时,SQL Server 会将 sql 语句发送到目标数据库进行处理。在处理过程中,表上的任何索引都会被利用。此外,在将结果集发送回 SQL Server 之前,在 Oracle 端应用 where 子句。

根据我的经验,除了最简单的查询之外,OPENQUERY 将为您提供更好的性能。

出于上述原因,我建议对所有事情都使用 OpenQuery。

您在使用 OpenQuery 时可能已经遇到的痛点之一是单引号。如果发送到远程数据库的 sql 字符串需要在字符串或日期周围加上单引号,则需要对其进行转义。否则他们会无意中终止 sql 字符串。

这是我在处理链接服务器的 openquery 语句中的变量以处理单引号问题时使用的模板:

DECLARE @UniqueId int 
, @sql varchar(500) 
, @linkedserver varchar(30) 
, @statement varchar(600) 

SET @UniqueId = 2 

SET @linkedserver = 'LINKSERV' 
SET @sql = 'SELECT DummyFunction(''''' + CAST(@UniqueId AS VARCHAR(10))+ ''''') FROM DUAL' 
SET @statement = 'SELECT * FROM OPENQUERY(' + @linkedserver + ', '  
SET @Statement = @Statement + '''' +  @SQL + ''')' 
EXEC(@Statement) 

【讨论】:

以上是关于SQL 2005 - 链接服务器到 Oracle 查询极慢的主要内容,如果未能解决你的问题,请参考以下文章

如何把 sqlserver 数据导入到oracle数据库里

Oracle与SQL Server如何实现表数据同步

如何将Oracle中的数据导入到SQL Server中来

SQL Server2005还原数据库之前,怎么断开所有的用户链接?

还原SQL Server 2005数据库后,将所有用户链接到登录

怎么将sql2005中的数据导入到oracle中,求具体步骤补助方法