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