以下查询(没有详细信息)以超时结束。所有列都具有nvarchar类型。所以它不是this。查询在没有sp_executesql的情况下完美运行。
exec sp_executesql N'declare @exp nvarchar(max) = ''%'' + @name + ''%''
select u.Id
from [local_db]..Users u
join [linked_server].[remote_db].dbo.Players p on p.PlayerId = u.PlayerId
join [linked_server].[remote_db].dbo.PlayerStats ps on ps.PlayerId = u.PlayerId
where @exp is null or u.Nickname like @exp or u.Name like @exp or p.Nickname like @exp
order by ps.Wins desc
offset @skip rows fetch next @take rows only',N'@skip int,@take int,@name nvarchar(8)',@skip=0,@take=24,@name=N'Foo'
我发现了一些有趣的细节。如果我删除or p.Nickname like @exp
,它就可以了。当我删除or u.Nickname like @exp or u.Name like @exp
时也是如此。但这只是一个想法。
下一个查询工作正常!
exec sp_executesql N'
declare @skip int = 0, @take int = 24, @name nvarchar(8) = N''Foo''
declare @exp nvarchar(max) = ''%'' + @name + ''%''
select u.Id
from [local_db]..Users u
join [linked_server].[remote_db].dbo.Players p on p.PlayerId = u.PlayerId
join [linked_server].[remote_db].dbo.PlayerStats ps on ps.PlayerId = u.PlayerId
where @exp is null or u.Nickname like @exp or u.Name like @exp or p.Nickname like @exp
order by ps.Wins desc
offset @skip rows fetch next @take rows only'
答案 0 :(得分:0)
使用sp_executesql查询并且没有它有不同的执行计划(为什么???)。在sp_executesql的情况下,profiler建议我在包含列(Id,Name,Nickname)的Users(PlayerId)上创建索引。它就像一个魅力!如果您遇到此问题,请尝试对您的查询进行分析。
答案 1 :(得分:0)
我有同样的问题。使用sp_executesql
的查询工作缓慢(大约一分钟),如果没有查询,则查询正常(即时结果)。
这两个执行计划是不同的。我所做的只是重新计算主表的统计信息,它就起作用了。
关于它为何变得与众不同,我没有任何线索。在我重新计算统计数据之前,统计数据似乎并未损坏或不平衡。