[英]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 万行。
而且我已经从类型为varchar
的WIN列中删除了 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.