Re: Indexing Foreign Key Columns

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Josh Trutwin <josh(at)trutwins(dot)homeip(dot)net>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: Indexing Foreign Key Columns
Date: 2007-08-28 17:19:32
Message-ID: 29302.1188321572@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Josh Trutwin <josh(at)trutwins(dot)homeip(dot)net> writes:
> I am curious if there are any rules of thumb for when to index a
> foreign key column?

(You realize of course that there's already an index on the referenced
column, else you wouldn't have been allowed to reference it.)

You need an index on the referencing column unless the referenced table
is pretty static: DELETEs in the referenced table will be real slow
without it, and also UPDATEs that change the referenced column. However
there are applications where this never happens, or so infrequently that
it's not worth paying to maintain an extra index on the referencing
table.

As far as actual joins go, the only case where an index on the
referencing column is likely to be tremendously useful is where you are
selecting a small number of rows using a constraint on the *referenced*
table. For instance

select ... from pktable left join fktable on (pkcol = fkcol)
where pktable.somecol = something

In this situation a sensible plan is a nestloop with the pktable on the
outside (perhaps searched via an index on somecol) and then using an
index on fkcol to probe into fktable for matches.

If you don't do anything like that, and you don't change or delete pk
keys, then you probably don't need an index.

regards, tom lane

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Tom Lane 2007-08-28 17:40:32 Re: Can this function be declared IMMUTABLE?
Previous Message Tom Lane 2007-08-28 17:07:51 Re: INSERT doc discrepancy