Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Optimizar consulta , me cuesta casi 10min ejecutarla !!!!!

Estas en el tema de Optimizar consulta , me cuesta casi 10min ejecutarla !!!!! en el foro de SQL Server en Foros del Web. Buenas tengo una sql similar a esta Cita: Select campo1 from cliente c inner join venta v on c.id = v.id inner join facturas f ...
  #1 (permalink)  
Antiguo 15/06/2009, 04:55
 
Fecha de Ingreso: enero-2004
Ubicación: here I Am
Mensajes: 437
Antigüedad: 20 años, 3 meses
Puntos: 1
Optimizar consulta , me cuesta casi 10min ejecutarla !!!!!

Buenas tengo una sql similar a esta
Cita:
Select campo1 from cliente c
inner join venta v on c.id = v.id
inner join facturas f on c.id = v.id
and not exists (SELECT * FROM venta v inner join facturas f
on v.id = f.id and year(v.ven_data) between (year(getdate())-4))

La tabla venta tiene unos 10.000 registros , clientes unos 100.000 y lo tengo todo bien indexado y demás , el problema lo tengo en el "NOT EXISTS" eso vuelvo loco al SQL , alguna alternativa al NOT EXISTS ?


gracias radge
__________________
Nuevo foro sobr el mundo del motor - Renault foro
http://www.renaultforo.com
  #2 (permalink)  
Antiguo 15/06/2009, 06:54
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 5 meses
Puntos: 38
Respuesta: Optimizar consulta , me cuesta casi 10min ejecutarla !!!!!

El problema no es el EXISTS si no la forma en la que lo usas...

una alternativa podria ser esta....

comenta si te sirve, sino fuera asi, comentanos cual es el resultado que esperas obtener tal vez replanteando la consulta se podria obtener un mejor performance...

Código:
DECLARE @FechaInit datetime, @FechaEnd datetime


SET @FechaInit = convert(varchar, dateadd(yy, -4,getdate()) , 112)
SET @FechaEnd = convert (varchar, dateadd(dd,1,getdate()),112)

Select campo1 
from cliente c
inner join  venta v 
on          c.id = v.id
inner join  facturas f 
on          c.id = v.id
and not exists(
            SELECT TOP 1 v.id 
            FROM       venta v 
            INNER JOIN facturas f 
            on          v.id = f.id and v.ven_data >= @FechaInit And v.ven_data < @FechaEnd
            )
Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #3 (permalink)  
Antiguo 15/06/2009, 07:55
 
Fecha de Ingreso: enero-2004
Ubicación: here I Am
Mensajes: 437
Antigüedad: 20 años, 3 meses
Puntos: 1
Respuesta: Optimizar consulta , me cuesta casi 10min ejecutarla !!!!!

La verdad que lo acabo de probar y tarda bastante más. Antes me devolvia los primeros 74 registros en 90seg , ahora para devolver 73 registros ha estado 2min.

El que si que es cierto que si quito el not exists pasa de 10min a casi 3seg.

Alguna sugerencia más ?

muchas gracias
__________________
Nuevo foro sobr el mundo del motor - Renault foro
http://www.renaultforo.com

Última edición por radge; 15/06/2009 a las 08:00
  #4 (permalink)  
Antiguo 15/06/2009, 13:42
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 10 meses
Puntos: 180
Respuesta: Optimizar consulta , me cuesta casi 10min ejecutarla !!!!!

Es bastante común realizar comparaciones entre tablas padre y tablas hijas, existen tres formas de realizar dichas comparaciones que a continuación explicamos en ejemplos y que sirven para encontrar si hay registros padre que no tienen su igual en la tabla hija:

Usando NOT EXISTS
SELECT a.hdr_key
FROM hdr_tbl a
WHERE NOT EXISTS (SELECT * FROM dtl_tbl b WHERE a.hdr_key = b.hdr_key)

Usando LEFT JOIN
SELECT a.hdr_key
FROM hdr_tbl a
LEFT JOIN dtl_tbl b ON a.hdr_key = b.hdr_key
WHERE b.hdr_key IS NULL

Usando NOT IN
SELECT hdr_key
FROM hdr_tbl
WHERE hdr_key NOT IN (SELECT hdr_key FROM dtl_tbl)

En cada caso las QUERIES anteriores devuelven el mismo resultado. Pero ¿cuál de ellas tiene mejor rendimiento?. Asumiendo que todo lo demás es igual, la versión que tiene mejor rendimiento es la primera y la última es la que peor rendimiento tiene (están ordenadas de mejor a peor rendimiento). En otras palabras la variación NOT EXISTS es la QUERY más eficiente.

Esto es generalmente, quiero decir que a pesar de esto y dependiendo de los INDICES y el número de filas en cada tabla puede variar el resultado.
  #5 (permalink)  
Antiguo 24/07/2009, 00:20
 
Fecha de Ingreso: julio-2009
Mensajes: 5
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Optimizar consulta , me cuesta casi 10min ejecutarla !!!!!

Proba Generando Tablas Temporales. Ami me ayudo mucho esooo


consultas que tardaban 20 minutos en tenerlas, las logre en tan solo 2 segundos.
  #6 (permalink)  
Antiguo 24/07/2009, 03:03
 
Fecha de Ingreso: enero-2004
Ubicación: here I Am
Mensajes: 437
Antigüedad: 20 años, 3 meses
Puntos: 1
Respuesta: Optimizar consulta , me cuesta casi 10min ejecutarla !!!!!

Gracias ... no me acordaba de este post tenia 1mes !!!! :P ya lo solucioné con tablas temporales.

salu2 radge
__________________
Nuevo foro sobr el mundo del motor - Renault foro
http://www.renaultforo.com
  #7 (permalink)  
Antiguo 24/07/2009, 11:58
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 10 meses
Puntos: 180
Respuesta: Optimizar consulta , me cuesta casi 10min ejecutarla !!!!!

Ya que has "revivido a un muerto", si quieres que vuele tu consulta y no son muchos registros, utiliza VARIABLES de tipo TABLA y no utilices tablas temporales.
  #8 (permalink)  
Antiguo 24/07/2009, 15:31
 
Fecha de Ingreso: junio-2009
Ubicación: Guadalajara Jalisco Mexico
Mensajes: 56
Antigüedad: 14 años, 11 meses
Puntos: 2
Respuesta: Optimizar consulta , me cuesta casi 10min ejecutarla !!!!!

Cita:
Iniciado por iislas Ver Mensaje
Ya que has "revivido a un muerto", si quieres que vuele tu consulta y no son muchos registros, utiliza VARIABLES de tipo TABLA y no utilices tablas temporales.

Aunque microsoft recomienda usar variables tipo tabla he tenido varias experiencias que las variables tipo tabla toman muchisimo mas tiempo que tablas temporales (+ 1 min. variable vs > 1 seg. tabla temporal) En teoria la variable al ser memoria es mas rapida que la tabla temporal que va a disco. No esta de mas probar ambas y ver cual es la mas rapida.

Saludos.
  #9 (permalink)  
Antiguo 24/07/2009, 16:44
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 5 meses
Puntos: 38
Respuesta: Optimizar consulta , me cuesta casi 10min ejecutarla !!!!!

Dependera de tu servidor: el tamano de memoria, la carga de trabajo y el espacio en disco, asi como las transacciones concurrentes en tempdb...

Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:32.