使用First或FirstOrDefault的EF6慢查询

时间:2018-12-14 01:10:20

标签: sql-server asp.net-mvc entity-framework-6

我有一个非常奇怪的问题(至少对我来说!)。

我有一个EF6实体,该实体具有多个表和视图,其中一个视图使用联接从其他视图中提取相关数据进行显示。当我在SSMS中运行简单查询时,响应时间不到一秒钟

select * 
from WorkOrderRecord 
where id = 1

这很奇怪,在我的应用中,以下代码需要10秒钟以上的时间:

using (var db = new WorkOrderEntities())
{
    var data = db.WorkOrderRecords.FirstOrDefault(a => a.id == id).;
    return data;
}

但这花费不到一秒钟:

using (var db = new WorkOrderEntities())
{
    var data = db.WorkOrderRecords.Where(a => a.id == id).ToList();
    return data.FirstOrDefault();
}

我尝试从WorkOrderEntities中删除视图并重新添加,我已经在SQL Server上重建了索引,重建了统计信息。没有真正的改变。

FirstOrDefault生成的SQL代码如下所示

SELECT TOP (1)      
    Extent1.---every single column 
FROM 
    (SELECT 
         [WorkOrderRecord].--every single column
     FROM 
         [dbo].[WorkOrderRecord] AS [WorkOrderRecord]) AS [Extent1]
WHERE 
    [Extent1].[id] = 24000

WHERE的SQL代码基本上是相同的代码,但没有TOP (1)

为什么会有这种性能差异,所以我认为这是SQL而不是EF6,因为我可以在SSMS中对其进行重现。我已经删除了所有统计信息和索引,重新创建了它们,检查了联接,SQL事件探查器无济于事,下一步我应该尝试什么?

0 个答案:

没有答案