运行存储过程时的实体框架问题

时间:2015-05-07 06:19:08

标签: c# sql-server entity-framework stored-procedures

我遇到存储过程和实体框架的问题。

让我解释一下发生了什么......以及到目前为止我尝试过的事情。

我有一个存储过程,但没有那么多

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 ...

好的,我到目前为止所尝试过的以及我测试的内容。

如果我使用SqlCommandSqlDataAdapterDataTable方式,使用我自己的连接字符串,它会按预期执行。当我在这种情况下使用Entity Framework连接字符串时,它会超时。

我修改了我的存储过程以包含“重新编译”选项,并且还尝试了SET ARITHABORT方式,没有运气,它在通过EF运行时超时。

这是EF中的错误吗?

我现在只是决定使用“旧学校”数据访问来重写它。

另请注意,EF对来自同一数据库的其他存储过程执行正常。

非常感谢任何想法或帮助......

PS。我找到了这篇文章,但也没有帮助:(

http://www.sommarskog.se/query-plan-mysteries.html

1 个答案:

答案 0 :(得分:1)

这可能是由Parameter Sniffing

引起的

编译或重新编译存储过程时,为该调用传递的参数值是" sniffed"并用于基数估算。实际效果是计划得到优化,就像在查询中将这些特定参数值用作文字一样。

  
      
  1. 使用未直接显示在参数上的虚拟变量也可确保执行计划的稳定性,而无需添加重新编译   提示,例如:
  2.         

    创建程序dbo.SearchProducts       @Keyword varchar(100)As声明@Keyworddummy为varchar(100)设置@Keyworddummy = @Keyword select * from Products where Keyword like   @Keyworddummy

         
        
    1. 要防止此情况和其他类似情况,您可以使用以下查询选项:
    2.         

      优化重建

           
          
      1. 在批处理期间禁用自动更新统计信息
      2.