From: | "Marcos Saldivar" <baron(dot)rojo(dot)cuerdas(dot)de(dot)acero(at)gmail(dot)com> |
---|---|
To: | "Alvaro Herrera" <alvherre(at)commandprompt(dot)com> |
Cc: | Sebastián Villalba <sebastian(at)fcm(dot)unc(dot)edu(dot)ar>, Postgresql <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Plan de ejecución de una consulta con OR |
Date: | 2008-07-14 15:27:55 |
Message-ID: | 1c4d91ab0807140827n28bf4aabv54aaded0252f86ed@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
El día 14 de julio de 2008 10:51, Alvaro Herrera
<alvherre(at)commandprompt(dot)com> escribió:
> Sebastián Villalba escribió:
>> Hola Marcos.
>>
>> On Mon, 14 Jul 2008 10:22:07 -0400, Marcos Saldivar wrote
>> > Estimados tengo la siguiente duda, para una consulta como esta:
>> >
>> > select * from foo where foo.permiso = 'todos' or 1950 in (select
>> > miembro from miembros_grupos)
>> >
>> > Al cumplirse la condición "foo.permiso = 'todos'" es valido pensar
>> > que la sub consulta jamas se ejecutara ????
>>
>> Muy válido. Saludos!
>
> No necesariamente ... me parece que SQL no garantiza que las condiciones
> se evalúan de izquierda a derecha ...
>
> Supongo que es posible que por una cosa de rendimiento la condición que
> involucra la constante sea ejecutada antes que la otra, y que el motor
> se tome la libertad de eliminar el subselect. Por otro lado supongo que
> si el subselect incluyera cosas como una funcion volátil, no podría hacerlo.
Entonces lo mas adecuado es no confiar a menos que las subconsultas
cumplan con condiciones
de como que no incluyeran un función volátil ???
por ejemplo:
db=> create table bar(id bigserial primary key);
db=> create table foo(id bigserial primary key);
db=> insert into foo select generate_series(1, 20);
db=> insert into bar select generate_series(10, 50);
db=> explain analyze select * from foo where true or 100 in (select id
from bar);
QUERY PLAN
--------------------------------------------------------------------------------------------------
Seq Scan on foo (cost=0.00..31.40 rows=2140 width=8) (actual
time=0.008..0.010 rows=20 loops=1)
Total runtime: 0.031 ms
(2 filas)
dbrootcars=> explain analyze select * from foo where false or 100 in
(select id from bar);
QUERY PLAN
----------------------------------------------------------------------------------------------------------
Result (cost=36.75..68.15 rows=2140 width=8) (actual
time=0.069..0.069 rows=0 loops=1)
One-Time Filter: (hashed subplan)
-> Seq Scan on foo (cost=36.75..68.15 rows=2140 width=8) (never executed)
SubPlan
-> Seq Scan on bar (cost=0.00..31.40 rows=2140 width=8) (actual
time=0.008..0.011 rows=41 loops=1)
Total runtime: 0.108 ms
Lo que pretendo hacer es que la consulta en ultimo caso o en el caso
mas complejo ejecute varias subconsultas. osea
si el registro tiene un campo permiso = 't' de todos no tiene caso
verificar permisos ya que todos tienen acceso, pero en caso de que el
campo sea distinto de 't' si hay que verificar permisos y ahi entra el
or osea, si permiso <> 't' hacer subconsulta...
gracias por su ayuda...
saludos.-
From | Date | Subject | |
---|---|---|---|
Next Message | Alvaro Herrera | 2008-07-14 15:47:23 | Re: Plan de ejecución de una consulta con OR |
Previous Message | Alvaro Herrera | 2008-07-14 14:51:35 | Re: Plan de ejecución de una consulta con OR |