Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Atualizar grande número de linhas - SQL Server 2005


Você tem uma coluna de identidade indexada na tabela de destino? Este é um dos poucos casos em que eu realmente gosto de usar um loop WHILE. O principal problema com a solução no link que você postou é o mau uso do índice.
    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

Nos casos em que você tem uma chave substituta (coluna de identidade como chave primária), o que não é tão incomum, isso causaria uma busca simples de índice na chave primária e é ajustável simplesmente pelo valor de crescimento (5000 no exemplo)