Ich habe kürzlich einen Fehler in einer Site gefunden und behoben, an dem ich gearbeitet habe, der zu Millionen doppelter Datenzeilen in einer Tabelle führte, die auch ohne sie ziemlich groß sein wird (immer noch in Millionenhöhe). Ich kann diese doppelten Zeilen leicht finden und eine einzelne Löschabfrage ausführen, um sie alle zu töten. Das Problem ist, dass der Versuch, so viele Zeilen auf einmal zu löschen, die Tabelle für eine lange Zeit sperrt, was ich nach Möglichkeit vermeiden möchte. Die einzigen Möglichkeiten, die ich sehen kann, um diese Zeilen zu entfernen, ohne die Site zu entfernen (indem die Tabelle gesperrt wird), sind:
- Schreiben Sie ein Skript, das Tausende kleinerer Löschabfragen in einer Schleife ausführt. Dies umgeht theoretisch das Problem mit gesperrten Tabellen, da andere Abfragen in die Warteschlange gelangen und zwischen den Löschvorgängen ausgeführt werden können. Die Datenbank wird jedoch immer noch stark belastet, und die Ausführung wird lange dauern.
- Benennen Sie die Tabelle um und erstellen Sie die vorhandene Tabelle neu (sie ist jetzt leer). Führen Sie dann meine Bereinigung für die umbenannte Tabelle durch. Benennen Sie die neue Tabelle um, benennen Sie die alte zurück und führen Sie die neuen Zeilen in der umbenannten Tabelle zusammen. Dies erfordert wesentlich mehr Schritte, sollte aber die Arbeit mit minimaler Unterbrechung erledigen. Der einzige schwierige Teil hier ist, dass es sich bei der fraglichen Tabelle um eine Berichtstabelle handelt. Sobald sie aus dem Weg umbenannt und die leere an ihre Stelle gesetzt wurde, verschwinden alle historischen Berichte, bis ich sie wieder einrichte. Außerdem kann der Zusammenführungsprozess aufgrund der Art der gespeicherten Daten etwas schmerzhaft sein. Insgesamt ist dies momentan meine wahrscheinliche Wahl.
Ich habe mich nur gefragt, ob jemand anderes dieses Problem schon einmal hatte und wenn ja, wie Sie damit umgegangen sind, ohne die Website herunterzufahren und hoffentlich mit minimalen oder gar keinen Unterbrechungen für die Benutzer? Wenn ich mich für Nummer 2 oder einen anderen, ähnlichen Ansatz entscheide, kann ich festlegen, dass das Material spät in der Nacht ausgeführt wird und die Zusammenführung am nächsten Morgen früh durchgeführt wird. Lassen Sie die Benutzer dies einfach im Voraus wissen, sodass dies keine große Sache ist. Ich bin nur auf der Suche nach Ideen für eine bessere oder einfachere Art der Bereinigung.