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

Kob*_*bie 8 c# sql-server stored-procedures entity-framework

我有存储过程和实体框架的问题.

让我解释一下正在发生的事情......以及迄今为止我所尝试过的事情.

我有一个存储过程,它没有做太多

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'
Run Code Online (Sandbox Code Playgroud)

我想执行此操作,它在SSMS中工作正常,甚至不需要1秒钟.

现在,我将其导入Entity Framework,它超时并将命令超时设置为120 ...

那么我到目前为止所尝试的以及我测试的内容.

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

我改变了我的存储过程以包含"重新编译"选项并尝试了SET ARITHABORT方法,没有运气,它在通过EF运行时超时.

这是EF中的一个错误吗?

我现在刚刚决定使用"旧学校"数据访问来重写它.

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

任何想法或帮助将不胜感激......

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

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

Hus*_*lil 1

这可能是由参数嗅探引起的

当编译或重新编译存储过程时,为该调用传递的参数值将被“嗅探”并用于基数估计。最终效果是计划得到优化,就好像这些特定参数值被用作查询中的文字一样。

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

创建过程 dbo.SearchProducts @Keyword varchar(100) As Declare @Keyworddummy as varchar(100) Set @Keyworddummy = @Keyword select * from Products where Keyword like @Keyworddummy

  1. 为了防止这种情况和其他类似情况,您可以使用以下查询选项:

优化重新编译

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

  • 我认为这可能是参数嗅探或过时的统计数据。 (3认同)