SQL Server - consulta sql server muy lenta

 
Vista:
sin imagen de perfil

consulta sql server muy lenta

Publicado por Jose Manuel (2 intervenciones) el 14/08/2015 18:32:33
Hola.

Tengo la siguiente consulta en sql para sql server

select t1.fecha1, t1.u1,ROW_NUMBER() OVER(ORDER BY t1.fila DESC) as fila
from(SELECT [LocalCol] as fecha1, isnull (Past3_User,'xx') as u1 , ROW_NUMBER() OVER(ORDER BY Localcol DESC) as Fila
FROM [Log5Sec_PAST3a]
Where [localcol] > '2015-13-08 00:00:01' and [localcol] < '2015-13-08 23:59:01') as t1 ,
(SELECT [LocalCol] as fecha1, isnull (Past3_User,'xx') as u1, ROW_NUMBER() OVER(ORDER BY Localcol DESC) as Fila
FROM [Log5Sec_PAST3a]
Where [localcol] > '2015-13-08 00:00:01' and [localcol] < '2015-13-08 23:59:01' ) as t2
where t1.Fila = t2.Fila -1 and t1.u1 != t2.u1

Me tarda 0.5 s lo cual para mi esta bien y devuelve 140 filas. Mi problema es que necesito cruzarla con ella misma y al hacer esto la consulta tarda minutos y minutos, lo cual no entiendo ya que son solo 142 filas las que devuelve.

Mi consulta final es esta:


select *
from

(select t1.fecha1, t1.u1,ROW_NUMBER() OVER(ORDER BY t1.fila DESC) as Filas
from(SELECT [LocalCol] as fecha1, isnull (Past3_User,'xx') as u1 , ROW_NUMBER() OVER(ORDER BY Localcol DESC) as Fila
FROM [Log5Sec_PAST3a]
Where [localcol] > '2015-13-08 00:00:01' and [localcol] < '2015-13-08 23:59:01') t1 ,
(SELECT [LocalCol] as fecha1, isnull (Past3_User,'xx') as u1, ROW_NUMBER() OVER(ORDER BY Localcol DESC) as Fila
FROM [Log5Sec_PAST3a]
Where [localcol] > '2015-13-08 00:00:01' and [localcol] < '2015-13-08 23:59:01' ) t2
where t1.Fila = t2.Fila -1 and t1.u1 != t2.u1

)tt1,


(select t1.fecha1, t1.u1,ROW_NUMBER() OVER(ORDER BY t1.fila DESC) as Filas
from(SELECT [LocalCol] as fecha1, isnull (Past3_User,'xx') as u1 , ROW_NUMBER() OVER(ORDER BY Localcol DESC) as Fila
FROM [Log5Sec_PAST3a]
Where [localcol] > '2015-13-08 00:00:01' and [localcol] < '2015-13-08 23:59:01') t1 ,
(SELECT [LocalCol] as fecha1, isnull (Past3_User,'xx') as u1, ROW_NUMBER() OVER(ORDER BY Localcol DESC) as Fila
FROM [Log5Sec_PAST3a]
Where [localcol] > '2015-13-08 00:00:01' and [localcol] < '2015-13-08 23:59:01' ) t2
where t1.Fila = t2.Fila -1 and t1.u1 != t2.u1
) tt2


where tt1.fecha1 = tt2.Filas -1


simplemente cruzar la tabla de la primera consulta (la que solo tarda 0.5s) consigo misma. Deberia devolver el mismo numero de filas que la otra.....

No se por que se vuelve tan lenta. Tengo que parar la consulta porque no devuelve nada.... se queda en ejecucion..
Por que pasa esto? y como solucionarlo?
Gracias de antemano por vuestra ayuda
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: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

consulta sql server muy lenta

Publicado por Isaias (4558 intervenciones) el 14/08/2015 19:14:54
localcol, ¿es una columna con INDICE?

Recomendación, haga la comparación de las fechas en formato ANSI

1
Where [localcol] > '20150813 00:00:01'
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
sin imagen de perfil

consulta sql server muy lenta

Publicado por Jose Manuel (2 intervenciones) el 17/08/2015 08:40:17
mi pregunta es por que es tan lenta. uso el formato ansi de fechas y la consulta se queda igual. localcol es el indice.

No entiendo el sentido de tener una tabla con millones de registros y las consultas van rapidas y cuando cruzo dos select que me devuelven cada una 142 filas se queda pillada y no me da resultados

Gracias
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: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

consulta sql server muy lenta

Publicado por Isaias (4558 intervenciones) el 17/08/2015 19:19:37
Cambia tu forma de "Unirlas" con UNION
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
sin imagen de perfil
Val: 86
Ha disminuido su posición en 2 puestos en SQL Server (en relación al último mes)
Gráfica de SQL Server

consulta sql server muy lenta

Publicado por Rafael (110 intervenciones) el 18/08/2015 10:51:35
Yo es que no entiendo mucho tu consulta y veo algunos detalles un tanto cuanto curiosos.

Me explico:
Tu consulta inicial hace esto:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT t1.fecha1
	 , t1.u1
	 , ROW_NUMBER() OVER ( ORDER BY t1.fila DESC ) AS fila
FROM (
        SELECT [LocalCol] AS fecha1
             , isnull(Past3_User, 'xx') AS u1
             , ROW_NUMBER() OVER (ORDER BY Localcol DESC) AS Fila
        FROM  [Log5Sec_PAST3a]
        WHERE [localcol] > '2015-13-08 00:00:01' AND [localcol] < '2015-13-08 23:59:01') AS t1
	,(
		SELECT [LocalCol] AS fecha1
			 , isnull(Past3_User, 'xx') AS u1
			 , ROW_NUMBER() OVER (ORDER BY Localcol DESC) AS Fila
		FROM   [Log5Sec_PAST3a]
		WHERE  [localcol] > '2015-13-08 00:00:01' AND [localcol] < '2015-13-08 23:59:01' ) AS t2
WHERE t1.Fila = t2.Fila - 1
AND   t1.u1 != t2.u1

En resumen consulta dos veces lo mismo supongo un log
Y Muestra solo aquello que el ROW Number menos 1 difiera en el ID, no usa los campos de T2.

No se para que te sirve pero ya de entrada has obligado a recorrer 2 veces la consulta ordenando descendientemente...

Y creo entender que el tema del ROW_NUMBER es solo para efectos de poder comparar el registro contra su predecesor, si mis presunciones fuesen correctas yo haria el query asi:
1
2
3
4
5
6
7
8
9
SELECT t1.fecha1
	 , t1.u1
FROM   (
        SELECT [LocalCol] AS fecha1
             , isnull(Past3_User, 'xx') AS u1
             , LAG(isnull(Past3_User, 'xx'), 1, 'xx') OVER (ORDER BY Localcol DESC) AS U2
        FROM  [Log5Sec_PAST3a]
        WHERE [localcol] > '2015-13-08 00:00:01' AND [localcol] < '2015-13-08 23:59:01') AS t1
WHERE t1.u1 != t2.u2

Con lo cual tu primer consulta en lugar de realizarse dos veces solo ocurre una...

Cuando hablas de tu segunda consulta que estas uniendo creo que quieres en una linea sacar el dato actual y el previo ... Pero ya mandas a ejecutar la consulta 4 veces, lo que tener 4 cursores de muchos datos en memoria ralentizan el proceso demasiado...

Una vez mas si me presuncion es correcta podrias usar directamente, la consulta propuesta y seguir haciendo una sola ejecucion con algo asi ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT t1.fecha1
	 , t1.u1
     , t1.fila
     , t1.fecha2
     , t1.u2
     , t1.fila - 1 as fila2
FROM   (
        SELECT [LocalCol] AS fecha1
             , isnull(Past3_User, 'xx') AS u1
             , LAG(isnull(Past3_User, 'xx'), 1, 'xx') OVER (ORDER BY Localcol DESC) AS U2
             , LAG([LocalCol], 1, 'xx') OVER (ORDER BY Localcol DESC) AS fecha2
             , ROW_NUMBER() OVER (ORDER BY Localcol DESC) AS Fila
        FROM  [Log5Sec_PAST3a]
        WHERE [localcol] > '2015-13-08 00:00:01' AND [localcol] < '2015-13-08 23:59:01') AS t1
WHERE t1.u1 != t2.u2

otro detalle curioso que veo... quieres un intervalo un poco raro donde te pierdes el primer segundo del dia y los ultimos 58 ...
1
WHERE [localcol] > '2015-13-08 00:00:01' AND [localcol] < '2015-13-08 23:59:01')

Hay un par de formas mas eficientes de tomar un solo dia:
1
WHERE [localcol] >= '2015-13-08 00:00:00' AND [localcol] < '2015-13-09 00:00:00')

Por ejemplo este otro tambien funciona:
1
WHERE CONVERT(DATE, [localcol], 101) =  CONVERT(DATE, '2015-13-08', 101)

Ya me contaras... saludos
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: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

consulta sql server muy lenta

Publicado por Isaias (4558 intervenciones) el 18/08/2015 18:49:33
Rafael, excelente exposición, solo que difiero en su ultima recomendación y no lo digo yo, lo dicen los libros.

1
WHERE CONVERT(DATE, [localcol], 101) =  CONVERT(DATE, '2015-13-08', 101)

Aunque esto funcione, recuerde que al convertir un campo de la tabla, se dejan de utilizar los índices, por tanto, en una gran cantidad de registros, esta ultima recomendación haría muy lenta la salida del query.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 86
Ha disminuido su posición en 2 puestos en SQL Server (en relación al último mes)
Gráfica de SQL Server

consulta sql server muy lenta

Publicado por Rafael (110 intervenciones) el 19/08/2015 07:51:13
Totalmente de acuerdo con la apreciacion de los indices, salvo el detalle que puedes hacer un indice de funcion ...

saludos
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