On 3 Jan 2011, at 23:48, Kurt Westerfeld wrote:

> I have a JDBC-based application which passes date/time parameters using JDBC 
> query parameters, which is performing very badly (ie. doing full table 
> scans).  In an effort to try to narrow down the problem, I am taking the 
> query and running it in interactive SQL mode, but changing the date 
> parameters (which are BETWEEN ? and ? clauses) and placing a date literal 
> instead, using the "date '2011-01-01' syntax.  When I do this, the query runs 
> instantly, obviously using indices on the tables involved.
>  
> Now, I suspect the optimizer is taking the wrong path based on the usage of 
> query parameters.  I'm pretty surprised by this, because I would think the 
> optimizer would do the same thing for any query parameter, however it 
> arrived.  Unfortunately for this situation, the code which forms the query 

The problem here is that JDBC uses prepared statements for parameterised 
queries. By the very definition of a prepared statement the query plan gets 
stored before the parameter values are known, which forces the database to use 
a query plan that would work for every possible value of those parameters.

Thus you end up with a generic query plan.

This isn't often a problem, but if a significant number of your possible 
parameter values exist in a high percentage of your table rows, then chances 
are you'll end up with a plan with a sequential scan.

You didn't tell what version of Postgres you're using - I recall recent 
versions (since 8.3?) are smarter about this particular scenario.

Alban Hertroys

--
Screwing up is an excellent way to attach something to the ceiling.


!DSPAM:737,4d22ca9a11548321074132!



-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

Reply via email to