I have a table called "Account" that is a heavily used table, has 17 columns and has upwards of 300,000 rows. I am trying to create a new table, "NewTable", that has a foreign key constraint to "Account" table.
My CREATE TABLE statement looks like this:
CREATE TABLE "NewTable"
(
"column1" VARCHAR(100) NOT NULL,
"column2" INTEGER NOT NULL,
PRIMARY KEY("column1")
CONSTRAINT "SomeFK" FOREIGN KEY ("column2") REFERENCES "Account" ("ID")
)
The above statement executed for more than 25 minutes and didn't complete. We killed the transaction.
When we remove the foreign key constraint, it executes immediately.
Can someone let us know what is the problem? We initially thought it was locking the "Account" table for some reason, but when we looked at "pg_locks", we did not find any entry for "Account" - only an exclusive lock for "NewTable".
2 Answers 2
Your query got locked waiting for something - my bet is that it was waiting for some other transaction to finish.
When you're doing the create table, just issue (in another psql session):
select * from pg_locks where pid = XXX and not granted;
where xxx is pid of backend doing the create table.
This will show you what is the lock that the create table is waiting for.
-
Thank you so much. That revealed an exclusive lock on Account!!Shivasubramanian A– Shivasubramanian A2012年07月05日 05:16:43 +00:00Commented Jul 5, 2012 at 5:16
This is explained in this thread; http://www.postgresql.org/message-id/75218696-61be-4730-89f6-dd6058fa9eda@a28g2000prb.googlegroups.com
According to Tom Lane,
this create operation references Account table and PostgreSQL should add triggers to both tables. So if there is a long-running (probably idle) open transaction that's holding AccessShare lock on auth_user Postgres is blocked waiting for that xact to finish and release its lock. Everything else queues up behind the Create.
That PostgreSQL Mail thread is a good read.
column2
allowingNULL
s, is it still slow?