Sugerencias para mejorar la SELECT de esta consulta.

07/09/2006 - 21:08 por Salvador Ramos | Informe spam
Hola a todos,

Estoy revisando con profiler una serie de ejecuciones y he visto esta
consulta que se ejecuta con bastante frecuencia, quería consultaros si se os
ocurre alguna forma de optimizarla (a parte de poner índices y demás que eso
ya lo tengo), es decir, obtener otra instrucción select que ofrezca los
mismos resultados y tenga mejor rendimiento.

Primero os explico la estructura de datos, intervienen tres tablas:
Clientes: Cliente, nombre, ... (Cliente es PK de Clientes)
Tarjetas: Cliente, Tarjeta, ... (Cliente es FK - relación uno a muchos con
Clientes, Tarjeta es PK de Tarjetas)
Servicios: Id, Tarjeta, Importe, ... (Id es PK de Servicios, Tarjeta es
FK -relación uno a muchos con Tarjetas)

select sum(importe) as sumaP
from servicios where fecha >= '20060709'
and tarjeta in (select tarjeta
from tarjetas
where cliente = (select cliente
from tarjetas
where tarjeta = 'ABCD' ))

Necesito que la consulta me devuelva la suma de los importes de todas las
tarjetas del cliente, por eso la select de nivel inferior obtiene el cliente
al que pertenece esa tarjeta, la del siguiente nivel obtiene la relación de
tarjetas de ese cliente, y ya la de nivel superior suma los importes de
todas esas tarjetas.

He intentado mejorarla, pero no lo he conseguido, y es una consulta que se
ejecuta con bastante frecuencia. Igual aún no he conectado 100% tras la
vuelta de vacaciones :-)

Muchas gracias

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL Server y .NET)
 

Leer las respuestas

#1 jcac
07/09/2006 - 22:04 | Informe spam
Hola,

Creo que podrías utilizar exists en lugar de in, te quedaría de esta manera
mas o menos

select sum(s.importe) as sumaP
from servicios s where s.fecha >= '20060709'
and exists (select tarjeta
from tarjetas
where tarjeta = s.tarjeta and
cliente = (select cliente
from tarjetas
where tarjeta = 'ABCD' ))

Espero sea más rápido

Saludos


"Salvador Ramos" escribió en el
mensaje news:uQ%
Hola a todos,

Estoy revisando con profiler una serie de ejecuciones y he visto esta
consulta que se ejecuta con bastante frecuencia, quería consultaros si se
os ocurre alguna forma de optimizarla (a parte de poner índices y demás
que eso ya lo tengo), es decir, obtener otra instrucción select que
ofrezca los mismos resultados y tenga mejor rendimiento.

Primero os explico la estructura de datos, intervienen tres tablas:
Clientes: Cliente, nombre, ... (Cliente es PK de Clientes)
Tarjetas: Cliente, Tarjeta, ... (Cliente es FK - relación uno a muchos con
Clientes, Tarjeta es PK de Tarjetas)
Servicios: Id, Tarjeta, Importe, ... (Id es PK de Servicios, Tarjeta es
FK -relación uno a muchos con Tarjetas)

select sum(importe) as sumaP
from servicios where fecha >= '20060709'
and tarjeta in (select tarjeta
from tarjetas
where cliente = (select cliente
from tarjetas
where tarjeta = 'ABCD' ))

Necesito que la consulta me devuelva la suma de los importes de todas las
tarjetas del cliente, por eso la select de nivel inferior obtiene el
cliente al que pertenece esa tarjeta, la del siguiente nivel obtiene la
relación de tarjetas de ese cliente, y ya la de nivel superior suma los
importes de todas esas tarjetas.

He intentado mejorarla, pero no lo he conseguido, y es una consulta que se
ejecuta con bastante frecuencia. Igual aún no he conectado 100% tras la
vuelta de vacaciones :-)

Muchas gracias

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL Server y .NET)



Preguntas similares