Массовое обновление SQL Server 2008 с использованием хранимой процедуры

У меня есть 2 таблицы в БД. каждый со столбцом «Имя» и столбцом «Количество».

Я хотел бы обновить столбец Count во второй таблице из Count в первой таблице только там, где столбцы «Имя» равны.

Пример:

Первая таблица:

Количество имен

разъем 25
микрофон 44

Количество имен

джек 23
майк 9
дэвид 88

Результат (вторая таблица будет выглядеть так...)

Количество имен

джек 25
майк 44
дэвид 88

ПРИМЕЧАНИЯ:
1. Обе таблицы огромны. (хотя вторая таблица больше...)
2. Обновление должно быть как можно более быстрым...
(если есть еще варианты, кроме хранимых процедур, я был бы рад услышать.)
3. "Количество" определяется как bigint, а "Имя" как nvarchar(100)
4. Поле "Количество" в первой таблице всегда больше, чем эквивалентное во второй таблице
.

Я думаю, что есть больше вариантов (кроме хранимой процедуры), возможно, с MERGE или TRANSACTION, если это будет самый быстрый способ...

Спасибо!


person Michael    schedule 17.02.2011    source источник
comment
Каково точное определение таблиц? Включите точные типы столбцов, определение кластеризованного индекса, все некластеризованные индексы, все ограничения. А также определить «огромный». Кто-то считает 1М огромным, кто-то считает его ничтожным.   -  person Remus Rusanu    schedule 17.02.2011
comment
Привет! во второй таблице столбец Имя кластеризован с индексацией по возрастанию. первая таблица имеет от 100 до 400 тысяч строк, а вторая — от 10 до 100 миллионов строк.   -  person Michael    schedule 18.02.2011


Ответы (1)


Лучшим способом было бы сохранить его простым

UPDATE Table2
SET Count = t1.Count
FROM Table1
WHERE Table2.Name = Table1.Name 
  AND Table2.Count <> Table1.Count

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

Например: (при условии, что имя является столбцом varchar (20))

UPDATE Table2
SET Count = t1.Count
FROM Table1
WHERE Table2.Name = Table1.Name 
  AND Table2.Count <> Table1.Count
  AND Table2.Name between cast('Jack' as varchar(20)) 
                      and cast('Mike' as varchar(20))

(Приведение строк очень помогает Sql Server правильно выполнять удаление разделов.)

person Filip De Vos    schedule 17.02.2011