From: Bill Moran <wmoran@collaborativefusion.com>
To: Jeff Davis <pgsql@j-davis.com>
Cc: adrobj <adrobj@yahoo.com>
Cc: pgsql-performance@postgresql.org
Subject: Re: Clustered/covering indexes (or lack thereof :-)
Date: Fri, 16 Nov 2007 14:51:35 -0500
Message-ID: <20071116145135.af61f4b1.wmoran@collaborativefusion.com> (raw)
In-Reply-To: <1195241676.22428.218.camel@dogma.ljc.laika.com>
References: <13700848.post@talk.nabble.com>
<1195241676.22428.218.camel@dogma.ljc.laika.com>
In response to Jeff Davis <pgsql@j-davis.com>:
> On Sun, 2007-11-11 at 22:59 -0800, adrobj wrote:
> > This is probably a FAQ, but I can't find a good answer...
> >
> > So - are there common techniques to compensate for the lack of
> > clustered/covering indexes in PostgreSQL? To be more specific - here is my
> > table (simplified):
> >
> > topic_id int
> > post_id int
> > post_text varchar(1024)
> >
> > The most used query is: SELECT post_id, post_text FROM Posts WHERE
> > topic_id=XXX. Normally I would have created a clustered index on topic_id,
> > and the whole query would take ~1 disk seek.
> >
> > What would be the common way to handle this in PostgreSQL, provided that I
> > can't afford 1 disk seek per record returned?
> >
>
> Periodically CLUSTER the table on the topic_id index. The table will not
> be perfectly clustered at all times, but it will be close enough that it
> won't make much difference.
>
> There's still the hit of performing a CLUSTER, however.
>
> Another option, if you have a relatively small number of topic_ids, is
> to break it into separate tables, one for each topic_id.
Or materialize the data, if performance is the utmost requirement.
Create second table:
materialized_topics (
topic_id int,
post_ids int[],
post_texts text[]
)
Now add a trigger to your original table that updates materialized_topics
any time the first table is altered. Thus you always have fast lookups.
Of course, this may be non-optimal if that table sees a lot of updates.
--
Bill Moran
Collaborative Fusion Inc.
http://people.collaborativefusion.com/~wmoran/
wmoran@collaborativefusion.com
Phone: 412-422-3463x4023
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-performance@postgresql.org
Cc: wmoran@collaborativefusion.com, pgsql@j-davis.com, adrobj@yahoo.com
Subject: Re: Clustered/covering indexes (or lack thereof :-)
In-Reply-To: <20071116145135.af61f4b1.wmoran@collaborativefusion.com>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox