Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Aktualisieren einer großen Anzahl von Zeilen – SQL Server 2005

Haben Sie eine indizierte Identitätsspalte in der Zieltabelle? Dies ist einer der wenigen Fälle, in denen ich tatsächlich gerne eine WHILE-Schleife verwende. Das Hauptproblem bei der Lösung in dem von Ihnen geposteten Link ist die schlechte Indexnutzung.

    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

In Fällen, in denen Sie einen Ersatzschlüssel (Identitätsspalte als Primärschlüssel) haben, was nicht so ungewöhnlich ist, würde dies eine einfache Indexsuche auf dem Primärschlüssel verursachen und ist einfach durch den Wachstumsbetrag (5000 im Beispiel) einstellbar