2012-12-10 46 views
1

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

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

任何建议如何执行该更新?

+1

是的,这是你应该怎么做。 – RBarryYoung

回答

0

处理此问题的更好方法之一是使用SQL中的MERGE命令。 Mssqltips上有一个很好的tutorial,它比其他一些命令使用起来有点麻烦。

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

0

我们以您所描述的方式在我们的代码中处理这种情况;我们有一个临时表,然后运行一个更新,其中临时表中的ID与要更新的表匹配,然后运行一个插入,其中要更新的表中的ID为空。但是,我们通常会对库/程序设置进行更新,因此它只能在较小的表上很少运行。表现可能达不到这么多记录或每日运行的平均水平。

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

+0

现在,在研究之后,我偶然发现了SQL中的MERGE;你尝试过吗? – Andrew