Re: Plan de ejecución de una consulta con OR

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.-

In response to

Responses

Browse pgsql-es-ayuda by date

  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