Как ускорить пакет запросов на обновление для таблицы с 2 миллионами строк? - PullRequest
0 голосов
/ 28 апреля 2020

У меня около 2 миллионов запросов на обновление

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

Теперь у меня есть около 2 миллионов запросов на обновление, которые я вставляю в окно SQL и выполняю одновременно, но для каждой системы требуется около 1 часа (я иметь одинаковую базу данных на разных серверах).

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 100 '* * * * * * 1001 ". *.

Как я могу ускорить это?

Обновление:

Чтобы сообщить вам, у меня есть около 2 миллионов запросов на обновление, подобных приведенному выше, с различными значениями.

 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'

и я бегу все сразу.

1 Ответ

1 голос
/ 28 апреля 2020

Я думаю, что вы должны преобразовать свои обновления во вставки и выполнить их партиями.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...