我有一个场景,我需要将数据库表与来自外部系统的列表(XML)同步。
我正在使用EF,但我不确定在性能方面哪个是最好的方法。
我认为有两种方法可以做到这一点,但对我来说似乎都没有效率。
每次调用Db - 从XML中读取每个条目 - 尝试并从列表中检索条目 - 如果未找到任何条目,请添加条目 - 如果找到,请更新时间戳 - 在循环结束时,删除所有带有旧时间戳的条目。
加载所有对象并在内存中工作
列表不长,估计大约70k行。我不想在插入新行之前清除db表,因为这个表是来自webservice的数据源,我不想锁定表,而它可以查询它。
如果我在T-SQL中执行此操作,我很可能会将行插入临时表,并加入以查找丢失和删除的条目,但我不知道如何在实体框架中处理此问题的最佳方法是。
有任何建议/想法吗?
答案 0 :(得分:2)
实体框架的一般问题是,在更改数据时,无论是懒惰还是急切加载,它都会为每个已更改的记录触发查询。因此,它本质上会非常缓慢(想想因素1000 +)。
我的建议是使用带有表值参数的存储过程并一起忽略实体框架。您可以使用merge
语句。
70k行并不多,但70k插入/更新/删除语句总是非常慢。
你可以测试它,看看性能是否可以管理,但直觉说实体框架不是可行的方法。
答案 1 :(得分:1)
我将迭代XML中的元素并一次更新DB中的相应行。我猜你的第一个选择是什么意思?只要您有一个好的查询计划来选择每一行,那应该非常有效。就像你说的那样,70k行并不是那么多,所以你最好保持代码简单,而不是做一些不太可读的东西,以便更快一点。
答案 2 :(得分:1)
这取决于。如果没有太多变化(比如少于几百个),可以使用EF。否则,需要批量插入数据库并合并数据库中的行。