如何同时更新和添加新记录

时间:2012-12-10 17:18:50

标签: sql-server performance tsql insert-update bulk

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

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

任何建议我如何进行更新?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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