2010-06-03 4 views
7

Je dois nettoyer une base de données SQL très pléthorique en supprimant les enregistrements datant de plus de deux ans d'un certain nombre de tables. Quel est le moyen le plus efficace de le faire?Requête SQL pour supprimer des enregistrements de plus de deux ans

+2

Quel RDBMS? Combien d'enregistrements de plus de 2 ans?Combien d'enregistrements de moins de 2 ans? –

+0

Existe-t-il un ensemble commun de champs "créés" ou "mis à jour" sur chaque table? –

+1

L'ajout de produit SQL que vous utilisez est important (MSSQL, mySQL, etc.). Dans MSSQL, par exemple, si vous avez des centaines de milliers de lignes, vous devez surveiller la croissance du journal des transactions. –

Répondre

15

Avez-vous un moyen de déterminer à quel point un enregistrement est «ancien»? (c'est-à-dire, y a-t-il une colonne dans la table qui représente soit l'âge de la rangée, soit une date qui peut être utilisée pour calculer l'âge?). Si oui, il devrait être un simple

DELETE FROM Table WHERE Age > 2 

Par exemple, si vous avez une colonne DateTime appelée CreateDate, vous pouvez le faire:

DELETE FROM Table WHERE DATEADD(year, 2, CreateDate) < getdate() 
+2

Pourrait être assez méchant en termes de serrures si. –

+0

@Martin: Je ne suis pas sûr que ce soit évitable, ou même si vous le voulez *. Je ne vois pas comment cela est plus "méchant" en termes de verrous que n'importe quel autre "DELETE" ou "UPDATE", autre que le fait qu'il implique un balayage de table. –

+2

La suppression de suppressions par lots pourrait être meilleure pour la simultanéité. –

3

En plus de la bonne réponse d'Adam Robinson: Lorsque vous effectuez cette type d'opération:

  1. exécuter une requête SELECT avec la Supprimons clause WHERE pour vous assurer que vous obtenez « les bonnes données »
  2. Faites une sauvegarde complète
  3. Exécuter la chose en « off » heures afin de ne pas affecter les utilisateurs trop
0

Je l'ai vu dba faire dans quelques entreprises différentes et il semble toujours utiliser la format suivant:

  1. sauvegarde la table
  2. Supprimez toutes les index
  3. Sélectionnez les lignes que vous souhaitez conserver dans une table temporaire
  4. Trun certi la table originale
  5. Insérer (dans votre table source) de votre table temporaire
  6. Recréer les index

L'avantage de cette approche est que cette mise à jour ne marche pas écrire dans les journaux afin qu'ils ne soient pas soufflé par des milliers d'entrées de suppression. C'est aussi plus rapide. L'inconvénient est que la mise à jour n'écrit pas dans les journaux, votre seule option est donc de restaurer votre sauvegarde.

Vous devriez penser à mettre le ménage en place. Si ce qui précède, est trop effrayant, alors vous pouvez également utiliser la maison en gardant la base de données sur une question de temps.

Dans MSSQL, vous pouvez créer un travail à exécuter quotidiennement, qui supprime les 1000 premières lignes de votre requête. Pour voler la requête d'Adam -

SUPPRIMER TOP 1000 DE table où DATEADD (année, 2, CreateDate) < getdate()

Ce serait très sûr et permettrait de se débarrasser de vos données en trois mois environ et en toute sécurité serait-il également maintenir la taille de la DB dans le futur.

Votre base de données utilisera cet espace dans le futur, mais si vous voulez récupérer l'espace, vous devrez réduire la base de données. Lisez autour si vous êtes intéressé - si cela vaut la peine dépend de la quantité d'espace à récupérer par rapport à la taille totale de la DB.

Questions connexes