Re: Index on a NULL-value

From: Bruno Wolff III <bruno(at)wolff(dot)to>
To: Tobias Brox <tobias(at)nordicbet(dot)com>
Cc: pgsql-performance(at)postgresql(dot)org
Subject: Re: Index on a NULL-value
Date: 2005-05-31 03:16:53
Message-ID: 20050531031653.GA17723@wolff.to
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-performance

On Tue, May 31, 2005 at 11:02:07 +0800,
Tobias Brox <tobias(at)nordicbet(dot)com> wrote:
> I read in the manual today:
>
> Indexes are not used for IS NULL clauses by default. The best way to use
> indexes in such cases is to create a partial index using an IS NULL
> predicate.
>
> This is from the documentation for PostgreSQL 8. I did not find anything
> equivalent in the 7.4.8-documentation.
>
> I wasn't aware of this until it became an issue :-) Well, so I follow the
> tip but in vain. Reduced and reproduced like this in PostgreSQL 7.4.7:
>
> test=# create table mock(a int, b int);
> CREATE TABLE
> test=# create index b_is_null on mock((b IS NULL));
> CREATE INDEX
> test=# insert into mock values (10,20);
> INSERT 70385040 1
> test=# insert into mock values (20,30);
> INSERT 70385041 1
> test=# insert into mock values (30, NULL);
> INSERT 70385042 1
> test=# set enable_seqscan=off;
> SET
> test=# explain select * from mock where b is NULL;
> QUERY PLAN
> --------------------------------------------------------------------
> Seq Scan on mock (cost=100000000.00..100000020.00 rows=6 width=8)
> Filter: (b IS NULL)
> (2 rows)
>
> vacuum analyze also didn't help to recognize the index ;-)

It isn't surprising that an index wasn't used since a sequential scan is
going to be faster in your test case.

If you want to test this out, you to want use realistically sized tables.

In response to

Responses

Browse pgsql-performance by date

  From Date Subject
Next Message Tobias Brox 2005-05-31 03:21:20 Re: Index on a NULL-value
Previous Message Tobias Brox 2005-05-31 03:02:07 Index on a NULL-value