Postgres langsam ausführen Abfrage löschen
Haben wir eine Tabelle, die nur über 62k Zeilen. Wir laufen eine sehr einfache Abfrage löschen, das dauert 45 Minuten:
DELETE FROM myTable WHERE createdtime < '2017-03-07 05:00:00.000'
Dinge, die wir ausprobiert haben:
1 - hinzufügen eines index auf die timestamp-Spalte, die nicht helfen.
2 - Entfernt die Zeilen, die in Partien von 20 oder 50 mit einer Funktion, die war immer noch schrecklich langsam.
3 - ließ die foreign key-Einschränkungen verweisen auf diese Tabelle und Ihre eigenen primary key-Einschränkung, die nicht helfen, und reduziert die Zeit, um ein paar Sekunden aber wir können nicht sicher tun dies auf unsere Produktions-Datenbank wird die Sperre der Tabellen und verhindern, dass liest und schreibt, während die Transaktion ausgeführt wird.
Ich weigere mich zu glauben, dass es normal ist, dass diese Abfrage so lange dauern, um abzuschließen. Anregungen werden geschätzt.
Dropped all the foreign key constraints referencing this table
Diese FK ' s haben Indizes unterstützen Sie (auf der anderen Tabelle)?- Das, was er sagte. Offensichtlich ist die Zeit, die damit verbracht wird, sucht die FK-constraints
- Performance Fragen sollten ERKLÄREN, ANALYSIEREN und einige Informationen über die grösse der Tabellen -, index -, Strom-Zeit-performance, Wunsch, Zeit, etc. Langsam ist ein relativer Begriff, und wir brauchen einen realen Wert zu vergleichen. MySQL Lesen Sie Bitte Auch How-to-Fragen
- Ich kann nicht glauben, dass ich nicht denke, dass ich mich! Fügen Sie bitte als Antwort, damit kann ich markieren Sie es als gelöst, wie das Problem behoben werden. Danke!!!
Du musst angemeldet sein, um einen Kommentar abzugeben.
... Dropped all the foreign key constraints referencing this table
Stellen Sie sicher, diese FK ' s haben Indizes unterstützen Sie (auf der anderen Tabelle).
Wenn Sie Sie löschen, die (Kaskadierung) FK wird zu prüfen haben alle FK-Spalten aus anderen Tabellen beziehen sich auf diese Zeile.
-- Beispiel:
Nun, wenn eine
team
gelöscht wird, wird der FK-constraint wird zu prüfen haben, ob es irgendwelche Spieler, die sich auf dieseteam_id
. (und cascade appropiately)In diesem Fall, eine unterstützende index auf der FK helfen DBMS:
helfen ist ein bisschen zu schwach hier. Eine unterstützende index ist absolut notwendig für jeden nicht-trivialen Fall. (auch wenn der FK-constraint hat
ON UPDATE NO ACTION ON DELETE NO ACTION
als seine Aktion, so scheint es)team
Sie löschen. Und das lookup ist im wesentlichen mit einerselect * from player where team_id = ...
wenn kein index vorhanden ist, ist gehen zu müssen, einen Seq-Scan auf die player-Tabelle... I don't need a parachute, because I don't expect the plane to crash ...
player
Tabelle und das nimmt mich für immer. In dieser Hinsicht, wo erstelle ich einen index inteam
oder inplayer