Postgres - Tabelle mit zu langsamer Fremdschlüsseleinschränkung erstellen


9

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".


Nur eine Idee: Wenn Sie das column2Zulassen von NULLs definieren , ist es immer noch langsam?
Dekso

Ist Account.ID indiziert? Ist NewTable.column2 indiziert?
Philᵀᴹ

@Phil - funktioniert FK ohne Index für fremde Spalten?
Dekso

@deszo, wenn column2 NULL ist, ist es immer noch langsam. Zumindest haben wir eine Minute gewartet, bevor wir es abgesagt haben.
Shivasubramanian A

@Phil, Account.ID ist der Primärschlüssel für Account, hat also bereits einen Index. NewTable.column2 ist noch nicht indiziert, zumindest wenn wir die Tabelle erstellen.
Shivasubramanian A

Antworten:


12

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):

select * from pg_locks where pid = XXX and not granted;

Dabei ist xxx die PID des Backends, das die Erstellungs-Tabelle ausführt.

Dies zeigt Ihnen, auf welche Sperre die Erstellungs-Tabelle wartet.


Ich danke dir sehr. Das ergab eine exklusive Sperre für das Konto !!
Shivasubramanian A

1

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.