1

我有一个包含超过一百万条记录(产品)的表。现在,每天,我都需要更新现有记录和/或添加新记录。

我没有一个接一个地做(需要几个小时),而是设法使用SqlBulkCopy一堆记录并设法在几秒钟内完成我的插入,但它只能处理新的插入。所以我正在考虑创建一个包含新记录和旧记录的新表;然后使用该临时表(在 SQL 端)更新/添加到主表。

有什么建议我该如何执行该更新?

4

2 回答 2

0

我们按照您描述的方式在代码中处理这种情况;我们有一个临时表,然后运行更新,其中临时表中的 ID 与要更新的表匹配,然后运行插入,其中要更新的表中的 ID 为空。不过,我们通常这样做是为了更新库/程序设置,因此它只是很少在较小的表上运行。对于那么多记录或每日运行,性能可能达不到标准。

我在使用这种方法时遇到的主要“问题”是,对于更新,我们进行了比较,以确保在实际运行更新之前至少有几个字段中的一个发生了变化。(我们这样做的最初原因是避免覆盖一些默认值,这可能会影响服务器行为。如果您的临时表可能包含实际上没有更改的记录,那么您这样做的原因可能是性能)。我们遇到了一种情况,我们确实想要更新其中一个默认值,但我们的旧脚本没有捕捉到这一点。因此,如果您进行任何比较以确定要更新哪些产品,请确保它从一开始就完整,或者记录好您不比较的任何字段以及原因。

于 2012-12-10T17:36:07.810 回答
0

处理此问题的更好方法之一是使用 SQL 中的MERGE命令。Mssqltips 有一个很好的教程,它可能比其他一些命令使用起来有点棘手。

此外,由于锁定,您可能希望将其分解为多个较小的事务,除非您知道可以容忍更新期间的阻塞。

于 2012-12-10T17:43:24.293 回答