Quand il s’agit de purger des données, on y va souvent à la serpette avec un bon vieux DELETE et une clause WHERE.
Oui, c’est long.
Mais c’est encore plus long quand on vous demande de copier les données dans une table à côté. Au cas où…
Là, vous vous taper la double-peine : un bon gros SCAN et une insertion suivie d’un bon gros DELETE.
Heureusement, il y a la clause OUTPUT qui permet de chainer les opérations. Ce qui est supprimé est directement injecté dans l’insertion.
Vous ajoutez à cela une petite boucle pour ne pas exploser votre LOG (attention, pas de ROLLBACK sauf pour le dernier lot !!).
Et voila comment gagner quelques minutes de votre vendredi après-midi.
declare @rc int = 1 declare @i int = 1 declare @batchsize int = 100000 while @rc > 0 begin insert into MaTable_Archve select * from ( delete top (@batchsize) from MaTable OUTPUT deleted.* where MaTable.Date > convert(datetime, '2016-01-01', 120) ) deleted set @rc = @@rowcount print @i * @batchsize set @i += 1 end
Et avant que quelqu’un ne fasse la remarque… Bien évidemment, vous auriez dû partitionner votre table pour ne pas avoir ce souci.
S’il est dans l’édition enterprise…
Pour les partitions oui.