Thread: Simple Optimization Problem

Simple Optimization Problem

From
secret
Date:
    I need to run a report using some parameters that are optional, I'm
doing this by labeling "0" as the optional value.  IE here is a
simplified example:

CREATE TABLE po (po_id int4 PRIMARY KEY, data text);
    (insert a bunch of rows)

ftc=> explain select * from po where po_id=8888;
NOTICE:  QUERY PLAN:

Index Scan using ipo_poid_units on po  (cost=2.05 size=1 width=94)

EXPLAIN

ftc=> explain select * from po where (po_id=8888 or 0=8888);
NOTICE:  QUERY PLAN:

Seq Scan on po  (cost=449.96 size=1751 width=94)

EXPLAIN

    I was hoping PostgreSQL could optimize out the boolean condition
given in the where clause, but it causes it to disregard the index
instead of throwing out 0=8888 in the first stage.

    This is the only way I can think to do this, I have crystal reports
send through the SQL instead of doing the whole thing itself(Which
involves returning all possible rows... Sigh)... This query is taking 20
minutes as a result... Is there any hope in 6.5 of the optimizer
handling this better?

David Secret
MIS Director
Kearney Development Co., Inc.


Re: [SQL] Simple Optimization Problem

From
Bruce Momjian
Date:
I have added this to our TODO list as:
process const=const parts of OR clause first 


>     I need to run a report using some parameters that are optional, I'm
> doing this by labeling "0" as the optional value.  IE here is a
> simplified example:
> 
> CREATE TABLE po (po_id int4 PRIMARY KEY, data text);
>     (insert a bunch of rows)
> 
> ftc=> explain select * from po where po_id=8888;
> NOTICE:  QUERY PLAN:
> 
> Index Scan using ipo_poid_units on po  (cost=2.05 size=1 width=94)
> 
> EXPLAIN
> 
> ftc=> explain select * from po where (po_id=8888 or 0=8888);
> NOTICE:  QUERY PLAN:
> 
> Seq Scan on po  (cost=449.96 size=1751 width=94)
> 
> EXPLAIN
> 
>     I was hoping PostgreSQL could optimize out the boolean condition
> given in the where clause, but it causes it to disregard the index
> instead of throwing out 0=8888 in the first stage.
> 
>     This is the only way I can think to do this, I have crystal reports
> send through the SQL instead of doing the whole thing itself(Which
> involves returning all possible rows... Sigh)... This query is taking 20
> minutes as a result... Is there any hope in 6.5 of the optimizer
> handling this better?
> 
> David Secret
> MIS Director
> Kearney Development Co., Inc.
> 
> 
> 


--  Bruce Momjian                        |  http://www.op.net/~candle maillist@candle.pha.pa.us            |  (610)
853-3000+  If your life is a hard drive,     |  830 Blythe Avenue +  Christ can be your backup.        |  Drexel Hill,
Pennsylvania19026
 


Re: [SQL] Simple Optimization Problem

From
Tom Lane
Date:
Bruce Momjian <maillist@candle.pha.pa.us> writes:
> I have added this to our TODO list as:
>     process const=const parts of OR clause first 

I think that would be quite the wrong way to approach it.  What we
need is a general-purpose rewriter phase that tries to evaluate
constant subexpressions, and is applied after the rest of rewrite
but before planner/optimizer.  In this case
select * from po where (po_id=8888 or 0=8888);

would be reduced to
select * from po where (po_id=8888 or FALSE);

and then
select * from po where (po_id=8888);

which the optimizer knows what to do with.  (cnfify() does some of this
but not enough.)

>> Is there any hope in 6.5 of the optimizer
>> handling this better?

Not for 6.5.  6.6 or 6.7 maybe...
        regards, tom lane