optimizar consulta

08/09/2004 - 03:40 por Fernando | Informe spam
Hola grupo, la pregunta es la siguiente:
Consulta 1:
Select cli.codcli, cli.direccion, sum(fact.importe) as importe, fact.fecha
from clientes cli
inner join facturas fact on fact.codcli = cli.codcli
where fact.fecha > '20040901'
and cli.activo = 1
group by cli.codcli, cli.direccion, fact.fecha


Consulta 2 :
Select cli.codcli, cli.direccion, (Select sum(importe) from facturas where
facturas.codcli = cli.codcli) as importe,
(Select fecha from facturas where facturas.codcli = cli.codcli) as fecha
from clientes cli
where fact.fecha > '20040901'
group by cli.codcli, cli.direccion
having ((select activo from activos where activo = cli.activo ) = 1)

Estas consultas arrojan el mismo resulta ? Cual de ellas tiene mejor
performance ?
Es mejor utilizar los join o los Select en las subconsultas ?

Gracias de antemano
Saludos
Fernando

Preguntas similare

Leer las respuestas

#1 MAXI
08/09/2004 - 03:46 | Informe spam
Fernando, de esas 2 consultas la numero uno sera mucho mas optima :-), el
motivo es que el tipo de subconsulta que estas usando (a nivel campo) se
esta ejecutando por cada registro de la tabla, si esa tabla llegara a tener
muchos registros la performance se caera :(, sin dudas que en tu caso en
particular usaria la primera, hay veces donde usar subconsultas soluciona
problemas, quizas para evitar algo peor aun llamado Cursores o Tabla
Temporales, pero te repito, en tu caso no tiene ningun sentido

Un abrazo




Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)
Mail: Maxi_accotto[arroba]speedy.com.ar
Msn Messager:

"Fernando" escribió en el mensaje
news:
Hola grupo, la pregunta es la siguiente:
Consulta 1:
Select cli.codcli, cli.direccion, sum(fact.importe) as importe, fact.fecha
from clientes cli
inner join facturas fact on fact.codcli = cli.codcli
where fact.fecha > '20040901'
and cli.activo = 1
group by cli.codcli, cli.direccion, fact.fecha


Consulta 2 :
Select cli.codcli, cli.direccion, (Select sum(importe) from facturas


where
facturas.codcli = cli.codcli) as importe,
(Select fecha from facturas where facturas.codcli = cli.codcli) as fecha
from clientes cli
where fact.fecha > '20040901'
group by cli.codcli, cli.direccion
having ((select activo from activos where activo = cli.activo ) = 1)

Estas consultas arrojan el mismo resulta ? Cual de ellas tiene mejor
performance ?
Es mejor utilizar los join o los Select en las subconsultas ?

Gracias de antemano
Saludos
Fernando


Respuesta Responder a este mensaje
#2 Fernando
08/09/2004 - 03:56 | Informe spam
Muchas gracias por rapida respuesta y explicacion, pero que me podes decir
de poner la condicion en el WHERE o directamente en el HAVING

where fact.fecha > '20040901'
and cli.activo = 1

o es mejor
having ((select activo from activos where activo = cli.activo ) = 1)

Gracias nuevamente
Fernando




MAXI escribió en el mensaje de noticias

Fernando, de esas 2 consultas la numero uno sera mucho mas optima :-), el
motivo es que el tipo de subconsulta que estas usando (a nivel campo) se
esta ejecutando por cada registro de la tabla, si esa tabla llegara a


tener
muchos registros la performance se caera :(, sin dudas que en tu caso en
particular usaria la primera, hay veces donde usar subconsultas soluciona
problemas, quizas para evitar algo peor aun llamado Cursores o Tabla
Temporales, pero te repito, en tu caso no tiene ningun sentido

Un abrazo




Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)
Mail: Maxi_accotto[arroba]speedy.com.ar
Msn Messager:

"Fernando" escribió en el mensaje
news:
> Hola grupo, la pregunta es la siguiente:
> Consulta 1:
> Select cli.codcli, cli.direccion, sum(fact.importe) as importe,


fact.fecha
> from clientes cli
> inner join facturas fact on fact.codcli = cli.codcli
> where fact.fecha > '20040901'
> and cli.activo = 1
> group by cli.codcli, cli.direccion, fact.fecha
>
>
> Consulta 2 :
> Select cli.codcli, cli.direccion, (Select sum(importe) from facturas
where
> facturas.codcli = cli.codcli) as importe,
> (Select fecha from facturas where facturas.codcli = cli.codcli) as fecha
> from clientes cli
> where fact.fecha > '20040901'
> group by cli.codcli, cli.direccion
> having ((select activo from activos where activo = cli.activo ) = 1)
>
> Estas consultas arrojan el mismo resulta ? Cual de ellas tiene mejor
> performance ?
> Es mejor utilizar los join o los Select en las subconsultas ?
>
> Gracias de antemano
> Saludos
> Fernando
>
>


Respuesta Responder a este mensaje
#3 Fernando
08/09/2004 - 04:00 | Informe spam
Gracias Adrian, pero los datos son ficticios por lo no tengo las tablas, si
llegaras a tener algunos vos, me interesaria mucho saber como analizarlas.
Saludos
Fernando


Adrian D. Garcia escribió en el mensaje de
noticias #
Seguramente la primea consulta tiene muchisima mas oportunidades de


generar
un plan de ejecucion mas optimo que la segunda. El uso de los JOINS es
altamente recomendado en estos casos sobre otro tipo de sintaxis.
Para verificar lo antedicho ejecuta

SET SHOWPLAN_TEXT ON

antes de ejecutar las 2 sentencias y envianos los resultados, asi los
analizamos entre todos.




Saludos
Adrian D. Garcia
MCSD
NDSoft Consultoria y Desarrollo

"Fernando" wrote in message
news:
> Hola grupo, la pregunta es la siguiente:
> Consulta 1:
> Select cli.codcli, cli.direccion, sum(fact.importe) as importe,


fact.fecha
> from clientes cli
> inner join facturas fact on fact.codcli = cli.codcli
> where fact.fecha > '20040901'
> and cli.activo = 1
> group by cli.codcli, cli.direccion, fact.fecha
>
>
> Consulta 2 :
> Select cli.codcli, cli.direccion, (Select sum(importe) from facturas
where
> facturas.codcli = cli.codcli) as importe,
> (Select fecha from facturas where facturas.codcli = cli.codcli) as fecha
> from clientes cli
> where fact.fecha > '20040901'
> group by cli.codcli, cli.direccion
> having ((select activo from activos where activo = cli.activo ) = 1)
>
> Estas consultas arrojan el mismo resulta ? Cual de ellas tiene mejor
> performance ?
> Es mejor utilizar los join o los Select en las subconsultas ?
>
> Gracias de antemano
> Saludos
> Fernando
>
>


Respuesta Responder a este mensaje
#4 Adrian D. Garcia
08/09/2004 - 07:53 | Informe spam
Seguramente la primea consulta tiene muchisima mas oportunidades de generar
un plan de ejecucion mas optimo que la segunda. El uso de los JOINS es
altamente recomendado en estos casos sobre otro tipo de sintaxis.
Para verificar lo antedicho ejecuta

SET SHOWPLAN_TEXT ON

antes de ejecutar las 2 sentencias y envianos los resultados, asi los
analizamos entre todos.




Saludos
Adrian D. Garcia
MCSD
NDSoft Consultoria y Desarrollo

"Fernando" wrote in message
news:
Hola grupo, la pregunta es la siguiente:
Consulta 1:
Select cli.codcli, cli.direccion, sum(fact.importe) as importe, fact.fecha
from clientes cli
inner join facturas fact on fact.codcli = cli.codcli
where fact.fecha > '20040901'
and cli.activo = 1
group by cli.codcli, cli.direccion, fact.fecha


Consulta 2 :
Select cli.codcli, cli.direccion, (Select sum(importe) from facturas


where
facturas.codcli = cli.codcli) as importe,
(Select fecha from facturas where facturas.codcli = cli.codcli) as fecha
from clientes cli
where fact.fecha > '20040901'
group by cli.codcli, cli.direccion
having ((select activo from activos where activo = cli.activo ) = 1)

Estas consultas arrojan el mismo resulta ? Cual de ellas tiene mejor
performance ?
Es mejor utilizar los join o los Select en las subconsultas ?

Gracias de antemano
Saludos
Fernando


Respuesta Responder a este mensaje
#5 Lázaro
08/09/2004 - 08:59 | Informe spam
Mejor en el Where, si tienes claúsulas group by o having, es trabajo que el
SQL realizará una vez que haya seleccionado las filas, las introducirá en
una tabla de trabajo y agrupará y generará una condición sobre el grupo.
Cuanta más información le puedas dar en la consulta mejor, más que en el
último paso de la misma.

Salu2

"Fernando" wrote in message
news:
Muchas gracias por rapida respuesta y explicacion, pero que me podes


decir
de poner la condicion en el WHERE o directamente en el HAVING

where fact.fecha > '20040901'
and cli.activo = 1

o es mejor
having ((select activo from activos where activo = cli.activo ) = 1)

Gracias nuevamente
Fernando




MAXI escribió en el mensaje de noticias

> Fernando, de esas 2 consultas la numero uno sera mucho mas optima :-),


el
> motivo es que el tipo de subconsulta que estas usando (a nivel campo) se
> esta ejecutando por cada registro de la tabla, si esa tabla llegara a
tener
> muchos registros la performance se caera :(, sin dudas que en tu caso en
> particular usaria la primera, hay veces donde usar subconsultas


soluciona
> problemas, quizas para evitar algo peor aun llamado Cursores o Tabla
> Temporales, pero te repito, en tu caso no tiene ningun sentido
>
> Un abrazo
>
>
>
>
> Maxi
>
> Buenos Aires - Argentina
> Desarrollador .NET 3 Estrellas
> Microsoft User Group (MUG)
> Mail: Maxi_accotto[arroba]speedy.com.ar
> Msn Messager:
>
> "Fernando" escribió en el mensaje
> news:
> > Hola grupo, la pregunta es la siguiente:
> > Consulta 1:
> > Select cli.codcli, cli.direccion, sum(fact.importe) as importe,
fact.fecha
> > from clientes cli
> > inner join facturas fact on fact.codcli = cli.codcli
> > where fact.fecha > '20040901'
> > and cli.activo = 1
> > group by cli.codcli, cli.direccion, fact.fecha
> >
> >
> > Consulta 2 :
> > Select cli.codcli, cli.direccion, (Select sum(importe) from facturas
> where
> > facturas.codcli = cli.codcli) as importe,
> > (Select fecha from facturas where facturas.codcli = cli.codcli) as


fecha
> > from clientes cli
> > where fact.fecha > '20040901'
> > group by cli.codcli, cli.direccion
> > having ((select activo from activos where activo = cli.activo ) = 1)
> >
> > Estas consultas arrojan el mismo resulta ? Cual de ellas tiene mejor
> > performance ?
> > Es mejor utilizar los join o los Select en las subconsultas ?
> >
> > Gracias de antemano
> > Saludos
> > Fernando
> >
> >
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida