首页 新闻 会员 周边 捐助

SQL server 链接update 很慢

0
悬赏园豆:10 [已解决问题] 解决于 2025-07-16 13:58

update [YX-DB-01].[MIS].[dbo].[WMISMY] set MY023='病假' where MY001=365354
select * from [YX-DB-01].[MIS].[dbo].[WMISMY] where MY001=365354

以上两句秒执行

declare @LeaveType nvarchar(50)
SET @LeaveType='病假'
update [YX-DB-01].[MIS].[dbo].[WMISMY] set MY023=@LeaveType where MY001=365354

这个语句要执行25秒?

请问是什么原因?如何解决?

水龙的主页 水龙 | 初学一级 | 园豆:193
提问于:2025-07-07 15:52
< >
分享
最佳答案
0

MY001 字段有没有建索引

收获园豆:7
dudu | 高人七级 |园豆:24907 | 2025-07-07 16:27

有建索引,直接写 文字很快,写变量就很慢

水龙 | 园豆:193 (初学一级) | 2025-07-08 11:30

@水龙: 建议试试在 linked sql server 上创建对应的存储过程,然后调用存储过程完成更新
参考:Performance Issues when Updating Data with a SQL Server Linked Server

dudu | 园豆:24907 (高人七级) | 2025-07-08 12:28

@dudu: 这样可以解决问题。链接服务器执行会全表查询。

水龙 | 园豆:193 (初学一级) | 2025-07-16 13:56
其他回答(4)
1

分别查看两个SQL的查询计划,对比查询计划的不同处,可以找到原因的(索引、数据类型转换、锁等都可能造成性能差距)

Tonhuan-Cloud | 园豆:244 (菜鸟二级) | 2025-07-07 16:14
0

MY023 的数据类型是nvarchar(50) 吗? 把 @LeaveType 的数据类型 改成MY023 的数据类型 看看。

Tom.汤 | 园豆:3073 (老鸟四级) | 2025-07-08 10:13

MY023 是 varchar类型,@LeaveType改成 varchar类型,还是一样的

支持(0) 反对(0) 水龙 | 园豆:193 (初学一级) | 2025-07-08 11:32

@水龙: 在 [YX-DB-01].[MIS] 上创建一个存储过程, 然后 通过 这个存储过程执行
update [dbo].[WMISMY] set MY023=@LeaveType where MY001=365354

这个sql 看看

支持(0) 反对(0) Tom.汤 | 园豆:3073 (老鸟四级) | 2025-07-08 15:12
0

使用变量会触发 参数嗅探 (Parameter Sniffing)
可能会生成低效的执行计划

 参考:https://www.cnblogs.com/woodytu/p/4551004.html

 

 
 
收获园豆:3
talentzemin | 园豆:860 (小虾三级) | 2025-07-09 10:20

CREATE NONCLUSTERED INDEX idx_WMISMY_MY002 ON WMISMY(MY002) INCLUDE(MY001)

索引建了,也重编译了。还是不行。

本机执行参数更新不会。链接服务器执行更新就是会全表查找。

支持(0) 反对(0) 水龙 | 园豆:193 (初学一级) | 2025-07-16 11:21
0

杨力闻已回答。

爱的旅途 | 园豆:223 (菜鸟二级) | 2025-07-09 15:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册