2013-08-22 4 views
2

Как я могу обновить строки по этапам с помощью cursor или что-то в этом роде?Обновление 13 миллионов строк - SQL Server 2008

Обновление с помощью текущего скрипта выполняется в течение нескольких дней и до сих пор не закончено.

Поле row_id. 1 - 13m

Только одно поле должно быть обновлено.

UPDATE 
     [CIPC].[dbo].[tbldirector] 
    SET 
     [CIPC].[dbo].[tbldirector].ENT_NUM = REG.Ent_Number 
    FROM 
     [CIPC].[dbo].[tbldirector] DIR 
    INNER JOIN 
     [Cipc].[dbo].[tblregister] REG 
    ON 
     DIR.ENT_LONGNAME = REG.ENT_NAME 
+0

загружаемого значение из другой таблицы или может вы тела Меня Sorce? –

+6

'Обновление с помощью текущего скрипта выполняется в течение нескольких дней и до сих пор не закончено. '. Зачем? Вы исследовали причину? 13M строк для обновления заканчиваются обычно в секундах. Соблюдайте должную осмотрительность и выясните, почему ваше обновление так медленно. Скорее всего, он даже не начал обновлять одну строку и блокируется. –

+0

См. [Этот ответ] (http://stackoverflow.com/questions/17244360/how-to-update-2-new-columns-created-in-a-table-which-has-more-than-250-million -r/17244402 # 17244402). –

ответ

4

в этом случае вам не нужен cursor. Вы можете сделать это с помощью такой петли.

DECLARE @indx int, @StepSize INT 

SET @indx = 1 
SET @StepSize = 100000 

BEGIN TRAN 
    WHILE (EXISTS(SELECT 0 FROM [CIPC].[dbo].[tbldirector] WHERE row_id >= @indx)) 
    BEGIN 
     PRINT 'Going to update indx ' + REPLICATE(CONVERT(VARCHAR, @indx) + ' -- ' + CONVERT(VARCHAR, @indx + @StepSize) + ' | ', 200) 
     UPDATE [CIPC].[dbo].[tbldirector] 
      SET [CIPC].[dbo].[tbldirector].ENT_NUM = REG.Ent_Number 
      FROM [CIPC].[dbo].[tbldirector] DIR 
      INNER JOIN [Cipc].[dbo].[tblregister] REG 
       ON DIR.ENT_LONGNAME = REG.ENT_NAME 
      WHERE row_id BETWEEN @indx AND @indx + @StepSize 
     SELECT @indx = @indx + @StepSize 
     SELECT REPLICATE(LEFT(CONVERT(VARCHAR, @indx) + ' | ', 10), 200) 
    END 
COMMIT 
+0

Это неверно, так как завершение сбоя/сервера внутри выполнения цикла приведет к невозможности его возобновления. Вы должны сохранить @indx и возобновить его после следующей итерации. –

+0

@RemusRusanu, что хороший момент, я просто предоставил общий подход. для обработки аварийного завершения/перезапуска SQL Server, я завернул его внутри транзакции –

+0

@ Luis LL - Спасибо вам. Возможно ли, что я смогу напечатать прогресс? –

Смежные вопросы