【问题标题】:Retrieving 10 records from Oracle materialized view in Entity Framework VERY slow从实体框架中的 Oracle 物化视图中检索 10 条记录非常慢
【发布时间】:2016-12-08 20:43:11
【问题描述】:

我正在构建一个 ASP.NET MVC 5 应用程序,以一次只读访问几条记录(大约在 2 到 12 行之间)。记录存储在 Oracle 11 中,并通过 Entity Framework 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 秒。我的问题是: A. 这三种方法中最好的方法是什么? (List, IQueryable, IEnumerable) ------ B. 无键实体化视图是一个根本问题吗? (我在 .NET 数据存储库中有一个模型,它只使用视图包含的 100 多个列中的 8 个)。

【问题讨论】:

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


    【解决方案1】:

    您可以尝试如下查询。

    注意:使用 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

    【讨论】:

    • 对此有何反馈?
    • 这些答案很好!我仍在寻找更改 Oracle 方面的选项。
    • 谢谢大家!这里非常有用的答案。 Sampath 和 Kacper 对这个问题都非常有帮助。
    【解决方案2】:

    如果视图在 where 子句中使用的列上没有主键或索引,这实际上是个问题。如果没有索引,Oracle 需要对 MV 进行全扫描。所以你应该考虑索引 MV。

    如果这 100 列可能包含大量数据,这可能会导致提取数据时出现一些延迟,您应该考虑在 MV 上创建视图,该视图仅选择您需要的那些列并查询视图。但这可能不会有太大帮助(除非列是 BLOB 或 CLOB 或其他巨大的类型)。主要问题似乎是没有索引。

    您应该为您的查询生成执行计划,并检查访问 MV 的方法和查询的估计成本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-02
      • 2023-02-26
      • 1970-01-01
      • 2013-01-30
      • 1970-01-01
      • 2013-07-17
      • 2014-11-16
      • 2023-01-11
      相关资源
      最近更新 更多