【发布时间】:2017-03-09 16:35:45
【问题描述】:
我昨天正在跟进我的问题,Entity Framework 6 get complext return value from a stored procedure。我的存储过程现在在实体框架下运行。但是,3分钟后超时,连接超时。
我在我的 SQL Server Management Studio 中使用以下行运行存储过程(客户信息省略):
EXEC spGetDupWOs @ProjectName=N'...', @City=N'...', @State=N'LA', @ProposalNum=N'201703080740-001', @County=N'...', @Owner=N'...', @QuoteRecipients=N'...', @ProjectID=-1
它在不到一秒的时间内执行。当实体框架执行它时,它需要永远。
使用 SQL Server Profiler,我确定实体框架正在将此行发送到 SQL 服务器:
exec sp_executesql N'EXEC spGetDupWOs',N'@ProjectName nvarchar(19),@City nvarchar(6),@State nvarchar(2),@ProjectNum nvarchar(12),@County nvarchar(10),@Owner nvarchar(23),@QuoteRecipients nvarchar(23),@ProjectID bigint',@ProjectName=N'...',@City=N'Holden',@State=N'LA',@ProposalNum=N'201703080740-001',@County=N'Livingston',@Owner=N'...',@BID_RECIP=N'...',@ProjectID=-1
当我在 SSMS 中运行它时,它需要很长时间才能运行。
阅读类似的问题,问题似乎是参数嗅探和执行计划的变化。
这是我在应用程序中执行存储过程的调用:
List<DuplicateProposals> duplicateCheckResults =
db.Database.SqlQuery<DuplicateProposals>("spGetDupWOs",
spl.ToArray())
.ToList();
在网上看了一堆文章后,我更加困惑了。如何更改我的呼叫来解决此问题?
【问题讨论】:
-
您是否尝试过修复参数嗅探场景?
-
就是这样。我被我读到的东西弄糊涂了,我不知道怎么读。我需要更改我的存储过程或我的应用程序调用吗?
-
更改 SP。例如:
CREATE PROC Thing(@param1 INT) AS DECLARE @internal_param1 INT = @param1; SELECT * FROM Table WHERE Column = @internal_param1 -
@DavidG:虽然这可以解决参数嗅探,但与
OPTION (OPTIMIZE FOR ...)或OPTION (RECOMPILE)在个别麻烦的语句上相比,这是一种不直观的方法。不需要在本地复制参数。 -
@JeroenMostert 我不推荐其中任何一个作为参数嗅探的解决方案。
标签: c# sql-server entity-framework stored-procedures