我搜索到处于这种情况,无法找到解决方案,除了我不想使用的动态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,并获得相同的结果.