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秒?
请问是什么原因?如何解决?
MY001
字段有没有建索引
有建索引,直接写 文字很快,写变量就很慢
@水龙: 建议试试在 linked sql server 上创建对应的存储过程,然后调用存储过程完成更新
参考:Performance Issues when Updating Data with a SQL Server Linked Server
@dudu: 这样可以解决问题。链接服务器执行会全表查询。
分别查看两个SQL的查询计划,对比查询计划的不同处,可以找到原因的(索引、数据类型转换、锁等都可能造成性能差距)
MY023 的数据类型是nvarchar(50) 吗? 把 @LeaveType 的数据类型 改成MY023 的数据类型 看看。
MY023 是 varchar类型,@LeaveType改成 varchar类型,还是一样的
@水龙: 在 [YX-DB-01].[MIS] 上创建一个存储过程, 然后 通过 这个存储过程执行
update [dbo].[WMISMY] set MY023=@LeaveType where MY001=365354
这个sql 看看
使用变量会触发 参数嗅探 (Parameter Sniffing)
可能会生成低效的执行计划
参考:https://www.cnblogs.com/woodytu/p/4551004.html
CREATE NONCLUSTERED INDEX idx_WMISMY_MY002 ON WMISMY(MY002) INCLUDE(MY001)
索引建了,也重编译了。还是不行。
本机执行参数更新不会。链接服务器执行更新就是会全表查找。
杨力闻已回答。