Пакетное обновление SQL с объединением временной таблицы - PullRequest
0 голосов
/ 31 октября 2018

У меня возникли проблемы с эффективным обновлением.

Позвольте мне изложить свои вопросы.

table : people
+-------+-----------+-----------+
| caID  |  created  |  modified |
+-------+-----------+-----------+
|   1   |  1-1-2001 |  1-1-2005 |   
|   2   |  1-1-2001 |  1-1-2005 |  
|   3   |  1-1-2001 |  1-1-2005 |   
|   4   |  1-1-2001 |  1-1-2005 |   
|   5   |  1-1-2001 |  1-1-2005 |   
+-------+-----------+-----------+

У меня есть таблица, как указано выше (с большим количеством столбцов) длиной в несколько миллионов строк. Мне нужно обновить около полумиллиона измененных дат, чтобы соответствовать созданным датам.

Теперь я хочу пойти по этому пути, используя переменную временная таблица / таблица для сбора идентификаторов caID, которые я хочу обновить.

DECLARE @temp TABLE(
    id BIGINT NOT NULL IDENTITY(1,1) PRIMARY KEY,
    caID BIGINT
)
INSERT INTO @temp
(
    caID
)

На данный момент я использовал что-то подобное вышеописанному. Я использовал дополнительный столбец идентификатора, так как, насколько я понимаю, я должен иметь возможность использовать это в пакетном обновлении, чтобы убедиться, что я не перебираю одни и те же строки.

Здесь все идет не так. На этом сайте я видел много примеров пакетных обновлений, но моя проблема в том, что я хочу использовать таблицу temp / var в INNER JOIN для обновления основной таблицы.

UPDATE p
    SET p.Modified = p.Created
        FROM people p
        JOIN @temp t ON t.caID = p.caID

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

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

Если у кого-то есть мнение об использовании временных таблиц и т.п. для выполнения обновлений, я также приветствую их. Все еще относительно новичок в этом, и чем больше я могу учиться, тем лучше.

Если вам нужна дополнительная информация, пожалуйста, спросите.

Было решение от другого, где это кажется хорошим.

    WHILE 1 = 1
    BEGIN
        BEGIN TRANSACTION
            UPDATE TOP (1000) ca
                UPDATE p
                SET p.Modified = p.Created
                FROM people p
                JOIN @temp t ON t.caID = p.caID
                    WHERE p.Modified <> p.Created
        IF @@ROWCOUNT = 0 -- terminating condition;
                      BEGIN
                        COMMIT TRANSACTION
                        BREAK
                      END
            COMMIT TRANSACTION
            WAITFOR DELAY '00:00:00.300';
    END

Наряду с индексацией для временной таблицы это, похоже, работает очень хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...