Re: Forcing query to use an index - Mailing list pgsql-sql

From Greg Stark
Subject Re: Forcing query to use an index
Date
Msg-id 87r89mki4w.fsf@stark.dyndns.tv
Whole thread Raw
In response to Re: Forcing query to use an index  (Jean-Luc Lachance <jllachan@nsd.ca>)
Responses Re: Forcing query to use an index
List pgsql-sql
Jean-Luc Lachance <jllachan@nsd.ca> writes:

> I beg to differ.
> 
> A NULL field means not set.

The best description for what NULL means is "unknown".

> Having to use work around because the database does not index null is
> one thing, but making it a general rule is not.

My natural inclination is to use exactly the representation he used. 
I've done so numerous times in the past. But using NULL sort of means "we
don't know when this account might have been deactivated" which is why it
leads to all these awkward OR clauses in his queries.

I admit using 9999-01-01 as a date gives me the willies. But it does match
with the way the field is used and it produces nice clean index range lookups.

> Having NULL indexed would also speed up things when "is null" is part af
> the query.

No, it wouldn't. Not in his query. His query had "disabled IS NULL OR disabled < ?"
Even if "IS NULL" was indexable this still wouldn't be an indexable clause.

Another option would be to use a functional index. 

create function disabled_as_of(timestamp with time zone) as'select coalesce($1,''9999-01-01'')' language sql immutable

Then index disabled_as_of(disabled) and access it with"disabled_as_of(disabled) > current_time"

(or perhaps it would be clearer as "NOT disabled_as_of(disabled) < current_time")

Of course all this is just extra busywork to keep the ugly data representation
out of the data model and hidden in the functional index. And it's not really
very well hidden either.

-- 
greg



pgsql-sql by date:

Previous
From: Dan Langille
Date:
Subject: Re: Sorting by NULL values
Next
From: Tomasz Myrta
Date:
Subject: Re: Sorting by NULL values