sql - 如何加速具有数百万行的简单 UPDATE 查询?

标签 sql sql-server tsql sql-server-2012

如何加速这个相当简单的 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

关于sql - 如何加速具有数百万行的简单 UPDATE 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34866751/

相关文章:

c# - 如何在未安装 SQL Server 的计算机上使用 SQL 数据库运行应用程序

java - INSERT INTO 在 Java 中使用 INNER JOIN

sql-server - 使用 LiveCode 通过 ODBC 从 SQL Server 检索 unicode 数据

tsqlt-创建单独的数据库以进行单元测试

sql - 为什么 "insert (...) values (...)"不能插入新行?

java - 致命异常 : main java. lang.VerifyError : net. sourceforge.jtds.jdbc.TdsCore

sql-server - Nvarchar的性能要比varchar好吗?

sql - 处理不断变化的 Excel 表结构以导入数据库表

c# - 存储过程不适用于 c# 代码

mysql - 在 MySQL 中进行透视时如何生成没有零值字段的单行结果集