Re: BUG #18643: EXPLAIN estimated rows mismatch - Mailing list pgsql-bugs

From Tom Lane
Subject Re: BUG #18643: EXPLAIN estimated rows mismatch
Date
Msg-id 1860123.1727801026@sss.pgh.pa.us
Whole thread Raw
In response to BUG #18643: EXPLAIN estimated rows mismatch  (PG Bug reporting form <noreply@postgresql.org>)
Responses Re: BUG #18643: EXPLAIN estimated rows mismatch
List pgsql-bugs
PG Bug reporting form <noreply@postgresql.org> writes:
> Given predicate A and B, it is expected that size (SELECT X where A)  <=
> size (SELECT X WHERE A or B)  
> However, `EXPLAIN SELECT t2.c0 FROM t2 WHERE t2.c0 IN (t2.c0)` returns
> rows=2537

I don't see any particular bug here.  If you look closely at the
EXPLAIN output, you'll see that "t2.c0 IN (t2.c0)" is transformed
to "c0 IS NOT NULL" --- but only if it's at top level.  So we're
estimating selectivities for two quite different conditions in
this example.

The NOT NULL bit happens because a top-level equality clause
is transformed into an "EquivalenceClass", and then when we
notice the class has only one member, we prefer to spit out
"x IS NOT NULL" rather than "x = x".  That has the same effect
(at top level of WHERE, anyway) and tends to be estimated
more accurately.

In any case, in this toy example that lacks an ANALYZE step,
the selectivity estimates are mostly going to be garbage.

            regards, tom lane



pgsql-bugs by date:

Previous
From: PG Bug reporting form
Date:
Subject: BUG #18644: ALTER PUBLICATION ... SET (publish_via_partition_root) wrong/undocumented behavior.
Next
From: "David G. Johnston"
Date:
Subject: Re: Linux OOM killer