Skip site navigation (1) Skip section navigation (2)

Re: Recreate primary key without dropping foreign keys?

From: amador alvarez <aalvarez(at)d2(dot)com>
To: pgsql-admin(at)postgresql(dot)org
Subject: Re: Recreate primary key without dropping foreign keys?
Date: 2012-04-17 01:02:18
Message-ID: 4F8CC11A.5020003@d2.com (view raw or flat)
Thread:
Lists: pgsql-adminpgsql-general
How about deferring the FK's while recreating the PK ?
or using a temporary parallel table to be pointed by the other tables 
(FK) and swap it up on the recreation.

Cheers,
A.A

On 04/16/2012 06:54 AM, Chris Ernst wrote:
> On 04/16/2012 02:39 AM, Frank Lanitz wrote:
>> Am 16.04.2012 10:32, schrieb Chris Ernst:
>>> On 04/15/2012 10:57 PM, Frank Lanitz wrote:
>>>> On Sun, 15 Apr 2012 18:41:05 -0600 Chris Ernst<cernst(at)zvelo(dot)com>
>>>> wrote:
>>>>
>>>>> Hi all,
>>>>>
>>>>> In PostgreSQL 9.1.3, I have a few fairly large tables with
>>>>> bloated primary key indexes.  I'm trying to replace them using
>>>>> newly created unique indexes as outlined in the docs.  Something
>>>>> like:
>>>>>
>>>>> CREATE UNIQUE INDEX CONCURRENTLY dist_id_temp_idx ON
>>>>> distributors (dist_id); ALTER TABLE distributors DROP CONSTRAINT
>>>>> distributors_pkey, ADD CONSTRAINT distributors_pkey PRIMARY KEY
>>>>> USING INDEX dist_id_temp_idx;
>>>>>
>>>>> However, the initial drop of the primary key constraint fails
>>>>> because there are a whole bunch of foreign keys depending on it.
>>>>>
>>>>> I've done some searching and haven't found a workable solution.
>>>>> Is there any way to swap in the new index for the primary key
>>>>> constraint without dropping all dependent foreign keys?  Or am I
>>>>> pretty much stuck with dropping and recreating all of the foreign
>>>>> keys?
>>>> REINDEX is not working here?
>>> Hi Frank,
>>>
>>> Thanks, but REINDEX is not an option as it would take an exclusive
>>> lock on the table for several hours.
>> Well, from my little view I guess all rebuilding index action would
>> require such, as its the primary key with uniqueness. I'd think of a
>> complete reinit of the cluster with pg_dump and restoring, but this
>> would also need a downtime at least for write access.
>>
>> Why is the index so bloated?
> As in my original post, you can create a unique index concurrently and
> then replace the primary key index with it.  This way, the index
> creation doesn't require an exclusive lock.  You only need a very brief
> exclusive lock to drop and recreate the primary key constraint using the
> new index.
>
> However, the index creation is not the issue here.  That part is done.
> The issue is that there are several foreign keys depending on the
> primary key index that I want to drop and replace with the newly built
> unique index.  I would prefer not to drop and recreate all of the
> foreign keys as that would require many hours of down time as well (the
> very situation I was trying to avoid by building the index concurrently
> and swapping it in).
>
> I believe the index bloat is due to a combination of under aggressive
> autovacuum settings and recently deleting about 30% of the table.
>
> 	- Chris
>

In response to

Responses

pgsql-admin by date

Next:From: Chris ErnstDate: 2012-04-17 02:55:17
Subject: Re: Recreate primary key without dropping foreign keys?
Previous:From: ЇЯЅHAÐDate: 2012-04-16 23:27:38
Subject: Unending DB migration

pgsql-general by date

Next:From: Stephen ReesDate: 2012-04-17 02:38:07
Subject: Advisory Locks and Prepared Transactions
Previous:From: Merlin MoncureDate: 2012-04-16 19:26:50
Subject: Re: The scope of extensions

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group