In postgres 9.2 I have a function that is relatively expensive. When I write a query such as:
select expensive_function(
o.id),o.* from offeirng o where valid='Y' order by name limit 1;
the query runs slow and appears to be running the function on each ID, which in this case should be totally unnecessary as it really only needs to run on 1 row.
When I rewrite the query like so:
select expensive_function(
o.id), o.*
from (select *offering where valid='Y' order by name limit 1) o;
the expensive function only runs once and thus, much faster. I would think that the optimizer could handle this situation, especially when limit or offset is used and the expensive function is not used in a group by, order by or where.
Does anyone know what the SQL standard says about this, if anything? I can't see any way that this would change the result set, but of course if the function has external effects this would make a difference...