Я пишу запрос на обновление большой таблицы (более 6 миллиардов строк).К сожалению, вставка в новую таблицу невозможна из-за ограничений дискового пространства.
Я провел тестирование производительности с обоими ответами на заданный вопрос здесь , и второй ответ, кажется, самый быстрый вариант.
Я проверил производительность запросов с 1, 2, 3, 5 и 10 миллионами строк.Производительность резко снижается, чем больше строк я добавляю в обновление.
Вот пример моего запроса на обновление:
DECLARE @Rows INT, @BatchSize INT;
SET @BatchSize = 4500;
SET @Rows = @BatchSize;
WHILE (@Rows = @BatchSize)
BEGIN
UPDATE TOP (@BatchSize) [dbo].[TestTable]
SET MyID1 = MyID2
FROM [dbo].[TestTable]
WHERE MyID1 <> MyID2
SET @Rows = @@ROWCOUNT;
END
Время завершения и количество обновляемых строк в секунду:
- 1 миллион строк: завершено 43 секунды, 23255 строк / секунду
- 2 миллиона строк: завершено 168 секунд, 11904 строки / секунда
- 3 миллиона строк: 366секунд до завершения, 8196 строк / секунду
- 5 миллионов строк: 1098 секунд до завершения, 4553 строки / секунду
- 10 миллионов строк: 3922 секунды до завершения, 2549 строк / секунду
Я бы предположил, что смогу усреднять количество строк в секунду и получить оценку времени до завершения, но время до завершения, кажется, растет в геометрической прогрессии.Например, удвоение времени для завершения 5 миллионов строк должно занять около 2200 секунд, но это займет 3922 секунды.
Тестирование несколько раз возвращает похожие результаты, поэтому я не думаю, что имею дело с проблемой раздора.Плюс, это на тестовом сервере, который не используется.Чего мне здесь не хватает и как мне точно рассчитать время завершения этого обновления?