从实体框架中的Oracle物化视图中检索10条记录非常慢

时间:2016-12-08 20:43:11

标签: asp.net-mvc oracle entity-framework

我正在构建一个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列。)

2 个答案:

答案 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