【问题标题】:How to update and add new records at the same time如何同时更新和添加新记录
【发布时间】:2012-12-11 01:43:24
【问题描述】:

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

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

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

【问题讨论】:

  • 是的,你应该这样做。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 现在,经过研究,我在 SQL 中偶然发现了MERGE;你试过吗?
    猜你喜欢
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多