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

Optimización de consulta con 1 sola tabla

Estas en el tema de Optimización de consulta con 1 sola tabla en el foro de SQL Server en Foros del Web. Hola, ¿qué tal? Escribo este mensaje porque estoy un tanto desesperadillo Tengo la siguiente tabla con fechas, nombres de aplicaciones y cantidades de usuarios: ------------------------ ...
  #1 (permalink)  
Antiguo 01/03/2011, 06:13
 
Fecha de Ingreso: marzo-2011
Mensajes: 1
Antigüedad: 13 años
Puntos: 0
Busqueda Optimización de consulta con 1 sola tabla

Hola, ¿qué tal? Escribo este mensaje porque estoy un tanto desesperadillo

Tengo la siguiente tabla con fechas, nombres de aplicaciones y cantidades de usuarios:

------------------------
CREATE TABLE [dbo].[TABLA_APLICACIONES](

[FECHA] [datetime] NOT NULL,

[APLICACION] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,

[USUARIOS] [int] NULL

) ON [PRIMARY]
---------------


Necesito tener la suma de usuarios para dos grupos distintos de aplicaciones, en cada momento existente y para un día concreto (en el ejemplo uso getdate(), pero es la parte que parametrizo)

La query de abajo funciona, pero tarda unos 5 minutos en generar la respuesta,
y eso deja colgados ciertos procesos. La tengo que hacer mucho más rápidamente.

¿Alguien sabe de alguna alternativa más rápida?

Muchas gracias a todos


---------------


SELECT SUBSTRING(LEFT(CONVERT(CHAR(8), MAIN.FECHA, 108), 5), 1, 5) AS HORAS,

(SELECT SUM(PAR.USUARIOS)

FROM dbo.TABLA_APLICACIONES PAR

WHERE PAR.FECHA = MAIN.FECHA

AND (PAR.APLICACION LIKE 'APLICACION_SSO_PAR' OR

PAR.APLICACION LIKE 'APLICACION_PA_SSO_PAR' OR

PAR.APLICACION LIKE 'APLICACION_PB_SSO_PAR')

GROUP BY PAR.FECHA

)

AS USUARIOS_PAR,

(

SELECT SUM(IMPAR.USUARIOS)

FROM dbo.TABLA_APLICACIONES IMPAR

WHERE IMPAR.FECHA = MAIN.FECHA

AND (IMPAR.APLICACION LIKE 'APLICACION_SSO_IMPAR' OR

IMPAR.APLICACION LIKE 'APLICACION_PA_SSO_IMPAR' OR

IMPAR.APLICACION LIKE 'APLICACION_PB_SSO_IMPAR')

GROUP BY IMPAR.FECHA)

AS USUARIOS_IMPAR



FROM dbo.TABLA_APLICACIONES MAIN

WHERE CONVERT(CHAR(12), MAIN.FECHA, 103) = CONVERT(CHAR(12), getdate(), 103)

GROUP BY MAIN.FECHA

ORDER BY MAIN.FECHA

------------------------------------

Última edición por oscaral; 01/03/2011 a las 06:19 Razón: aclaración de lo que necesito
  #2 (permalink)  
Antiguo 01/03/2011, 08:21
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: Optimización de consulta con 1 sola tabla

Hola oscaral

No estoy seguro de qué es lo que estás tratando de obtener, pero creo que no hay necesidad de utilizar dos subconsultas, creo que se podría realizar con un solo select, pero para esto necesitaríamos que pusieras algunos datos de ejemplo, para poder plantear otra solución. De cualquiera manera te hago las siguientes recomendaciones:

- Trata en la medida de lo posible de evitar comparaciones LIKE, ya que estas son muy tardadas. En tu caso no sé por qué utilizas este operador cuando ni siquiera estás utilizando caracteres comodín (% o _). en lugar de eso deberías utilizar comparaciones = así:

Código:
AND (
PAR.APLICACION = 'APLICACION_SSO_PAR' OR
PAR.APLICACION = 'APLICACION_PA_SSO_PAR' OR
PAR.APLICACION = 'APLICACION_PB_SSO_PAR')
Te repito, creo que hay otras formas más óptimas para obtener la consulta que deseas hacer, pero depende de tus datos, por lo pronto te dejo una propuesta, no estoy seguro de que funciones pero más o menos así serías:

Código SQL:
Ver original
  1. SELECT
  2. SUBSTRING(LEFT(CONVERT(CHAR(8), MAIN.FECHA, 108), 5), 1, 5) AS HORAS,
  3. SUM (
  4. CASE WHEN
  5. (PAR.APLICACION = 'APLICACION_SSO_PAR' OR
  6. PAR.APLICACION = 'APLICACION_PA_SSO_PAR' OR
  7. PAR.APLICACION = 'APLICACION_PB_SSO_PAR') THEN MAIN.USUARIOS ELSE 0 END
  8. ) AS USUARIOS_PAR,
  9.  
  10. SUM (
  11. CASE WHEN
  12. (PAR.APLICACION = 'APLICACION_SSO_IMPAR' OR
  13. PAR.APLICACION = 'APLICACION_PA_SSO_IMPAR' OR
  14. PAR.APLICACION = 'APLICACION_PB_SSO_IMPAR') THEN MAIN.USUARIOS ELSE 0 END
  15. ) AS USUARIOS_IMPAR
  16. FROM dbo.TABLA_APLICACIONES MAIN
  17. WHERE CONVERT(CHAR(12), MAIN.FECHA, 103) = CONVERT(CHAR(12), getdate(), 103)
  18. GROUP BY MAIN.FECHA
  19. ORDER BY MAIN.FECHA

No estoy seguro de que funcione, pero haz la prueba y nos comentas. De cualquier manera publica algunos datos de ejemplo y dinos qué esperas de salida.

Saludos
Leo

Etiquetas: optimización, subquery
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 18:44.