查询在SQL中运行不到一毫秒,但在实体框架中超时

时间:2012-07-05 12:37:11

标签: sql-server entity-framework

以下linq-to-entities查询抛出

  

实体框架超时已过期。超时时间过去之前   完成操作或服务器没有响应。

在ToList()之后

 var q = (from contact 
          in cDB.Contacts.Where(x => x.Templategroepen.Any(z => z.Autonummer == templategroep.Autonummer) 
                                && !x.Uitschrijvings.Any(t => t.Templategroep.Autonummer == templategroep.Autonummer)) 
          select contact.Taal).Distinct();

((System.Data.Objects.ObjectQuery)q).ToTraceString()给了我:

SELECT 
[Distinct1].[Taal] AS [Taal]
FROM ( SELECT DISTINCT 
[Extent1].[Taal] AS [Taal]
FROM [dbo].[ContactSet] AS [Extent1]
WHERE ( EXISTS (SELECT 
1 AS [C1]
FROM [dbo].[TemplategroepContact] AS [Extent2]
WHERE ([Extent1].[Autonummer] = [Extent2].[Contacts_Autonummer]) AND ([Extent2].[Templategroepen_Autonummer] = @p__linq__0)
)) AND ( NOT EXISTS (SELECT 
1 AS [C1]
FROM [dbo].[UitschrijvingenSet] AS [Extent3]
WHERE ([Extent1].[Autonummer] = [Extent3].[Contact_Autonummer]) AND ([Extent3].[Templategroep_Autonummer] = @p__linq__1)
))
)  AS [Distinct1]

来自tracestring的查询在sql management studio中以不到1秒的速度运行,但是在实际列出它时会超时吗?怎么可能再次出现?

* 更新:为查询* 添加了SQL PROFILER输出,其运行速度与EF ToList()(> 30秒)相同

exec sp_executesql N'SELECT 
[Distinct1].[Taal] AS [Taal]
FROM ( SELECT DISTINCT 
    [Extent1].[Taal] AS [Taal]
    FROM [dbo].[ContactSet] AS [Extent1]
    WHERE ( EXISTS (SELECT 
        1 AS [C1]
        FROM [dbo].[TemplategroepContact] AS [Extent2]
        WHERE ([Extent1].[Autonummer] = [Extent2].[Contacts_Autonummer]) AND ([Extent2].[Templategroepen_Autonummer] = @p__linq__0)
    )) AND ( NOT EXISTS (SELECT 
        1 AS [C1]
        FROM [dbo].[UitschrijvingenSet] AS [Extent3]
        WHERE ([Extent1].[Autonummer] = [Extent3].[Contact_Autonummer]) AND ([Extent3].[Templategroep_Autonummer] = @p__linq__1)
    ))
)  AS [Distinct1]',N'@p__linq__0 int,@p__linq__1 int',@p__linq__0=1,@p__linq__1=1

5 个答案:

答案 0 :(得分:5)

我在EF6中观察到了这个问题。

即使我的超时值达到60秒,

await _context.Database.SqlQuery<MyType>(sql)也会超时。但是,在SSMS中执行完全相同的SQL(使用的探查器来确认我传入的sql是未修改的)会在一秒内产生预期的结果。

exec sp_updatestats

为我解决了这个问题。

答案 1 :(得分:3)

我知道这有点晚了,但我找到了答案here

基本上,实体框架喜欢默认跟踪所有内容。如果您不需要它(即不插入或更新或删除实体),请将其关闭以加快查询速度。

如果你正在使用Entity Framework Code First,你可以这样做:

var q = (from contact
      in cDB.Contacts.AsNoTracking()
          .Where(x => x.Templategroepen.Any(z => z.Autonummer == templategroep.Autonummer) 
                            && !x.Uitschrijvings.Any(t => t.Templategroep.Autonummer == templategroep.Autonummer)) 
      select contact.Taal).Distinct();

答案 2 :(得分:2)

我和EF6有类似的问题。在EF中使用SqlQuery函数时,虽然在Management Studio中以毫秒为单位执行查询,但我得到了超时。我发现它是由于我在EF查询中使用的一个sql参数的值而发生的。为清楚起见,下面是我遇到的类似SQL查询。

SELECT * FROM TBL WHERE field1 > @p1 AND field2>@p2 AND field3<@p3

当@ p1为零时,我收到超时异常。当我把它变成1或者不同的东西时,它是以毫秒为单位执行的。顺便说一句,我查询的表有超过20M的行。

我希望它有所帮助, 最好

答案 3 :(得分:1)

(DBCC FREEPROCCACHE)
DBCC DROPCLEANBUFFERS

现在让问题消失了,但我认为这可能只是一个临时性问题。溶液

答案 4 :(得分:-1)

您需要添加一列作为uniqueId或键才能在EF

中工作