28 Stimmen

Wie kann ich Löschvorgänge in einer großen Datenbanktabelle beschleunigen?

Hier ist das Problem, das ich zu lösen versuche: Ich habe kürzlich eine Neugestaltung der Datenschicht abgeschlossen, die es mir ermöglicht, meine Datenbank über mehrere Shards hinweg auszugleichen. Um die Shards im Gleichgewicht zu halten, muss ich in der Lage sein, Daten von einem Shard zu einem anderen zu migrieren. Dazu gehört das Kopieren von Shard A nach Shard B und das anschließende Löschen der Datensätze aus Shard A. Ich habe jedoch mehrere Tabellen, die sehr groß sind und auf die viele Fremdschlüssel verweisen, sodass das Löschen eines einzigen Datensatzes aus der Tabelle mehr als eine Sekunde dauern kann.

In einigen Fällen muss ich Millionen von Datensätzen aus den Tabellen löschen, und das dauert einfach zu lange, um praktikabel zu sein.

Die Deaktivierung von Fremdschlüsseln ist keine Option. Das Löschen großer Mengen von Zeilen ist ebenfalls keine Option, da es sich um eine Produktionsanwendung handelt und große Löschvorgänge zu viele Ressourcen binden und zu Fehlern führen. Ich verwende Sql Server und kenne mich mit partitionierten Tabellen aus, aber die Beschränkungen für die Partitionierung (und die Lizenzgebühren für die Enterprise Edition) sind so unrealistisch, dass sie nicht möglich sind.

Als ich mit der Arbeit an diesem Problem begann, dachte ich, dass der schwierige Teil darin bestehen würde, den Algorithmus zu schreiben, der herausfindet, wie man Zeilen von der Blattebene bis zur obersten Ebene des Datenmodells löscht, so dass auf dem Weg dorthin keine Fremdschlüssel-Beschränkungen verletzt werden. Aber die Lösung dieses Problems hat mir nichts gebracht, da es Wochen dauert, Datensätze zu löschen, die über Nacht verschwinden müssen.

Ich habe bereits eine Möglichkeit eingebaut, Daten als virtuell gelöscht zu markieren, so dass die Daten aus Sicht der Anwendung verschwunden sind, aber ich habe immer noch mit großen Datendateien, großen Sicherungen und langsameren Abfragen aufgrund der schieren Größe der Tabellen zu kämpfen.

Irgendwelche Ideen? Ich habe bereits ältere Beiträge hier gelesen und nichts gefunden, was mir helfen würde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X