gpt4 book ai didi

sql-server - 用于组合数据的 Entity Framework 算法

转载 作者:太空狗 更新时间:2023-10-30 01:49:16 25 4
gpt4 key购买 nike

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

我们在表 T 中有一个数据集。我们从中提取一个我们将称为 A 的集合。我们还查询一个 XML 提要并获得一个我们将称为 X 的集合。

  • 如果 X 中的值在 A 中,则必须更新 A 中的记录以反射(reflect) 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() 函数调用。在某些情况下,它是 20 毫秒,而在其他一些情况下,很明显,它会跳到 100 毫秒。

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

建议?

最佳答案

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

查询

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

数据修改

  • 不必 不应在每次修改后调用SaveChanges。您可以在 foreach 循环之后调用它,它仍然可以工作。它将在单个事务中传递所有修改 但您不会通过此类操作获得任何性能提升 并且根据this answer它可以给你一个显着的提升。
  • EF doesn't support command batching正因为如此,每次更新或插入总是需要单独往返数据库。在使用 EF 修改数据时,除了实现全新的 EF ADO.NET 提供程序外,没有其他解决方法(这就像开始一个新项目)。
  • 另一个解决方案是通过使用具有表值参数的存储过程来减少往返
  • 如果您的数据库还使用该 GUID 作为主键和聚集索引,您的性能又会下降 reordering index after each insert = 修改磁盘上的数据。

问题不在于算法,而在于处理数据的方式和用于处理数据的技术。 Entity Framework 不是数据泵的好选择。您应该将这些信息带给您的老板,因为提高性能意味着您的应用程序需要进行更复杂的更改。这不是你的错,也不是做应用程序的程序员的错。这是 EF 的一项功能,它不是很为人所知,而且据我所知,在任何 MS 最佳实践中都没有明确说明。

关于sql-server - 用于组合数据的 Entity Framework 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5798646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com