【问题标题】:Entity Framework and loading all database entries vs loading each as required实体框架并加载所有数据库条目与根据需要加载每个条目
【发布时间】:2013-11-01 11:40:06
【问题描述】:

我有一个场景,我需要将数据库表与来自外部系统的列表 (XML) 同步。

我正在使用 EF,但不确定在性能方面哪个是实现这一目标的最佳方式。

据我所知,有两种方法可以做到这一点,但对我来说似乎都没有效率。

  1. 每次调用 Db - 从 XML 中读取每个条目 - 尝试从列表中检索条目 - 如果没有找到条目,则添加条目 - 如果找到,更新时间戳 - 在循环结束时,删除所有时间戳较旧的条目。

  2. 加载所有对象并在内存中工作

    • 将所有 EF 对象读入一个列表。
    • 删除所有 EF 对象
    • 为 XML 中的每个项目添加项目
    • 将更改保存到 Db。

列表并不长,估计大约有 70k 行。我不想在插入新行之前清除 db 表,因为该表是来自 web 服务的数据的源,并且我不想在可以查询表时锁定表。

如果我在 T-SQL 中执行此操作,我很可能会将行插入到临时表中,并加入以查找丢失和删除的条目,但我不知道如何在 Entity Framework 中处理此问题的最佳方法是.

有什么建议/想法吗?

【问题讨论】:

    标签: c# sql sql-server entity-framework


    【解决方案1】:

    Entity Framework 的一般问题是,当更改数据时,无论如何它都会为每个更改的记录触发查询,无论是延迟加载还是急切加载。所以从本质上讲,它会非常慢(想想 1000+ 倍)。

    我的建议是使用带有表值参数的存储过程并一起忽略实体框架。您可以使用merge 语句。

    70k 行并不多,但 70k 插入/更新/删除语句总是会很慢。

    您可以对其进行测试,看看性能是否可控,但直觉说实体框架不是可行的方法。

    【讨论】:

      【解决方案2】:

      我将遍历 XML 中的元素并一次更新数据库中的相应行。我想这就是你的第一个选择的意思?只要您有一个好的查询计划来选择每一行,那应该是非常有效的。就像你说的那样,70k 行并不算多,所以你最好保持代码简单明了,而不是为了提高速度而做一些不那么可读的事情。

      【讨论】:

      • 所以你会建议 70k .FirstOrDefault() 调用数据库?我正在做类似的事情,而且它会永远持续下去......我相信一定有更快的方法,但也许你是对的,有时简单胜过性能。
      • 不,我的意思是:查看第一个 XML“行”,获取唯一键 (k) 并运行 (from x in table where x.unique_key == k select x).SingleOrDefault()
      • 另外,目前需要多长时间?也许你确实需要更快的东西。如果是这样,像 Bas Brekelmans 建议的那样完全避免使用 EF 可能是要走的路。
      • 感谢所有帮助。我正在使用 from a in 表执行您提到的操作,但使用的是 FirstOrDefault 而不是 Single。
      • 目前大约需要 15 分钟,这还不错,因为 XML 每天只更改一次,但是 15 分钟内 70k 行听起来很慢!
      【解决方案3】:

      这取决于。如果更改不多(比如少于数百个),可以使用 EF。否则,需要批量插入数据库并合并数据库内的行。

      【讨论】:

        猜你喜欢
        • 2023-04-03
        • 2016-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多