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
Répondre
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()
Pourrait être assez méchant en termes de serrures si. –
@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. –
La suppression de suppressions par lots pourrait être meilleure pour la simultanéité. –
En plus de la bonne réponse d'Adam Robinson: Lorsque vous effectuez cette type d'opération:
- exécuter une requête SELECT avec la Supprimons clause WHERE pour vous assurer que vous obtenez « les bonnes données »
- Faites une sauvegarde complète
- Exécuter la chose en « off » heures afin de ne pas affecter les utilisateurs trop
Je l'ai vu dba faire dans quelques entreprises différentes et il semble toujours utiliser la format suivant:
- sauvegarde la table
- Supprimez toutes les index
- Sélectionnez les lignes que vous souhaitez conserver dans une table temporaire
- Trun certi la table originale
- Insérer (dans votre table source) de votre table temporaire
- 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.
- 1. Requête pour supprimer des enregistrements
- 2. SQL pour supprimer les enregistrements les plus anciens d'une table
- 3. Requête SQL - Supprimer les doublons si plus de 3 tours?
- 4. supprimer des enregistrements de 2 tables
- 5. Supprimer les enregistrements avec SQL
- 6. Processus stocké pour supprimer des enregistrements de plus de N jours
- 7. SQL Server: comment utiliser Cursor pour supprimer des enregistrements
- 8. requête SQL obtenir des enregistrements distincts
- 9. Requête SQL avec des enregistrements en double
- 10. Requête SQL pour supprimer les enregistrements se produisant dans les 3000 millisecondes les uns des autres
- 11. requête SQL pour compter les enregistrements
- 12. Requête SQL pour dupliquer des enregistrements basés sur l'instruction If
- 13. Requête MySQL pour obtenir deux enregistrements les plus récents avant un DateTime donné
- 14. enregistrements Supprimer de plusieurs tables
- 15. sql requête de deux tables
- 16. requête SQL Pour supprimer les lignes
- 17. supprimer de deux tables dans une requête
- 18. SQL: supprimer des enregistrements avec des clés étrangères invalides
- 19. Supprimer les enregistrements expirés dans la syntaxe de requête solr
- 20. Suppression de plusieurs enregistrements de deux tables
- 21. comment supprimer des enregistrements de l'accès ms dans vb.net
- 22. Supprimer les enregistrements de serveur SQL sans réindexer
- 23. Requête Linq pour obtenir des enregistrements Enfant
- 24. Supprimer des enregistrements dupliqués à partir de deux bases de données
- 25. requête SQL pour obtenir des colonnes et des enregistrements de cette colonne en utilisant comme opérateur
- 26. comment supprimer les enregistrements répétés des résultats linq à sql
- 27. Monétiser des applications iPhone pour un développeur de 16 ans?
- 28. ASP.Net HttpCookie expiration définie à deux ans
- 29. Créer une requête SQL pour récupérer les enregistrements les plus récents
- 30. Requête SQL pour joindre deux tables en fonction de l'horodatage le plus proche
Quel RDBMS? Combien d'enregistrements de plus de 2 ans?Combien d'enregistrements de moins de 2 ans? –
Existe-t-il un ensemble commun de champs "créés" ou "mis à jour" sur chaque table? –
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. –