Guillermo E. Villanueva escribió:
> Respondiendome a mi mismo he visto en algunos foros que lo resuelven con
> una subconsulta a nivel del from algo así como:
> 
> select
>     col_1,
>     col_2,
>     *col_result*,
>     case when *col_result* > 0 then 'L' else 'D' END col_4
> from
> (
>   select
>       col_1,
>       col_2,
>       fn_funciondeusuario(parametros) *col_result*,
>   from
>       tablas
> ) as tablas2    ;
> 
> Mi intención era evitar que postgres haga el cálculo dos veces por cada
> tupla del resultado, entonces reformulo mi pregunta si lo hago así:
> select
>     col_1,
>     col_2,
>     fn_funciondeusuario(parametros) *col_result*,
>     case when fn_funciondeusuario(parametros) > 0 then 'L' else 'D' END
> col_4
> from
>     tablas;
> 
> Postgres calcula 1 o 2 veces por cada tupla?

Haz la prueba -- pon un RAISE NOTICE en la función y ve cuantas veces
aparece.  Fíjate qué sucede si marcas la función como VOLATILE, STABLE o
IMMUTABLE.

El optimizador está autorizado (no necesariamente lo hará) a optimizar
llamados a funciones no VOLATILE cuando aparezcan más de una vez para la
misma tupla.

-- 
Álvaro Herrera                http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

Responder a