Re: Partial indexes (was: Re: Indexing a boolean) - Mailing list pgsql-admin

From Nikolaus Dilger
Subject Re: Partial indexes (was: Re: Indexing a boolean)
Date
Msg-id 20030822154802.21151.h006.c001.wm@mail.dilger.cc.criticalpath.net
Whole thread Raw
In response to Partial indexes (was: Re: Indexing a boolean)  (Sam Barnett-Cormack <s.barnett-cormack@lancaster.ac.uk>)
List pgsql-admin
Tom's example shows that the query actually takes
longer using the index than without.  And that's not
surprising.  A btree index doesn't buy you much when
you have very low cardinality.  That's ideal for bitmap
indexes that PostgreSQL currently doesn't offer.

In the expample of the original question no index on
the boolean column is probably also better/faster.
Just try it.

What may help is a multicolum index.
So lets say you have the columns first_name, last_name,
gender.  Instead of creating one index for last_name
and one for gender.  Just create a multicolumn index on
last_name and gender.  Of course that assumes that you
have both columns in your WHERE clause combined with an
AND.

CREATE INDEX name_gender ON person (last_name, gender);

SELECT *
FROM person
WHERE last_name='Smith'
AND gender='male';

Regards,
Nikolaus

On Fri, 22 Aug 2003 10:34:39 -0400, Tom Lane wrote:

>
> "scott.marlowe" <scott.marlowe@ihs.com> writes:
> > Basically, for partial / functional indexes, the
> create index where clause
> > needs to exactly (or nearly so) match the select
> query's where clause:
>
> Another consideration is that an index declaration
like
> this:
>
>     create index fooi on foo (flag) where flag;
>
> is really rather redundant, since the entries will
only
> be made for rows
> where flag is true, and so storage of the column value
> in the index is
> useless.  You may be able to get more mileage out of
> the index by making
> the index on another column that you often test in
> conjunction with the
> flag.  For example:
>
> regression=# create table foo (flag bool, ts
timestamp);
> CREATE TABLE
> regression=# create index fooi on foo(ts) where flag;
> CREATE INDEX
> regression=# explain select * from foo where ts >
> '2003-10-11' and flag;
>                                    QUERY PLAN
>
--------------------------------------------------------------------------------
>  Seq Scan on foo  (cost=0.00..22.50 rows=167 width=9)
>    Filter: ((ts > '2003-10-11 00:00:00'::timestamp
> without time zone) AND flag)
> (2 rows)
>
> regression=# set enable_seqscan TO 0;
> SET
> regression=# explain select * from foo where ts >
> '2003-10-11' and flag;
>                                QUERY PLAN
>
-------------------------------------------------------------------------
>  Index Scan using fooi on foo  (cost=0.00..43.25
> rows=167 width=9)
>    Index Cond: (ts > '2003-10-11 00:00:00'::timestamp
> without time zone)
>    Filter: flag
> (3 rows)
>
> (In a more realistic situation, the planner would
> probably have chosen
> the indexscan without any prompting.)
>
>             regards, tom lane
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster

pgsql-admin by date:

Previous
From: Tom Lane
Date:
Subject: Re: Partial indexes (was: Re: Indexing a boolean)
Next
From: Renney Thomas
Date:
Subject: Re: Indexing a boolean