Search Postgresql Archives

Re: Immutable function with bind value

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



-----Original Message-----
From: pgsql-general-owner@xxxxxxxxxxxxxx
[mailto:pgsql-general-owner@xxxxxxxxxxxxxx] On Behalf Of Brice Maron
Sent: Friday, January 20, 2012 1:26 PM
To: David Johnston
Cc: pgsql-general@xxxxxxxxxxxxxx
Subject: Re:  Immutable function with bind value

On Fri, Jan 20, 2012 at 16:00, David Johnston <polobo@xxxxxxxxx> wrote:
> On Jan 20, 2012, at 6:15, Brice Maron <bmaron@xxxxxxxxx> wrote:
>
>> Hi,
>>
>> i've discovered something kind of weird  while developing my app...
>> I was trying to fetch some records in a table using a function immutable.
>> In my interface it was really slow and while i was in a psql it was 
>> really fast ...
>>
>> After some research i've found out that it was caused by the bind 
>> parameter "forcing" the immutable function to execute each time my 
>> query gets a record.
>>
>> while i know that the value can't be known at planning time the 
>> difference between the binded / not binded is quite enormous...
>>
>> i've isolated a test case here....
>>
>> https://gist.github.com/e93792540cb3a68054c9
>>
>> (it happens at least in pg 8.4 and 9.1.2)
>>
>>
>> What do you think about it... bug? feature?  how can i avoid it?
>>
>>
>> Thanks
>>
>>
>
> While you prove the behavior exists your test case is not a realistic
example of why you would do such a thing.
>
> I would have to say that I'd expect your query to execute the function
once and cache the result for the remainder of the statement. To that end
have you tried defining it as a STABLE function instead of immutable?
>
> In the real use-case what is it you are trying to accomplish?
>
> You might try using a WITH clause to resolve your function call and then
use the result in the main query.
>
> David J.


Hi,

i know my code is not a real world thing but i tried to  isolate the
problem...

Here is another piece that look more real and close to the problem i have...

https://gist.github.com/d83a9c5436d7cb8cebec

the taxonomy table has 300 000 records and the difference between

   name_normalized like normalize(?) || '%'


and

  name_normalized like normalize('my Taxa') || '%'


is really huge!

Thanks for the help

Brice

----------------------------------------------------------------------------
--

Brice,

Have you tried an SQL language function?

OR, like I said before:

WITH input_val AS (
	SELECT normalize(?) || '%' AS check_value
)
SELECT * FROM taxonomy CROSS JOIN input_val WHERE name_normalized LIKE
check_value;

Yes it is trial-and-error but at least it's something since I don't know the
"correct" solution (if there is one) and no one else has chimed in yet.

David J.



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



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux