У меня возникли проблемы с эффективным обновлением.
Позвольте мне изложить свои вопросы.
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
Наряду с индексацией для временной таблицы это, похоже, работает очень хорошо.