Ich habe eine Tabelle mit ca. 5 Millionen Zeilen, die eine fk-Einschränkung auf den Primärschlüssel einer anderen Tabelle (auch ca. 5 Millionen Zeilen) hat.PostgreSQL - Einschränkungen deaktivieren
Ich brauche etwa 75000 Zeilen aus beiden Tabellen zu löschen. Ich weiß, wenn ich versuche, dies mit der fk-Einschränkung zu tun, wird es eine unannehmbare Menge an Zeit benötigen.
Ausgehend von einem Oracle-Hintergrund war mein erster Gedanke, die Einschränkung zu deaktivieren, tun Sie das Löschen & dann wieder aktivieren die Einschränkung. PostGres scheint, um Constraint-Trigger zu deaktivieren, wenn ich ein Super-Benutzer bin (ich bin nicht, aber ich logge mich als der Benutzer ein, der die Objekte besitzt/erstellt), aber das scheint nicht ganz das zu sein, was ich möchte.
Die andere Option besteht darin, die Einschränkung zu löschen und sie dann erneut zu aktivieren. Ich bin besorgt, dass die Wiederherstellung der Einschränkung angesichts der Größe meiner Tabellen ewig dauern wird.
Irgendwelche Gedanken?
bearbeiten: nach Billys Ermutigung habe ich versucht, das Löschen ohne Änderung irgendwelcher Einschränkungen und es dauert mehr als 10 Minuten. Ich habe jedoch festgestellt, dass die Tabelle, aus der ich versuche zu löschen, einen selbstreferentiellen Fremdschlüssel ... dupliziert (& nicht indiziert).
Endgültiges Update - Ich habe den selbstreferenziellen Fremdschlüssel gelöscht, habe ihn gelöscht und wieder hinzugefügt. Billy hat rundum Recht, aber leider kann ich seinen Kommentar nicht als Antwort akzeptieren!
Wenn es so lange dauert, sogar mit 5 Millionen Zeilen, dann ist etwas falsch eingestellt Sie haben. –
Was? Das Löschen oder erneute Aktivieren der Einschränkung? Und ja, es ist durchaus möglich, dass etwas falsch oder in einer weniger als optimierten Weise eingerichtet ist - die Datenbank wurde durch den Winterschlaf ziemlich "gebaut" (ich hatte damit nichts zu tun). – azp74
Das Löschen. FK-Prüfungen von indizierten Tabellen benötigen lineare Zeit und entfernen 75000 + 75000 Zeilen = 150 000 Zeilen. Betrachten Sie einen Worst-Case-Vergleich mit 19 Vergleichen pro FK-Prüfung (Binärsuche, lg (5 Millionen) == 19) und vielleicht 20 Maschinenvergleiche pro Zeilenvergleich, was 57 000 000 Vergleichen entspricht. Wenn man eine konservative Schätzung der durchschnittlichen Maschine in Betracht zieht, die in der Lage ist, eine Milliarde Vergleiche pro Sekunde zu machen, sollte dies immer noch weniger als eine Sekunde CPU-Zeit in Anspruch nehmen. Laden von der Festplatte sollte auch kein großes Problem sein, denn selbst bei 5 Millionen Zeilen sollte die Tabelle in RAM passen. –