我需要更新表中的一个位字段,并针对该表中的特定 Id 列表将该字段设置为 true。
Id 从外部进程传入。
我想在纯 SQL 中,最有效的方法是创建一个临时表并用 Id 填充它,然后用它连接主表并相应地设置位字段。
我可以创建一个 SPROC 来获取 Id,但可能涉及 200 - 300,000 行需要设置此标志,因此它可能不是最有效的方法。使用 IN 语句对可传递的数据量和性能有限制。
如何使用实体框架实现上述目标
我猜想可以创建一个 SPROC 来创建临时表,但这从模型的角度来看是不存在的。
有没有办法在运行时动态添加实体。 [或者这种方法只会引起头痛]。
我做出上面的假设,尽管用 300,000 行填充临时表并进行联接会比调用 SPROC 300,000 次更快:)
[ID 是指南]
我应该考虑另一种方法吗?
对于像 300k 行这样的数据量,我会忘记 EF。我会通过一张表来做到这一点,例如:
BatchId RowId
其中 RowId 是我们要更新的行的 PK,而 BatchId 只是指此 300k 行的“运行”(以允许同时多个行等)。
我将生成一个新的 BatchId(这可以是任何唯一的 -Guid 跃入脑海),并使用 SqlBulkCopy 将记录插入到该表中,即
100034 17
100034 22
...
100034 134556
然后,我将使用单个存储过程进行连接和更新(并从表中删除批次)。
SqlBulkCopy 是将大量数据传输到服务器的最快方法;您不会淹没在往返旅程中。 EF 是面向对象的:适用于很多场景 - 但不是这个。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)