繁体   English   中英

如何加快对具有 200 万行的表的批量更新查询?

[英]How do I speed up the batch of update queries over the table with 2 million rows?

我有大约 200 万个更新查询

UPDATE table1 
SET WIN = 'A-9-0-9999-00000-00000-0000' 
WHERE WIN= 'A-0-9-0000-999999-000000'

现在我有大约 200 万个更新查询,我将它们粘贴到 SQL window 中并立即运行,但每个系统大约需要 1 小时(我在不同的服务器上有相同的数据库)。

table1本身有 200 万行。

而且我已经从类型为varcharWIN列中删除了 Index 。

我怎样才能加快速度?

更新:

为了让您知道,我有大约 200 万个更新查询,例如上面的更新查询,具有不同的值。

 UPDATE table1 
    SET WIN = 'A-9-0-9999-00000-00000-0000' 
    WHERE WIN= 'A-0-9-0000-999999-000000'

.

.
.
.
.
.
.
.
.
.
.
 UPDATE table1 
    SET WIN = 'G-6-H-9999-00000-00000-0000' 
    WHERE WIN= 'A-1-9-0000-999999-000000'

我一下子就跑了。

我认为您应该将更新转换为插入并分批执行。

SET XACT_ABORT ON;
SET NOCOUNT ON;

CREATE TABLE #Replaces  (
    ReplaceId INT      NOT NULL IDENTITY PRIMARY KEY,
    OldWIN    CHAR(27) NOT NULL,
    NewWIN    CHAR(27) NOT NULL,
    TargetId  INT
);

INSERT INTO #Replaces (OldWIN, NewWIN)
VALUES('A-9-0-9999-00000-00000-0000', 'A-0-9-0000-999999-000000')
-- ...
-- ...
INSERT INTO #Replaces (OldWIN, NewWIN)
VALUES('G-6-H-9999-00000-00000-0000', 'A-1-9-0000-999999-000000')

-- Scan for Id in table1 once.
UPDATE Replaces
SET TargetId = table1.Id
FROM #Replaces AS Replaces
INNER JOIN table1 ON table1.WIN = Replaces.OldWIN

DECLARE @BATCH_SIZE INT = 500;

DECLARE @batch    TABLE (
    ReplaceId INT      NOT NULL PRIMARY KEY,
    TargetId  INT      NOT NULL,
    NewWin    CHAR(27) NOT NULL
);
DECLARE @maxId    INT = 0;

WHILE 1 = 1
BEGIN
    BEGIN TRY
        INSERT INTO @batch (ReplaceId, TargetId, NewWIN)
        SELECT TOP (@BATCH_SIZE) ReplaceId, TargetId, NewWIN
        FROM #Replaces
        WHERE ReplaceId > @maxId
        ORDER BY ReplaceId;

        IF @@ROWCOUNT = 0 BREAK;

        UPDATE table1
        SET WIN = Batch.NewWin
        FROM @batch AS Batch
        INNER JOIN table1 ON table1.Id = Batch.TargetId

        SELECT @maxId = MAX(ReplaceId) FROM @batch;

        DELETE @batch;
    END TRY BEGIN CATCH
        SELECT ERROR_MESSAGE = ERROR_MESSAGE();
        BREAK;
    END CATCH
END

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM