У меня проблемы с эффективным обновлением.
Позвольте мне изложить свои проблемы.
Таблица people
:
CAID | созданный | модифицированный |
---|---|---|
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 |
У меня есть таблица, подобная приведенной выше (с большим количеством столбцов), длиной в несколько миллионов строк. Мне нужно обновить около полумиллиона измененных дат, чтобы они соответствовали созданным датам.
Теперь я хочу сделать это, используя временную таблицу / переменную таблицы для сбора caIDs
, который я хочу обновить.
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
Наряду с индексацией по временной таблице это, похоже, очень хорошо работает.
Ваш запрос выглядит нормально, если не считать псевдонима pa.
, поскольку в вашем запросе нет псевдонима pa
. Либо измените его на p
, либо удалите его полностью, поскольку на самом деле это не требуется. Ваш UPDATE
уже настроен / будет работать «в пакетном режиме» (sic), поэтому не нужно беспокоиться об этой части. Я бы написал этот запрос как: UPDATE p SET modified = p.created FROM people p INNER JOIN @temp t ON t.caId = p.caId;
.
Да, и вся эта часть Id
и IDENTITY
полностью избыточна. Я бы просто удалил этот столбец, он вам ни по какой причине не нужен.
Извините, исправил ошибки в запросе.
@ JimmyPop13. . . Есть вопрос, как делать пакетные обновления? Или вопрос в другом?
@GordonLinoff Это в основном то, как сделать пакетное обновление с объединением в нем. Как и в каждом примере, я обнаружил, что ни один из них не использует соединение.
Похоже, в вашем коде есть ошибка. В предложении where вы использовали
t.caID = p.ID
, но вставилиcaID
во временную таблицу. Что это такое?