[PATCH] Optimize IS DISTINCT FROM NULL => IS NOT NULL

Started by Marti Raudseppabout 14 years ago4 messageshackers
Jump to latest
#1Marti Raudsepp
marti@juffo.org

Hi list,

This patch enables a simple optimization in
eval_const_expressions_mutator. If we know that one argument to
DistinctExpr is NULL then we can optimize it to a NullTest, which can
be an indexable expression.

For example the query:
EXPLAIN (costs off) SELECT * FROM foo WHERE j IS NOT DISTINCT FROM NULL;

Old behavior:
Seq Scan on foo
Filter: (NOT (j IS DISTINCT FROM NULL::integer))

New behavior:
Index Scan using foo_j_idx on foo
Index Cond: (j IS NULL)

Regards,
Marti

Attachments:

distinct-to-nulltest.patchtext/x-patch; charset=US-ASCII; name=distinct-to-nulltest.patchDownload+37-3
#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Marti Raudsepp (#1)
Re: [PATCH] Optimize IS DISTINCT FROM NULL => IS NOT NULL

Marti Raudsepp <marti@juffo.org> writes:

This patch enables a simple optimization in
eval_const_expressions_mutator. If we know that one argument to
DistinctExpr is NULL then we can optimize it to a NullTest, which can
be an indexable expression.

Uh ... how much do we care about that? I can't say that I've heard many
people complain about the fact that IS [NOT] DISTINCT FROM is poorly
optimized -- which it is, in general, and this patch chips away at that
only a tiny bit, not enough to make it recommendable. If we really
wanted to make that a first-class operation we would need far more work
than this. Plus I don't see why anyone would write the specific case
"IS [NOT] DISTINCT FROM NULL" when they could write half as much.

regards, tom lane

#3Marti Raudsepp
marti@juffo.org
In reply to: Tom Lane (#2)
Re: [PATCH] Optimize IS DISTINCT FROM NULL => IS NOT NULL

On Thu, Mar 8, 2012 at 19:35, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Uh ... how much do we care about that?  I can't say that I've heard many
people complain about the fact that IS [NOT] DISTINCT FROM is poorly
optimized -- which it is, in general, and this patch chips away at that
only a tiny bit, not enough to make it recommendable.

Agreed, but it was very simple to code, so I figured why not.

Plus I don't see why anyone would write the specific case
"IS [NOT] DISTINCT FROM NULL" when they could write half as much.

Well I can see how it might be useful in generated queries, when
comparing a column to a parameter. If they're using IS DISTINCT FROM
then it's reasonable to expect that the parameter could be NULL
sometimes.

But I don't feel strongly about this, maybe it's not worth
complicating this big function further. :)

Regards,
Marti

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Marti Raudsepp (#3)
Re: [PATCH] Optimize IS DISTINCT FROM NULL => IS NOT NULL

Marti Raudsepp <marti@juffo.org> writes:

But I don't feel strongly about this, maybe it's not worth
complicating this big function further. :)

Yeah, that was kind of what I felt about it. If this patch were part of
a grand plan to make IS DISTINCT FROM smarter, that would be one thing.
But if we were to embark on that, likely as not it would involve a
redesign that would invalidate this code anyway. So I'd just as soon
keep it simple for now.

regards, tom lane