Ich habe eine Tabelle namens "Account", die häufig verwendet wird, 17 Spalten und mehr als 300.000 Zeilen enthält. Ich versuche, eine neue Tabelle "NewTable" zu erstellen, die eine Fremdschlüsseleinschränkung für die Tabelle "Account" aufweist.
Meine CREATE TABLE-Anweisung sieht folgendermaßen aus:
CREATE TABLE "NewTable"
(
"column1" VARCHAR(100) NOT NULL,
"column2" INTEGER NOT NULL,
PRIMARY KEY("column1")
CONSTRAINT "SomeFK" FOREIGN KEY ("column2") REFERENCES "Account" ("ID")
)
Die obige Anweisung wurde länger als 25 Minuten ausgeführt und nicht abgeschlossen. Wir haben die Transaktion abgebrochen.
Wenn wir die Fremdschlüsseleinschränkung entfernen, wird sie sofort ausgeführt.
Kann uns jemand mitteilen, wo das Problem liegt? Wir dachten anfangs, es würde aus irgendeinem Grund die Tabelle "Konto" sperren, aber als wir uns "pg_locks" anschauten, fanden wir keinen Eintrag für "Konto" - nur eine exklusive Sperre für "NewTable".
quelle
column2
Zulassen vonNULL
s definieren , ist es immer noch langsam?Antworten:
Ihre Anfrage wurde gesperrt und auf etwas gewartet. Ich wette, sie hat auf den Abschluss einer anderen Transaktion gewartet.
Wenn Sie die Tabelle erstellen, geben Sie einfach Folgendes aus (in einer anderen psql-Sitzung):
Dabei ist xxx die PID des Backends, das die Erstellungs-Tabelle ausführt.
Dies zeigt Ihnen, auf welche Sperre die Erstellungs-Tabelle wartet.
quelle
Dies wird in diesem Thread erklärt; http://www.postgresql.org/message-id/75218696-61be-4730-89f6-dd6058fa9eda@a28g2000prb.googlegroups.com
Laut Tom Lane
Diese Verarbeitungsoperationsreferenzen Account-Tabelle und PostgreSQL sollten Trigger zu beiden Tabellen hinzufügen. Wenn es also eine lange laufende (wahrscheinlich inaktive) offene Transaktion gibt, die die AccessShare-Sperre für auth_user hält, wird Postgres blockiert, bis dieser xact beendet ist und seine Sperre aufhebt. Alles andere steht hinter dem Erstellen an.
Dieser PostgreSQL Mail-Thread ist eine gute Lektüre.
quelle