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.

Répondre

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 )

Photo Google

Vous commentez à l'aide de votre compte Google. 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 )

Connexion à %s