J'ai récemment trouvé et corrigé un bug dans un site j'ai été travailler sur, qui a entraîné des millions de doublons de lignes de données dans un tableau qui sera assez grande, même sans eux (toujours en millions de dollars). Je peux facilement trouver ces lignes en double et vous pouvez exécuter une seule requête suppression de tous les tuer. Le problème est que d'essayer de supprimer ce nombre de lignes d'un seul coup verrouille en place de la table pour un long temps, que je voudrais éviter si possible. La seule façon que je peux voir pour se débarrasser de ces lignes, sans prise de site (par blocage de la table) sont:
- Écrire un script qui va exécuter des milliers de petites supprimer des requêtes dans une boucle. Ce sera théoriquement obtenir autour de la table verrouillée question parce que d'autres requêtes seront en mesure de le faire dans la file d'attente et de fonctionner entre les supprime. Mais il reste toujours le pic de la charge sur la base de données tout à fait un peu et prendre du temps pour s'exécuter.
- Renommer la table et de recréer la table existante (il va maintenant être vide). Puis faire mon nettoyage de la table renommée. Renommez la nouvelle table, nom de l'ancien arrière et fusionner les nouvelles lignes dans la table renommée. C'est la façon dont prend beaucoup plus d'étapes, mais devrait faire le travail avec un minimum d'interruption. La seule partie délicate est que la table en question est un tableau, donc une fois qu'il est renommé hors de la voie et le vide que l'on a mis à sa place tous les historiques des rapports d'aller loin jusqu'à ce que je l'ai remis en place. Plus le processus de fusion peut être un peu de douleur, car le type de données stockées. En général, c'est mon choix maintenant.
Je me demandais juste si quelqu'un d'autre a eu ce problème avant et, si oui, comment vous avez fait affaire avec lui sans prendre le site et, espérons-le, avec un minimum si une interruption pour les utilisateurs? Si je vais avec le numéro 2, ou d'un autre, similaire, l'approche, je peux programmer des trucs pour fonctionner tard dans la nuit et faire la fusion tôt le lendemain matin et de laisser les utilisateurs savent à l'avance, ce qui n'est pas une affaire énorme. Je suis à la recherche pour voir si quelqu'un a des idées pour un meilleur, ou le plus simple, pour faire le nettoyage.