我正在构建一个ASP.NET MVC 5应用程序,以便一次只读取一些记录(大致在2到12行之间)。这些记录存储在Oracle 11中,并通过实体框架6从Oracle中的大型非键控物化视图中访问。我已经尝试了List,IQueryable和IEnumerable来获取这些记录。 (以下示例)
public List<FACT> GetCollisionList(string collisionMRN)
{
var collisions = from c in _context.FACT
where c.COLLISION_RECORD_NUMBER.Equals
(DbFunctions.AsNonUnicode(collisionMRN),
StringComparison.OrdinalIgnoreCase)
select c;
return collisions.ToList();
}
每次返回记录大约需要20秒。我的问题是:答:这三种方法中最好的可能是什么? (List,IQueryable,IEnumerable)------ B.非键控物化视图是一个根本问题吗? (我在.NET数据存储库中有一个模型,它只使用视图包含的100多列中的8列。)
答案 0 :(得分:0)
如果视图在where子句中使用的列上没有主键或索引,那么这实际上是个问题。如果没有索引Oracle需要对MV进行全面扫描。所以你应该考虑索引MV。
如果这100个列可能包含大量可能导致数据延迟的数据,则应考虑在MV上创建视图,该视图仅选择您需要的列并查询视图。但这可能不会有多大帮助(除非列是BLOB或CLOB或其他大型类型)。主要问题似乎是没有索引。
您应该为查询生成执行计划,并检查访问MV的方法和查询的估计成本。
答案 1 :(得分:0)
您可以在查询中尝试以下内容。
注意:使用AsNoTracking()并删除延迟加载。
AsNoTracking():
返回一个新查询,其中返回的实体不会被缓存 DbContext
public List<FACT> GetCollisionList(string collisionMRN)
{
_context.Configuration.LazyLoadingEnabled = false;//to remove lazy loading
var collisions = (from c in _context.FACT
where c.COLLISION_RECORD_NUMBER.Equals
(DbFunctions.AsNonUnicode(collisionMRN),
StringComparison.OrdinalIgnoreCase)
select c).AsNoTracking();
return collisions.ToList();
}
您可以阅读此文档,了解有关查询优化的更多选项:Performance Considerations for EF