Sorry for the forward, for those who read both, but I've forgotten whether
Tom reads [SQL], but I think this one's an actual planner/optimizer
problem/difference between 6.5.3 and 7.0. I've snipped Jason's
demonstration that on 6.5.3 he got an index scan, using the subselect.

Ross

----- Forwarded message from "Ross J. Reedstrom" <reedstrm@ece.rice.edu> -----
On Wed, May 03, 2000 at 11:54:37AM -0700, Jason Earl wrote:
> I am currently working on migrating an application
> from PostgreSQL 6.5.3 to 7.0 and I just noticed that
> one of my favorite queries no longer works as I would
> hope. 
> 

Any actual timings? I presume the index scan is slower,
since the subselect is just returning a constant, but
you don't mention if it's significantly slower.

> explain select * from caseweights1 where dt > (select
> 'now'::datetime - '15 mins'::interval);
> NOTICE:  QUERY PLAN:
> 
> Seq Scan on caseweights1  (cost=0.00..136204.66
> rows=2228391 width=28)
>   InitPlan
>     ->  Result  (cost=0.00..0.00 rows=0 width=0)
> 
> EXPLAIN

Hmm, looks to me like the planner is estimating that something like 2
million of the 7 million rows are going to be returned. It'd be reasonable
to do the sequential scan, then, since it'd probably be faster than
going to the index, as well.


> 
> As you can guess this query takes a _long_ time.  I
> have tried replacing 'now'::datetime with
> 'now'::timestamp (that's what the dt column is now)
> and I have also used the now() function.  Both of
> these queries give me similar query plans.
> 
> However, if I supply a timestamp it uses the index
> like I would expect it to:
> 
> explain select * from caseweights1 where dt > 'Wed May
> 03 12:12:11 2000 MDT';
> NOTICE:  QUERY PLAN:
> 
> Index Scan using caseweights1_dt_idx on caseweights1 
> (cost=0.00..25041.89 rows=6685 width=28)
> 
> EXPLAIN

Now, it looks like the planner is expecting only ~7K rows, so it goes
with the index. I can't get this to replicate here, since I've only got
140 values in my test table.

I presume you've run VACUUM ANALYZE recently? If so, it's a matter of
the planner realizing that the RESULT from the subselect is a timestamp
constant, and so should use the same estimator as a literal constant. The
man for this job is Tom Lane. Any ideas, Tom?

Ross
-- 
Ross J. Reedstrom, Ph.D., <reedstrm@rice.edu> 
NSBRI Research Scientist/Programmer
Computer and Information Technology Institute
Rice University, 6100 S. Main St.,  Houston, TX 77005

----- End forwarded message -----

Wed, 3 May 2000 15:33:40 -0500
"Ross J. Reedstrom" <reedstrm@wallace.ece.rice.edu>
[reedstrm@ece.rice.edu: Re: [SQL] Query problems with 7.0 beta 5]