Archive & Purge, la double peine

cest-du-propre-jl-bulcao_m6Quand 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

3 réflexions sur “Archive & Purge, la double peine

  1. Et avant que quelqu’un ne fasse la remarque… Bien évidemment, vous auriez dû partitionner votre table pour ne pas avoir ce souci.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s