如何加快这个相当简单的UPDATE查询?它已经运行了5个多小时!

我基本上是通过加入容纳旧ID和新ID的新表来替换表中的SourceID。所有这些字段都是VARCHAR(72),必须保持这种状态。

Pub_ArticleFaculty表具有8,354,474行(830万)。 ArticleAuthorOldNew具有99,326,472行(9930万行),并且只有下面您看到的2个字段。

在所有这些字段上都有单独的非聚集索引。有没有更好的方法编写此查询以使其运行更快?

UPDATE PF
        SET PF.SourceId = AAON.NewSourceId
    FROM AA..Pub_ArticleFaculty PF WITH (NOLOCK)
        INNER JOIN AA2..ArticleAuthorOldNew AAON WITH (NOLOCK)
                   ON AAON.OldFullSourceId = PF.SourceId

最佳答案

以我的经验,循环更新以使每次迭代只对少量行起作用,是一种不错的方法。更新每次迭代的理想行数在很大程度上取决于您的环境和正在使用的表。我通常每次迭代都会粘贴大约1,000-10,000行。

示例

SET ROWCOUNT 1000 -- Set the batch size (number of rows to affect each time through the loop).
WHILE (1=1) BEGIN

    UPDATE PF
    SET NewSourceId = 1
    FROM AA..Pub_ArticleFaculty PF WITH (NOLOCK)
            INNER JOIN AA2..ArticleAuthorOldNew AAON WITH (NOLOCK)
                       ON AAON.OldFullSourceId = PF.SourceId
    WHERE NewSourceId IS NULL -- Only update rows that haven't yet been updated.

    -- When no rows are affected, we're done!
    IF @@ROWCOUNT = 0
        BREAK
END
SET ROWCOUNT 0 -- Reset the batch size to the default (i.e. all rows).
GO

09-04 04:12
查看更多