Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Mettre à jour un grand nombre de lignes - SQL Server 2005

Avez-vous une colonne d'identité indexée dans la table cible ? C'est l'un des rares cas où j'aime vraiment utiliser une boucle WHILE. Le principal problème avec la solution dans le lien que vous avez posté est une mauvaise utilisation de l'index.

    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

Dans les cas où vous avez une clé de substitution (colonne d'identité comme clé primaire), ce qui n'est pas si rare, cela entraînerait une simple recherche d'index sur la clé primaire et est ajustable simplement par le montant de la croissance (5000 dans l'exemple)