用于组合数据的实体框架算法

这与我正在继承的项目有关,并且不能更改表结构或数据访问模型。 我被要求优化用于将数据插入数据库的算法。

我们在表T中有一个数据集。从那里,我们拉一个我们将称为A的集合。我们还查询一个XML馈送并获得一个集合,我们将称之为X.

  • 如果X中的值在A中,则必须更新A中的记录以反映X.record的数据
  • 如果X中的值不在A中,则必须将X.record插入到A中
  • 如果A中的值不在X中,则A.record必须保存在A中
  • X必须完全遍历所有记录,并且A必须更新
  • 所有这些更改都需要插回到数据库中。

    算法设置如下:

    Query XML into a LIST
    foreach over the XML LIST
        look up foreach.item in A via LINQ (i.e. query = from record in A where
                                                             record.GUID == foreach.item.GUID
                                                             select record)
        if query.Count() == 0
            insert into A (via context.AddToTableName(newTableNameObject)
        else
            var currentRecord = query.First()
            set all properties on currentRecord = properties from foreach.item
            context.SaveChanges()
    

    我知道这是不理想的。 我试图将A转换成foreach循环之外的一个对象(称为queryA),以便将查询移动到内存中而不是击中磁盘,但是在思考完后,我意识到数据库已经在内存中。

    在计算器中添加了定时器对象后,很明显最耗时的是SaveChanges()函数调用。 在某些情况下,它是20ms,而在另一些情况下,可以明确地说,它会跳到100ms。

    我宁愿只调用一次SaveChanges()。 鉴于我对EF的深入了解(最好是薄的)以及无法更改表结构以及必须保留A中不包含X的数据的限制,我无法弄清楚如何实现这一点。

    建议?


    我不认为在使用Entity框架时你会提高性能:

    查询

  • 通过单独查询加载每条记录并不好
  • 您可以通过在同一查询中加载多个记录来提高性能。 例如,您可以使用||加载小批记录 在条件或Contains (如IN的SQL)。 Contains仅由.NET 4.0支持。
  • 另一个改进可以用存储过程和表值参数替换查询,以将所有guid传递给SQL Server连接A并使用X.Guids并获得结果。 表值参数仅在SQL 2008及更新版本上受支持。
  • 数据修改

  • 您不必在每次修改后都调用SaveChanges 。 你可以在foreach循环之后调用它,它仍然可以工作。 它将在单次交易中通过所有修改,但您不会通过此类操作获得任何性能提升,并且根据此答案,它可以为您提供显着提升。
  • EF不支持命令批处理,并且因为每次更新或插入都会单独往返数据库。 除了实施全新的EF ADO.NET提供程序(就像开始一个新项目),使用EF修改数据时没有办法解决这个问题。
  • 同样的解决方案是通过使用具有表值参数的存储过程来减少往返
  • 如果您的数据库也使用该GUID作为主键和聚簇索引,则在每次插入=修改磁盘上的数据后,通过对索引重新排序来降低性能。
  • 问题不在算法中,而在于处理用于处理数据的数据和技术的方式。 实体框架不适合数据泵使用。 你应该将这些信息交给你的老板,因为提高性能意味着你的应用程序的更复杂的变化。 这不是你的错,它不是程序员做这个应用程序的错。 这是EF的一个特征,它不是很知名,因为我知道它在任何MS最佳实践中都没有明确说明。

    链接地址: http://www.djcxy.com/p/33555.html

    上一篇: Entity Framework Algorithm For Combining Data

    下一篇: How can I get Id of inserted entity without saveChanges in Entity framework?