在我的SQL 2005服务器上,我有一个通过OraOLEDB.Oracle提供程序连接到Oracle的链接服务器。
如果我通过4部分标识符运行查询,如下所示:
SELECT * FROM [SERVER]...[TABLE] WHERE COLUMN = 12345
完成需要一分多钟。如果我像这样运行相同的查询:
SELECT * FROM OPENQUERY(SERVER, 'SELECT * FROM TABLE WHERE COLUMN = 12345')
立即完成。是否有一个设置我在某个地方错过了让第一个查询在相当长的一段时间内运行?还是我坚持使用openquery?
答案 0 :(得分:11)
在第一个使用“点”表示法的示例中,使用了客户端游标引擎,并且大多数事情都在本地进行评估。如果您从大型表中选择并使用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)