SQL Server - eficiencia

 
Vista:

eficiencia

Publicado por Javier (6 intervenciones) el 27/09/2016 18:50:22
Hola, alguien que me ayude a hacer mas eficiente esta consulta? ya que hago uniones tantas veces como equipos tengo, quiero saber si hay forma de solucionarlo con un INER JOIN o alguna forma por favor.

Uso dos fechas de corte porque el corte del equipo se hace en alguna hora del día y lo acoto al corte del otro dia.

SELECT Dispositivo, COUNT ( No_Serie)as Tarjetas
FROM [Compra]
WHERE [Tipo_Transaccion] = 8 and Dispositivo=112005 and No_Serie_Tarjeta <>'0060080F00000001'
AND [Fecha_Hora] >= (SELECT ([Fecha_Hora]) FROM [Cortes]
WHERE convert(Char(8),Fecha_Hora,112) >='20160926' AND convert(Char(8),Fecha_Hora,112) <='20160926' and Dispositivo=112005 and [Total]>0.0)
AND [Fecha_Hora] <= (SELECT ([Fecha_Hora]) FROM [Cortes]
WHERE convert(Char(8),Fecha_Hora,112) >='20160927' AND convert(Char(8),Fecha_Hora,112) <='20160927' and Dispositivo=112005 and [Total]>0.0)
GROUP BY Dispositivo
UNION
SELECT Dispositivo, COUNT ( No_Serie)as Tarjetas
FROM [Compra]
WHERE [Tipo_Transaccion] = 8 and Dispositivo=112006 and No_Serie_Tarjeta <>'0060080F00000001'
AND [Fecha_Hora] >= (SELECT ([Fecha_Hora]) FROM [Cortes]
WHERE convert(Char(8),Fecha_Hora,112) >='20160926' AND convert(Char(8),Fecha_Hora,112) <='20160926' and Dispositivo=112006 and [Total]>0.0)
AND [Fecha_Hora] <= (SELECT ([Fecha_Hora]) FROM [Cortes]
WHERE convert(Char(8),Fecha_Hora,112) >='20160927' AND convert(Char(8),Fecha_Hora,112) <='20160927' and Dispositivo=112006 and [Total]>0.0)
GROUP BY Dispositivo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias
Val: 2.553
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

eficiencia

Publicado por Isaias (4202 intervenciones) el 27/09/2016 22:04:08
¿Que necesita obtener?

¿Sabia usted que cuando hace un convert de un campo de su tabla (convert(Char(8),Fecha_Hora,112)), no se hacen uso de los indices?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

eficiencia

Publicado por Javier (6 intervenciones) el 27/09/2016 22:12:25
Necesito una lista con mis equipos y el count de los datos en el periodo de corte a corte

Ejem:

Dispositivo Tarjetas
112001 100
112002 5
112003 98
112004 3

Y no entendi lo de los indices
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 2.553
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

eficiencia

Publicado por Isaias (4202 intervenciones) el 27/09/2016 22:21:17
¿No sabe que es un INDICES?, es una o mas columnas declaradas como INDICE para un mejor acceso hacia los datos (rapidez).

¿Como se unen COMPRA y CORTE?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

eficiencia

Publicado por Javier (6 intervenciones) el 27/09/2016 22:40:42
Cómo puedo hacer uso de índices en esta estructura?

Se unen por Dispositivo

En la tabla Corte, contiene le fecha y hora en la que se hizo corte al equipo el dispositivo 112001 corto en dd-mm-yyyy hh:mm:ss _1 y al dia siguiente corto en dd-mm-yyyy hh:mm:ss _2

En la tabla Compra están las compras que se hicieron con el Dispositivo 112001.

quiero contar enl numero de operaciones que realizo entre corte_1 y corte_2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 2.553
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

eficiencia

Publicado por Isaias (4202 intervenciones) el 28/09/2016 01:13:55
SQL Server, mediante el PLAN DE EJECUCION, decide que INDICES tomar, pero si no los tiene, entonces su motor esta haciendo una busqueda SECUENCIAL que es demasiado lenta.

Digame si este query se hacerca a la informacion que busca.


SELECT dispositivo, count(cx.*) as Operaciones
FROM compra co
INNER JOIN corte cx
ON co.dispositivo = cx.dispositivo
WHERE co. [Tipo_Transaccion] = 8
AND co.No_Serie_Tarjeta <>'0060080F00000001'
AND cx.Fecha_Hora >= '20160926' AND cx.Fecha_Hora <= '20160926'
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

eficiencia

Publicado por Javier (6 intervenciones) el 28/09/2016 01:35:16
Esta subconsulta que hago es porque cada equipo tiene una fecha con hora especifica en la que corto y porque si algún equipo corto en cero no quiero que considere los dos cortes sino el que sea mayor a cero

SELECT ([Fecha_Hora]) FROM [Cortes]
WHERE convert(Char(8),Fecha_Hora,112) >='20160926' AND convert(Char(8),Fecha_Hora,112) <='20160926' and Dispositivo=112006 and [Total]>0.0

Agradezco el ejemplo anterior, ya lo puse a correr pero aun no termina

Seguiré comentando.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar