El día 14 de julio de 2008 10:51, Alvaro Herrera
<[EMAIL PROTECTED]> 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.-
--
TIP 2: puedes desuscribirte de todas las listas simultáneamente
(envía "unregister TuDirecciónDeCorreo" a [EMAIL PROTECTED])