Ver Mensaje Individual
  #3 (permalink)  
Antiguo 17/05/2007, 09:00
Avatar de Andres95
Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 20 años, 2 meses
Puntos: 38
Re: Consulta, seleccion, por periodo de tiempo

Espero te sirva...

1. Para evitar realizar n consultas (60 consultas en un rango de una hora) a la tabla super grande, primero se insertan los rangos en una temporal (seria bueno tener los rangos en una fisica para no estarlos calculando cada vez, pero por el momento servirá) y luego se realiza un solo select agrupando por rangos.

2. Se agrega (nolock) a las tablas, porque cuando algun proceso realiza inserts/updates a una tabla, la bloquea (por pagina, tabla, etc dependiendo..) y el select tiene que esperar a que se libere, suponiendo que el bloqueo dura escasos milisegundos, pero considerando la cantidad de registros y la cantidad de consultas, esto incrementa considerablemente el tiempo de respuesta. Con el nolock, el select ignora los bloqueos y permite leer datos no confirmados (de alguna transaccion) y como en este caso se trata de un historico no nos pegará.

3. Me quedó duda con el In para el tipo de sistema (central) como solo tiene un valor lo reemplace por un = (igual).

4. Si el campo fecha_registro es de tipo fecha no se requerirá el cast.

5. Si existen indices en las tablas, la consulta debe ser muy rapida (por fecha, id_senal, etc.. los campos del where y join)

Saludos!

Código:
 
Declare  @fecha_inicial  datetime
        ,@fecha_final    datetime
        ,@f_reso         datetime 
        ,@reso           int


If Object_id('tempdb..#tblTmpRangosFechas') is not null  drop table #tblTmpRangosFechas

Create table #tblTmpRangosFechas (
       [fecha_inicial] [datetime] NOT NULL 
      ,[fecha_final]   [datetime] NOT NULL 
      ) ON [PRIMARY]

CREATE  INDEX [IX_TmpRangosFechas] ON [dbo].[#tblTmpRangosFechas]([fecha_inicial], [fecha_final])




Set @fecha_inicial = '02/05/2007 12:20:00'
Set @fecha_final   = '02/05/2007 14:20:00'
Set @reso          = 1
Set @Id_Senal      = 'A01U1040'


-------------------------------------------------------------------------
-- Obtenemos los rangos de fechas a evaluar.
-------------------------------------------------------------------------
While (@fecha_inicial <= @fecha_final )
Begin 
   Insert into @tblTmpRangosFechas (fecha_inicial, fecha_final)
   Values (@fechainicial, @fecha_final)
   
   Select @fecha_inicial = dateadd(mi,@reso,@fecha_inicial)
End


-------------------------------------------------------------------------
-- Obtenemos el resultado agrupando por rangos de fechas
-------------------------------------------------------------------------
Select  a.id_senal
       ,min(a.fecha_registro) as expr1
       ,avg(a.valor)          as promedio
       ,r.fecha_inicial       as val_max    -- Rango inicial
       ,r.fecha_final         as val_min    -- Rango final
From   #tblTmpRangosFechas r
Inner join
       dbo.valores_analogicos a (nolock)
On     a.fecha_registro  between r.fecha_inicial and r.fecha_final
Inner join
       dbo.variables_c01 v  (nolock)
On     a.Id_Senal = v.Id_Senal  And
       v.id_senal=  @Id_Senal   And
       a.id_senal = @Id_Senal   
Inner join
       dbo.tipos_de_sistemas s (nolock)
On     v.no_sistema = s.no_sistema
Where  s.no_central = '1' 
Group by
       r.fecha_inicial
      ,r.fecha_final 
      ,a.Id_Senal

If Object_id('tempdb..#tblTmpRangosFechas') is not null  drop table #tblTmpRangosFechas

GO
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.