Frameworks 缺少属性时,代码优先实体框架会变慢
我首先使用实体框架4.3.1代码 我有一个非常简单的表达式和实体模型Frameworks 缺少属性时,代码优先实体框架会变慢,frameworks,ef-code-first,entity,Frameworks,Ef Code First,Entity,我首先使用实体框架4.3.1代码 我有一个非常简单的表达式和实体模型 using (var PMCtx = new PMContext("PMEntities")) { var results = PMCtx.Fetch<vwSDHOriginalMW>() .Where(x => x.DT >= StartDate && x.DT < EndDate)
using (var PMCtx = new PMContext("PMEntities"))
{
var results =
PMCtx.Fetch<vwSDHOriginalMW>()
.Where(x => x.DT >= StartDate && x.DT < EndDate)
.ToList();
return results;
}
public class vwSDHOriginalMW : IEntityObject, IPMContext
{
public int Schedule { get; set; }
public DateTime DT { get; set; }
public int HE { get; set; }
public Decimal OrgMW { get; set; }
public Decimal DELIVERMW { get; set; }
public string NERCCode { get; set; }
public string NERCCodeStatus { get; set; }
public int SDHSDHID { get; set; }
}
在昨天添加了这个属性之后,它在一段时间内急剧加速,运行时间从15秒缩短为4秒。但今天它又变慢了,什么都没有改变
更新:
我把范围缩小了一点。我可以使用两种方法,最终使用相同的FetchSet。我使用的那个返回IQueryable而不是IEnumerable。这似乎很正常,因为我在之后进行过滤,这是最理想的。但是,返回IQueryable的方法需要15秒,而IEnumerable的时间不到一秒。(我对这两个函数都调用了ToList())FetchAll原来只是一个调用Fetch并返回IEnumerable而不是IQueryable的包装器
public IQueryable<TEntity> Fetch<TEntity>() where TEntity : class, Common.IEntityObject
{
return privateContext.Fetch<TEntity>();
}
public IEnumerable<TEntity> FetchAll<TEntity>() where TEntity : class, Common.IEntityObject
{
return privateContext.FetchAll<TEntity>();
}
public IQueryable Fetch(),其中tenty:class,Common.IEntityObject
{
返回privateContext.Fetch();
}
public IEnumerable FetchAll(),其中tenty:class,Common.IEntityObject
{
返回privateContext.FetchAll();
}
如果我改变
IEnumerable<vwSDHOriginalMW> results =
PMCtx.Fetch<vwSDHOriginalMW>()
.Where(x => x.DT >= StartDate && x.DT < EndDate)
.ToList();
IEnumerable结果=
PMCtx.Fetch()
其中(x=>x.DT>=StartDate和&x.DT
到
IEnumerable结果=
PMCtx.Fetch()
托利斯先生()
其中(x=>x.DT>=StartDate和&x.DT
它很快。但这是不可接受的,因为我似乎希望将where子句传递到数据库。在本例中,在dev环境中,视图只有180行,但它可能有数百万行,因此我肯定不想在筛选之前将所有结果返回内存。经过大量挖掘和许多麻烦之后,我发现该视图引用的是另一个数据库实例上的视图,该实例引用的表缺少非聚集索引。这导致执行计划缓存不正确。在其他数据库上添加索引后:
USE [OTHERDATABASE]
GO
CREATE NONCLUSTERED INDEX [IX_ScheduleEnergyProfileJoin]
ON [dbo].[WTXS_ScheduleEnergyProfile] ([SEQSDR])
INCLUDE ([SEQSEPI],[StartDate],[EndDate])
GO
然后使用我正在使用的视图清除数据库上的执行计划缓存:
USE [MYDATABASE]
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
查询正在快速运行。因此,EF说它正在使用的SQL可能不是发送到数据库的SQL。这个故事的寓意是,我应该尽一切努力来获得这个数据库的分析权限,而不是依赖下面的命令来输出实际发送的SQL
var sql = ((System.Data.Entity.Infrastructure.DbQuery<vwSDHOriginalMW>)results).ToString();
var sql=((System.Data.Entity.Infrastructure.DbQuery)results).ToString();
什么是“IEntityObject”?您是否禁用了惰性加载?正在生成的示例SQL是什么?你的取回方法是什么样的?更新了原始帖子。IEntityObject只是一个空的标记接口。其他细节在帖子里。我错过了这部分。是的,看起来延迟加载已禁用。打开它没有任何效果。无论如何,视图只有184行。添加到CheckedTypes肯定有原因,但请先尝试从数据库中获取实体集而不使用泛型,以查看它的速度:例如,PMCtx.YourEntitySet.Where(x=>x.DT>=StartDate&&x.DTIEnumerable<vwSDHOriginalMW> results =
PMCtx.Fetch<vwSDHOriginalMW>()
.ToList()
.Where(x => x.DT >= StartDate && x.DT < EndDate);
USE [OTHERDATABASE]
GO
CREATE NONCLUSTERED INDEX [IX_ScheduleEnergyProfileJoin]
ON [dbo].[WTXS_ScheduleEnergyProfile] ([SEQSDR])
INCLUDE ([SEQSEPI],[StartDate],[EndDate])
GO
USE [MYDATABASE]
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
var sql = ((System.Data.Entity.Infrastructure.DbQuery<vwSDHOriginalMW>)results).ToString();