sql – 远程查询使用变量vs文字时缓慢

搜索到处于这种情况,无法找到解决方案,除了我不想使用的动态sql.

以下是我要在服务器2上UPDATE的表:

(Stuff Id UNIQUEIDENTIFIER,stuffname NVARCHAR(64))

我需要从服务器1更新它.

所以我一直在试图:

DECLARE @newstuff nvarchar(64)

SELECT @newstuff = 'new stuff'

UPDATE [server2].database2.dbo.Stuff
SET stuffname=@newstuff
WHERE stuffId='4893CD93-08B3-4981-851B-5DC972288290'

这需要11秒.下一个使用文字运行不到1秒

UPDATE [server2].database2.dbo.Stuff
SET stuffname='new stuff'
WHERE stuffId='4893CD93-08B3-4981-851B-5DC972288290'

我已经比较了实际的执行计划.慢的是做远程扫描,花费100%的成本,加上其他5个步骤(过滤器,表假脱机,计算标量,远程更新,更新).快速的只是UPDATE和远程查询步骤.我需要使用变量,所以我需要一种方法来强制它远程执行整个查询.

我已经尝试使用OPTION(RECOMPILE),但是server1正在使用sql Server 2005. server2正在使用sql Server 2012.我无法在server2上更改数据库结构,而没有严重的问题.我没有任何认证问题.我已经尝试在更新表时进行别名.

我也试过使用Openquery.当我将id过滤器放在查询字符串中时,它会恢复到1秒以下:

UPDATE OPENQUERY([server2],'select stuffname,stuffid from database2.dbo.stufftable where contactid=''4CA1D489-9221-E511-A441-005056C00008''')
SET stuffname = @newstuff

但是我需要这个id也是一个变量,而且这个打开的查询不会带有变量(https://msdn.microsoft.com/en-CA/library/ms188427.aspx).我尝试在查询之外运行带有id过滤器的Openquery,但是在4秒钟内运行.比11好,但不是很好:

UPDATE OPENQUERY([server2],stuffid from database2.dbo.stufftable')
set stuffname=@newstuff
where contactid='4CA1D489-9221-E511-A441-005056C00008'

当然,我使用exec(@sql)运行openquery,但我真的不想这样做.我可以使用整数更新语句,甚至使用OPENQUERY,并获得相同的结果.

有没有办法让我在不使用exec(@sql)的情况下修复这个性能

解决方法

您可以在远程端使用sp_executesql使用具有参数的动态sql.
declare @sql nvarchar(max);

set @sql = 'UPDATE database2.dbo.Stuff
            SET stuffname=@newstuff
            WHERE stuffId=''4893CD93-08B3-4981-851B-5DC972288290'''

exec [server2].master.dbo.sp_executesql @sql,N'@newstuff nvarchar(64)',@newstuff

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...