微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_no='LJCG001H' THEN dbo.ELTPNAME(a.fw_nu) ELSE d.fm_name END),e.fw_state_nm,f.fw_rmk_nm
if not exists(select name from syscolumns where name='tod_no' and id=object_id('iebo09d12')) alter table iebo09d12 add tod_no varchar(
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_nm,g.fa_name from LJSS007H a (nolock) Left join LJPA002H b (nolock) On a.pa_no =b.pa_no Left jo
要在 SQL Server 2019 中设置定时自动重启,可以使用 Windows 任务计划程序。下面是详细的步骤: 步骤一:创建批处理文件 打开记事本。 输入以下内容: net stop "SQL Server (MSSQLSERVER)" net start "SQ
您收到的错误消息表明数据库 'EastRiver' 的事务日志已满,导致数据库操作失败。要解决这个问题,可以按照以下步骤操作: 1. 备份事务日志首先,备份事务日志以释放空间: BACKUP LOG [EastRiver] TO DISK = N'C:\Backup\East
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标识ID,若不知道怎么查询数据库的标识ID, 打开SQL Server management studio,点击工具。选择SQL Server Profiler。 登录,登录成功后,如果有个默认弹窗,先取消 新建追踪 命名
--最新的解决方法 --先创建用户帐户,不进行授权,然后通过下面的SQL语句将该用户帐户关联至对应的数据库用户。优点是避免了重新授权的操作。 USE tempdbEXEC sp_change_users_login 'Update_One', 'iemis', &#3
命令: ALTER TABLE 表名 add 列名 数据类型 default 默认值 not null 例如: ALTER TABLE LJEL005H add el_req int default 15 not null
declare @i int set @i=340 while @i<415 begin set @i=@iʱ insert into LJWK007H select '2024','28','9110','3PTSD621000000