Thread: IS NULL vs IS NOT NULL

IS NULL vs IS NOT NULL

From
"Vig, Sandor (G/FI-2)"
Date:
Hi,

Another "funny" thing: I have a query which runs
on (Linux) PostgreSQL 7.4.x under 10 sec. I tried
to run it on (Windows) PostgreSQL 8.0 yesterday.
It didn't finished at all! (I shoot it down after 10 minutes)
I made various tests and I figured out something interesting:
The same query with:
    A, "history.undo_action_id > 0" runs in 10 sec.
    B, "history.undo_action_id is not null" runs in 10 sec.
    C, "history.undo_action_id is null" runs forever (?!)
I used EXPLAIN but I couldn't figure out what the problem was.
In every explain output are 3 lines:
"                    ->  Index Scan using speed_3 on history  (.........)"
"                          Index Cond: (type_id = 6)"
"                          Filter: (undo_action_id IS NOT NULL)"
where "speed_3" is a btree index on history.type_id. There is also an index
for history.undo_action_id (btree) but it is not used.

The tables are well indexed, and have about 200.000 records.

The SQL file and the 3 scenarios are in attachment.

Help, anyone?

Vig Sándor

The information transmitted is intended only for the person or entity to
which it is addressed and may contain confidential and/or privileged
material. Any review, retransmission, dissemination or other use of, or
taking of any action in reliance upon, this information by persons or
entities other than the intended recipient is prohibited. If you received
this in error, please contact the sender and delete the material from any
computer.



Attachment

Re: IS NULL vs IS NOT NULL

From
Stephan Szabo
Date:
On Fri, 25 Feb 2005, Vig, Sandor (G/FI-2) wrote:

> Hi,
>
> Another "funny" thing: I have a query which runs
> on (Linux) PostgreSQL 7.4.x under 10 sec. I tried
> to run it on (Windows) PostgreSQL 8.0 yesterday.
> It didn't finished at all! (I shoot it down after 10 minutes)
> I made various tests and I figured out something interesting:
> The same query with:
>     A, "history.undo_action_id > 0" runs in 10 sec.
>     B, "history.undo_action_id is not null" runs in 10 sec.
>     C, "history.undo_action_id is null" runs forever (?!)
> I used EXPLAIN but I couldn't figure out what the problem was.

EXPLAIN ANALYZE would be more useful.  My first guess would be that the IS
NULL is returning many more than the estimated 1 row and as such a nested
loop is a bad plan.  How many history rows match type_id=6 and
undo_action_id is null?