Re: Date Parameter To Query Confusing Optimizer

Поиск
Список
Период
Сортировка
От Radosław Smogura
Тема Re: Date Parameter To Query Confusing Optimizer
Дата
Msg-id 6bd9af922df7283e4a7e5f2ebe1b6ccb@softperience.pl
обсуждение исходный текст
Ответ на Re: Date Parameter To Query Confusing Optimizer  ("Kurt Westerfeld" <kwesterfeld@novell.com>)
Ответы Re: Date Parameter To Query Confusing Optimizer
Список pgsql-general
 Can You try "...BETWEEN ?::date and ?::date ..." syntax or send
 statement causing problems?

 Kind regards,
 Radosław Smogura

 On Tue, 04 Jan 2011 07:27:42 -0700, "Kurt Westerfeld"
 <kwesterfeld@novell.com> wrote:
> "By the very definition of a prepared statement the query plan gets
> stored before the parameter values are known"
>
> Is this true for all databases? It would seem to me that this
> approach would always lead to the wrong query plan, especially in the
> case I am testing where the selectivity is very low for the BETWEEN
> clause I am using. The trouble is, the BETWEEN clause can also yield
> a
> highly selective result--which is basically the case as the database
> "ages". See, the date/timestamp column in this case is a good choice
> as it is a database activity table, a temporal database. The trouble
> is at times there is a huge amount of activity, yielding very low
> selectivity.
>
> Maybe it would be best for me to just disable the indices on the
> timestamp fields and just use/expect my join would yield the best
> results.
>
> But, back on topic, to me it seems wrong that choice of prepared vs.
> non-prepared, and protocol 2 vs. 3, would influence the optimizer so
> profoundly. I would think it's got to be something I can tune, that
> prepared statement parameters be considered for execution plan. Is
> there such a setting?
>
>>>> Alban Hertroys  1/4/2011 2:21 AM >>>
> 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:1213,4d22ca9211544532215324!


В списке pgsql-general по дате отправления:

Предыдущее
От: "Kurt Westerfeld"
Дата:
Сообщение: Re: Date Parameter To Query Confusing Optimizer
Следующее
От: asti1987
Дата:
Сообщение: Warning: database postgres must be vacuumed within 1000000 transactions