Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Aggiorna un numero elevato di righe - SQL Server 2005

Hai una colonna di identità indicizzata nella tabella di destinazione? Questo è uno dei pochi casi in cui mi piace usare un ciclo WHILE. Il problema principale con la soluzione nel link che hai pubblicato è un cattivo utilizzo dell'indice.

    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

Nei casi in cui hai una chiave surrogata (colonna identità come chiave primaria), cosa non così rara, ciò causerebbe una semplice ricerca dell'indice sulla chiave primaria ed è regolabile semplicemente dall'importo della crescita (5000 nell'esempio)