Re: performance drop when function argument is evaluated in WHERE clause

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: performance drop when function argument is evaluated in WHERE clause
Дата
Msg-id 23396.1396965001@sss.pgh.pa.us
обсуждение исходный текст
Ответ на performance drop when function argument is evaluated in WHERE clause  (Gerardo Herzig <gherzig@fmed.uba.ar>)
Ответы Re: performance drop when function argument is evaluated in WHERE clause  (Gerardo Herzig <gherzig@fmed.uba.ar>)
Список pgsql-performance
Gerardo Herzig <gherzig@fmed.uba.ar> writes:
> Hi all. I have a function that uses a "simple" select between 3 tables. There is a function argument to help choose
howa WHERE clause applies. This is the code section: 
> select * from....
> [...]
> where case $3
>   when 'I' then [filter 1]
>   when 'E' then [filter 2]
>   when 'P' then [filter 3]
> else true end

> When the function is called with, say, parameter $3 = 'I', the funcion run in 250ms,
> but when there is no case involved, and i call directly "with [filter 1]" the function runs in 70ms.

> Looks like the CASE is doing something nasty.
> Any hints about this?

Don't do it like that.  You're preventing the optimizer from understanding
which filter applies.  Better to write three separate SQL commands
surrounded by an if/then/else construct.

(BTW, what PG version is that?  I would think recent versions would
realize that dynamically generating a plan each time would work around
this.  Of course, that approach isn't all that cheap either.  You'd
probably still be better off splitting it up manually.)

            regards, tom lane


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

Предыдущее
От: Shaun Thomas
Дата:
Сообщение: Re: query against large table not using sensible index to find very small amount of data
Следующее
От: Tom Lane
Дата:
Сообщение: Re: query against large table not using sensible index to find very small amount of data