【问题标题】:Entity Framework Issue When running Stored Procedures运行存储过程时的实体框架问题
【发布时间】:2015-05-07 06:19:07
【问题描述】:

我对存储过程和实体框架有疑问。

让我解释一下正在发生的事情......以及到目前为止我所做的尝试。

我有一个存储过程,它不会做很多事情

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 秒。

现在,我将其导入实体框架,它超时,我将命令超时设置为 120...

好的,到目前为止我已经尝试过什么以及我已经测试过什么。

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

我更改了我的存储过程以包含“重新编译”选项,还尝试了SET ARITHABORT 方式,不走运,通过 EF 运行时超时。

这是 EF 中的错误吗?

我现在刚刚决定使用“老派”数据访问来重写它。

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

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

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

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

【问题讨论】:

  • 你可以尝试更简单的查询,没有任何 where cluase,比如选择 TOP 1,看看你是否得到结果
  • 你能发布你用来执行这个查询的代码吗?另外,尝试使用 sql server profiler 来查看幕后发生的事情。也许您在 EF 案例中为参数传递了错误的值?
  • 好吧,我运行了分析器,EF 正在杀死数据库服务器。 CPU 30123读取 1364453 什么鬼,这被更改为不使用带参数的 where 子句,只选择前 10 个
  • 你能发布你从 sql profiler 捕获的查询吗?
  • 嗨,好的,所以我创建了一个控制台应用程序,其中包含 edmx 文件,可以正常使用存储的 proc。当我引用一个带有 edmx 文件的程序集时,它就会死掉。我什至在另一个控制台应用程序中引用了有效的控制台应用程序......它死了。 exec [dbo].[spPartnerContacts] @startDate='2013-05-01 00:00:00',@endDate='2015-05-07 12:58:22',@companyPk=12

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


【解决方案1】:

这可能是Parameter Sniffing引起的

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

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

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

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

优化重新编译

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

【讨论】:

  • 我认为可能是参数嗅探或过时的统计数据。
猜你喜欢
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
相关资源
最近更新 更多