2

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

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

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

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

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

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

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

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

有什么建议/想法吗?

4

3 回答 3

2

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

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

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

你可以测试它,看看性能是否可控,但直觉说实体框架不是要走的路。

于 2013-11-01T11:52:10.287 回答
1

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

于 2013-11-01T11:50:24.873 回答
1

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

于 2013-11-01T12:01:03.047 回答