我有一个非常奇怪的问题(至少对我来说!)。
我有一个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事件探查器无济于事,下一步我应该尝试什么?