我遇到存储过程和实体框架的问题。
让我解释一下发生了什么......以及到目前为止我尝试过的事情。
我有一个存储过程,但没有那么多
SELECT
COUNT(DISTINCT(EmailAddress)) AcceptedQuotes,
CONVERT (DATE,QuoteDate) QuoteDate
FROM
Quote Q
JOIN
Person P on Q.PersonPk = P.Pk
JOIN
Product Pr on Q.ProductPk = Pr.Pk
JOIN
Accepted A on Q.Pk = A.QuotePk
WHERE
QuoteDate between @startDate and @endDate
AND CompanyPk = @companyPk
AND FirstName != 'Test'
AND FirstName != 'test'
AND FirstName != 'EOH'
我想执行此操作,它在SSMS中工作正常,甚至不需要1秒钟。
现在,我将其导入Entity Framework,它超时并将命令timeout设置为120 ...
好的,我到目前为止所尝试过的以及我测试的内容。
如果我使用SqlCommand
,SqlDataAdapter
,DataTable
方式,使用我自己的连接字符串,它会按预期执行。当我在这种情况下使用Entity Framework连接字符串时,它会超时。
我修改了我的存储过程以包含“重新编译”选项,并且还尝试了SET ARITHABORT
方式,没有运气,它在通过EF运行时超时。
这是EF中的错误吗?
我现在只是决定使用“旧学校”数据访问来重写它。
另请注意,EF对来自同一数据库的其他存储过程执行正常。
非常感谢任何想法或帮助......
PS。我找到了这篇文章,但也没有帮助:(
答案 0 :(得分:1)
这可能是由Parameter Sniffing
引起的编译或重新编译存储过程时,为该调用传递的参数值是" sniffed"并用于基数估算。实际效果是计划得到优化,就像在查询中将这些特定参数值用作文字一样。
- 使用未直接显示在参数上的虚拟变量也可确保执行计划的稳定性,而无需添加重新编译 提示,例如:
醇>创建程序dbo.SearchProducts @Keyword varchar(100)As声明@Keyworddummy为varchar(100)设置@Keyworddummy = @Keyword select * from Products where Keyword like @Keyworddummy
- 要防止此情况和其他类似情况,您可以使用以下查询选项:
醇>优化重建
- 在批处理期间禁用自动更新统计信息
醇>