Обновление большого количества строк - SQL Server 2005 - PullRequest
2 голосов
/ 08 сентября 2011

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

http://itknowledgeexchange.techtarget.com/itanswers/bulk-update-in-sql-server-2005/

Это лучший способ?

Существуют ли еще более быстрые методы (SSIS, bcp)?

Любые отзывы высоко ценятся.Спасибо.

Кристиан

PS:

Мой наивный код выглядит следующим образом.Unfort.я не являюсь первичным ключом (у таблицы есть один, так как Bla является дочерним по отношению к другой таблице)

drop table #temp
create table #temp
(
    i int,
    xml nvarchar(max)
)
BULK INSERT #temp 
...

update a
set XML = b.xml
from Bla as a
inner join #temp as b on a.i = b.i

1 Ответ

2 голосов
/ 13 сентября 2011

Есть ли у вас индексированный столбец идентификаторов в целевой таблице?Это один из немногих случаев, когда мне действительно нравится использовать цикл WHILE.Основная проблема с решением в размещенной вами ссылке - неправильное использование индекса.

    DECLARE @START INT, @FINISH INT, @LOOPEND INT
    SELECT @START = 1, @FINISH = 5000, @LOOPEND = MAX(ID)
    from Bla 

    WHILE @START <= @LOOPEND
    BEGIN
        update a
        set XML = b.xml
        from Bla as a
        inner join #temp as b on a.i = b.i
        WHERE a.ID BETWEEN @START AND @FINISH

        SET @START = @FINISH + 1
        SET @FINISH = @FINISH + 5000
    END

В тех случаях, когда у вас есть суррогатный ключ (столбец идентификатора в качестве первичного ключа), что не является чем-то необычным, это может привести кпростой поиск по индексу по первичному ключу и регулируется просто по величине роста (в примере 5000)

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