Thread: Decrease time needed to CREATE INDEX and FOREIGN KEY on new tablecolumn which has all values NULL
Decrease time needed to CREATE INDEX and FOREIGN KEY on new tablecolumn which has all values NULL
Hello all,
I am trying to add a new column to a really big table and to define an INDEX and a FOREIGN KEY on that new column using the following instructions:
ALTER TABLE Employee ADD COLUMN DepartmentId INTEGER;
CREATE INDEX IDX_Employee_DepartmentId ON Employee(DepartmentId);
ALTER TABLE Employee ADD CONSTRAINT FK_Employee_Department FOREIGN KEY(DepartmentId) REFERENCES Department(DepartmentId);
The table is huge and it takes a lot of time to add the INDEX and the FOREIGN KEY although all values are NULL.
Considering that the new DepartmentId column is NULL for all rows at this point, is there a way to make the INDEX and FOREIGN KEY creation run faster?
See below information about the size of the table and also the size of its associated Primary Key and Indexes:
Employee 339 GB
Employee_PKEY 46 GB
IDX_Employee_JobId 46 GB
IDX_Employee_IsWFH 46 GB
Thank you,
Denisa Cîrstescu
Re: Decrease time needed to CREATE INDEX and FOREIGN KEY on new tablecolumn which has all values NULL
> The table is huge and it takes a lot of time to add the INDEX and the FOREIGN KEY although all values are NULL. > Considering that the new DepartmentId column is NULL for all rows at this point, is there a way to make the INDEX and FOREIGNKEY creation run faster? In your script to create index add this: set maintenance_work_mem = '1GB' or any other figure you feel comfortable.
Re: Decrease time needed to CREATE INDEX and FOREIGN KEY on newtable column which has all values NULL
On 2019-Jan-22, Denisa Cirstescu wrote: > I am trying to add a new column to a really big table and to define an INDEX and a FOREIGN KEY on that new column usingthe following instructions: > > ALTER TABLE Employee ADD COLUMN DepartmentId INTEGER; > CREATE INDEX IDX_Employee_DepartmentId ON Employee(DepartmentId); > ALTER TABLE Employee ADD CONSTRAINT FK_Employee_Department FOREIGN KEY(DepartmentId) REFERENCES Department(DepartmentId); > > The table is huge and it takes a lot of time to add the INDEX and the FOREIGN KEY although all values are NULL. > Considering that the new DepartmentId column is NULL for all rows at this point, is there a way to make the INDEX and FOREIGNKEY creation run faster? The typical advice is to run CREATE INDEX CONCURRENTLY instead of plain CREATE INDEX. Also, use "ADD CONSTRAINT ... NOT VALID;" instead, and later do another ALTER TABLE ... VALIDATE CONSTRAINT. That decreases the impact considerably in production scenarios. -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services