From: | Alvaro Herrera <alvherre(at)2ndquadrant(dot)com> |
---|---|
To: | "Guillermo E(dot) Villanueva" <guillermovil(at)gmail(dot)com> |
Cc: | Jairo Graterón <jgrateron(at)gmail(dot)com>, Anthony Sotolongo <asotolongo(at)gmail(dot)com>, "Fontana Daniel C (Desartec S(dot)R(dot)L(dot))" <desartecsrl(at)gmail(dot)com>, Juan José Santamaría Flecha <juanjo(dot)santamaria(at)gmail(dot)com>, pgsql-es-ayuda <pgsql-es-ayuda(at)lists(dot)postgresql(dot)org> |
Subject: | Re: Duda con un select y alias |
Date: | 2020-09-08 14:03:22 |
Message-ID: | 20200908140322.GA9652@alvherre.pgsql |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Guillermo E. Villanueva escribió:
> Qué pasa si la función a llamar tiene parámetros que dependen de cada fila
> de la consulta, por ejemplo :
> create or replace function fn_test(x int) returns int
> language plpgsql as
> $$
> begin raise notice 'buu!';
> return x*4;
> end
> $$;
>
> select fn_test(price::int),price
> from products p2
> where fn_test(price::int) > 6
> limit 100;
>
> en ese caso puedo hacer algo para llamar a la función una sola vez por cada
> fila? solo se me ocurre un cálculo auxiliar con subconsulta a nivel de
> from, pero termina siendo mas complejo para el motor que ejecutar dos veces
> la función por cada fila :-)
Puedes usar una subconsulta con una "barrera de optimización". Primero
pones la subconsulta, que da esto:
select fn, price
from (select fn_test(price) as fn, price from products) AS sc
where fn > 6
LIMIT 100;
Pero eso puede no darte el resultado que quieres porque el optimizador
"aplana" la subconsulta convirtiéndola en parte de la consulta externa,
o sea que los "fn" de la consulta externa igual se convierten en la
invocación de fn_test(price). Para evitar eso agregas una barrera de
optimización que es OFFSET 0:
select fn, price
from (select fn_test(price) as fn, price from products OFFSET 0) AS sc
where fn > 6
LIMIT 100;
Eso le quita libertad al optimizador.
--
Álvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
From | Date | Subject | |
---|---|---|---|
Next Message | Martín Díaz | 2020-09-08 15:48:02 | Re: problema con barman y rsync |
Previous Message | Guillermo E. Villanueva | 2020-09-08 13:42:17 | Re: Duda con un select y alias |