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.