I complained about how:
> The query is

> SELECT p1.opcname, p1.opcfamily
> FROM pg_opclass AS p1
> WHERE NOT EXISTS(SELECT 1 FROM pg_amop AS p2
>                  WHERE p2.amopfamily = p1.opcfamily
>                    AND binary_coercible(p1.opcintype, p2.amoplefttype));

> and investigation showed that the plan changed from (8.2 and before)

>  Seq Scan on pg_opclass p1  (cost=0.00..393.94 rows=51 width=68)
>    Filter: (NOT (subplan))
>    SubPlan
>      ->  Seq Scan on pg_amop p2  (cost=0.00..7.66 rows=2 width=0)
>            Filter: ((amopfamily = $0) AND binary_coercible($1, amoplefttype))

> to

>  Seq Scan on pg_opclass p1  (cost=0.00..393.94 rows=51 width=68)
>    Filter: (NOT (subplan))
>    SubPlan
>      ->  Seq Scan on pg_amop p2  (cost=0.00..7.66 rows=2 width=0)
>            Filter: (binary_coercible($1, amoplefttype) AND (amopfamily = $0))

Now that some function-cost smarts are in there, I expected to see the
plan go back to the first case, but what I actually see in CVS HEAD is

 Seq Scan on pg_opclass p1  (cost=0.00..660.35 rows=51 width=68)
   Filter: (NOT (subplan))
   SubPlan
     ->  Bitmap Heap Scan on pg_amop p2  (cost=4.29..8.60 rows=2 width=0)
           Recheck Cond: (amopfamily = $0)
           Filter: binary_coercible($1, amoplefttype)
           ->  Bitmap Index Scan on pg_amop_fam_strat_index  (cost=0.00..4.29 
rows=5 width=0)
                 Index Cond: (amopfamily = $0)

The reason this happens is that cost_qual_eval charges the entire cost of
evaluating all the arms of an AND, even though we'll drop out as soon as
something returns FALSE; and so the planner is led to avoid the seqscan
because it now appears to have a high filter-condition evaluation cost,
in favor of a plan that will evaluate the filter condition many fewer
times.  In reality those two plans will call binary_coercible() exactly
the same number of times, and so this is a bogus reason to switch.

I'm kind of inclined to leave it alone though, because the second plan
seems a bit more "failsafe".  To do anything differently, we'd have to
order the qual conditions the way we expect to execute them before
any use of cost_qual_eval, which sounds expensive; and as noted in
an upthread discussion with Greg, relying on the correctness of *both*
cost and selectivity estimates seems a tad fragile.

Comments?

                        regards, tom lane

---------------------------(end of broadcast)---------------------------
TIP 4: Have you searched our list archives?

               http://archives.postgresql.org

Reply via email to