title: Sql server function slow runtime
body: <p>I have the following function that returns the averages of the records by Group, Country, State and in turn by Season, Room Type etec. The problem with this function is that the response time is 15 minutes, can someone help me correct this problem please? I have also noticed that every time I run the function the response time increases</p>
  
  <pre><code>CREATE FUNCTION fnEstadisticosGruposNinios()
  RETURNS  @tbEstadisticosGruposNinios TABLE 
  (
      strGrupo nvarchar(255) NULL,
      strPais nvarchar(255) NULL,
      nPorcentajePaisGrupo FLOAT null,
      strEstado  nvarchar(255)  NULL,
      nPorcentajeEstadoGrupo FLOAT NULL,
      intNinios INT NULL,
      nPorcentajeNiniosGrupo FLOAT NULL,
      strServicio nvarchar(255) NULL,
      nPorcentajeServicio FLOAT NULL,
      strTipoHabitacion nvarchar(255) NULL,
      nPorcentajeTipoHabitacion FLOAT NULL,
      strTarifa nvarchar(255) NULL,
      nPorcentajeTarifa FLOAT NULL,
      strPaquete nvarchar(255)NULL,
      nPorcentajePaquete FLOAT NULL,
      intDiasEstancia INT NULL,
      nPorcentajeDiasEstancia FLOAT NULL
  )
  AS
  BEGIN
  DECLARE @tbTemporalEstadisticosGruposNinios
          table (
              strGrupo nvarchar(255) NULL,
      strPais nvarchar(255) NULL,
      nPorcentajePaisGrupo FLOAT null,
      strEstado  nvarchar(255)  NULL,
      nPorcentajeEstadoGrupo FLOAT NULL,
      intNinios INT NULL,
      nPorcentajeNiniosGrupo FLOAT NULL,
      strServicio nvarchar(255) NULL,
      nPorcentajeServicio FLOAT NULL,
      strTipoHabitacion nvarchar(255) NULL,
      nPorcentajeTipoHabitacion FLOAT NULL,
      strTarifa nvarchar(255) NULL,
      nPorcentajeTarifa FLOAT NULL,
      strPaquete nvarchar(255)NULL,
      nPorcentajePaquete FLOAT NULL,
      intDiasEstancia INT NULL,
      nPorcentajeDiasEstancia FLOAT NULL
          )
  
  insert into @tbTemporalEstadisticosGruposNinios 
  
  select tbGruposPais.strGrupo,tbGruposPais.strPais, tbGruposPais.nPorcentajePaisGrupo,
  tbEstadosGrupos.strEstado,tbEstadosGrupos.nPorcentajeEstadoGrupo,
  tbNiniosGrupos.intNinos,tbNiniosGrupos.nPorcentajeNiniosGrupo,
  tbServiciosNinios.strServicio,tbServiciosNinios.nPorcentajeServicio,
  tbTipoHabitacionNinios.strTipoHabitacion,
  tbTipoHabitacionNinios.nPorcentajeTipoHabitacion,
  tbTarifasNinios.strTarifa,
  tbTarifasNinios.nPorcentajeTarifa,
  tbPaqueteNinios.strPaquete,
  tbPaqueteNinios.nPorcentajePaquete,
  tbDiasEstanciaNinios.intDiasEstancia,
  tbDiasEstanciaNinios.nPorcentajeDiasEstancia
  
   from
  
  (select 
  tbContadorPaisGrupo.strGrupo, 
   tbContadorPaisGrupo.strPais, 
   (CAST(tbContadorPaisGrupo.nContadorPais as float)*100/CAST(tbContadorRegistrosPorGrupo.nRegistrosGrupo as float)) as nPorcentajePaisGrupo
    FROM
  (select strGrupo, strPais, COUNT(strPais) nContadorPais from tbConjuntoEntrenamiento
    group by strGrupo,strPais
  ) tbContadorPaisGrupo,
  (select strGrupo,COUNT(strGrupo) as nRegistrosGrupo from tbConjuntoEntrenamiento
              group by strGrupo) tbContadorRegistrosPorGrupo 
      where tbContadorPaisGrupo.strGrupo=tbContadorRegistrosPorGrupo.strGrupo )tbGruposPais,
  
  /*Consulta que obtiene el porcentaje de Estados por Grupo y Pais*/
  (select 
   tbContadorEstadoGrupo.strGrupo, 
   tbContadorEstadoGrupo.strPais, 
   tbContadorEstadoGrupo.strEstado,
   (CAST(tbContadorEstadoGrupo.nContadorEstado as float)*100/CAST(tbContadorRegistrosPorGrupo.nRegistrosGrupo as float)) as nPorcentajeEstadoGrupo
    FROM
  (select strGrupo,strPais,strEstado, COUNT(strEstado) as nContadorEstado from tbConjuntoEntrenamiento    
  group by strGrupo,strPais,strEstado) tbContadorEstadoGrupo,
  (select strGrupo,COUNT(strGrupo) as nRegistrosGrupo from tbConjuntoEntrenamiento
              group by strGrupo) tbContadorRegistrosPorGrupo 
      where tbContadorEstadoGrupo.strGrupo=tbContadorRegistrosPorGrupo.strGrupo) tbEstadosGrupos,
  (select 
   tbContadorNiniosGrupo.strGrupo, 
   tbContadorNiniosGrupo.strPais, 
   tbContadorNiniosGrupo.strEstado,
   tbContadorNiniosGrupo.intNinos,
   (CAST(tbContadorNiniosGrupo.nContadorNinios as float)*100/CAST(tbContadorRegistrosPorGrupo.nRegistrosGrupo as float)) as nPorcentajeNiniosGrupo
    FROM
  (select strGrupo,strPais,strEstado,intNinos, COUNT(intNinos) as nContadorNinios from tbConjuntoEntrenamiento    
  group by strGrupo,strPais,strEstado,intNinos) tbContadorNiniosGrupo,
  (select strGrupo,COUNT(strGrupo) as nRegistrosGrupo from tbConjuntoEntrenamiento
              group by strGrupo) tbContadorRegistrosPorGrupo 
      where tbContadorNiniosGrupo.strGrupo=tbContadorRegistrosPorGrupo.strGrupo) tbNiniosGrupos,
  
  ( select  t1.strGrupo,t2.nContadorGrupo,t1.strPais,t1.strEstado,t1.intNinos,t1.strServicio, (CAST(t1.nContadorServicioNinios*100 as float)/CAST(t2.nContadorGrupo as float)) as nPorcentajeServicio from
   (select strGrupo,strPais,strEstado,intNinos,strServicio,
   COUNT (strServicio) as nContadorServicioNinios from tbConjuntoEntrenamiento 
  group by strGrupo,strPais,strEstado,intNinos,strServicio) as t1,
   (select strGrupo,COUNT(strGrupo) as nContadorGrupo from tbConjuntoEntrenamiento group by strGrupo) as t2  where t2.strGrupo=t1.strGrupo
  )tbServiciosNinios,
   ( select  t1.strGrupo,t2.nContadorGrupo,t1.strPais,t1.strEstado,t1.intNinos,t1.strTipoHabitacion, (CAST(t1.nContadorTipoHabitacionNinios*100 as float)/CAST(t2.nContadorGrupo as float)) as nPorcentajeTipoHabitacion from
   (select strGrupo,strPais,strEstado,intNinos,strTipoHabitacion,
   COUNT (strTipoHabitacion) as nContadorTipoHabitacionNinios from tbConjuntoEntrenamiento 
  group by strGrupo,strPais,strEstado,intNinos,strTipoHabitacion) as t1,
   (select strGrupo,COUNT(strGrupo) as nContadorGrupo from tbConjuntoEntrenamiento group by strGrupo) as t2  where t2.strGrupo=t1.strGrupo
  )tbTipoHabitacionNinios,
   ( select  t1.strGrupo,t2.nContadorGrupo,t1.strPais,t1.strEstado,t1.intNinos,t1.strTarifa, (CAST(t1.nContadorTarifaNinios*100 as float)/CAST(t2.nContadorGrupo as float)) as nPorcentajeTarifa from
   (select strGrupo,strPais,strEstado,intNinos,strTarifa,
   COUNT (strTarifa) as nContadorTarifaNinios from tbConjuntoEntrenamiento 
  group by strGrupo,strPais,strEstado,intNinos,strTarifa) as t1,
   (select strGrupo,COUNT(strGrupo) as nContadorGrupo from tbConjuntoEntrenamiento group by strGrupo) as t2  where t2.strGrupo=t1.strGrupo
  )tbTarifasNinios,
    ( select  t1.strGrupo,t2.nContadorGrupo,t1.strPais,t1.strEstado,t1.intNinos,t1.strPaquete, (CAST(t1.nContadorPaqueteNinios*100 as float)/CAST(t2.nContadorGrupo as float)) as nPorcentajePaquete from
   (select strGrupo,strPais,strEstado,intNinos,strPaquete,
   COUNT (strPaquete) as nContadorPaqueteNinios from tbConjuntoEntrenamiento 
  group by strGrupo,strPais,strEstado,intNinos,strPaquete) as t1,
   (select strGrupo,COUNT(strGrupo) as nContadorGrupo from tbConjuntoEntrenamiento group by strGrupo) as t2  where t2.strGrupo=t1.strGrupo
  )tbPaqueteNinios,
    ( select  t1.strGrupo,t2.nContadorGrupo,t1.strPais,t1.strEstado,t1.intNinos,t1.intDiasEstancia, (CAST(t1.nContadorDiasEstanciaNinios*100 as float)/CAST(t2.nContadorGrupo as float)) as nPorcentajeDiasEstancia from
   (select strGrupo,strPais,strEstado,intNinos,intDiasEstancia,
   COUNT (intDiasEstancia) as nContadorDiasEstanciaNinios from tbConjuntoEntrenamiento 
  group by strGrupo,strPais,strEstado,intNinos,intDiasEstancia) as t1,
   (select strGrupo,COUNT(strGrupo) as nContadorGrupo from tbConjuntoEntrenamiento group by strGrupo) as t2  where t2.strGrupo=t1.strGrupo
  )tbDiasEstanciaNinios
  
      where tbGruposPais.strGrupo=tbEstadosGrupos.strGrupo 
      and tbGruposPais.strPais=tbEstadosGrupos.strPais
  
      and tbNiniosGrupos.strGrupo=tbGruposPais.strGrupo
      and tbNiniosGrupos.strGrupo=tbEstadosGrupos.strGrupo
      and tbNiniosGrupos.strPais=tbGruposPais.strPais
      and tbNiniosGrupos.strPais=tbEstadosGrupos.strPais
      and tbNiniosGrupos.strEstado=tbEstadosGrupos.strEstado
  
      and tbServiciosNinios.strGrupo=tbNiniosGrupos.strGrupo
      and tbServiciosNinios.strPais=tbNiniosGrupos.strPais
      and tbServiciosNinios.strEstado=tbNiniosGrupos.strEstado
      and tbServiciosNinios.intNinos=tbNiniosGrupos.intNinos
  
      and tbTipoHabitacionNinios.strGrupo=tbNiniosGrupos.strGrupo
      and tbTipoHabitacionNinios.strPais=tbNiniosGrupos.strPais
      and tbTipoHabitacionNinios.strEstado=tbNiniosGrupos.strEstado
      and tbTipoHabitacionNinios.intNinos=tbNiniosGrupos.intNinos
  
      and tbTarifasNinios.strGrupo=tbNiniosGrupos.strGrupo
      and tbTarifasNinios.strPais=tbNiniosGrupos.strPais
      and tbTarifasNinios.strEstado=tbNiniosGrupos.strEstado
      and tbTarifasNinios.intNinos=tbNiniosGrupos.intNinos
  
      and tbPaqueteNinios.strGrupo=tbNiniosGrupos.strGrupo
      and tbPaqueteNinios.strPais=tbNiniosGrupos.strPais
      and tbPaqueteNinios.strEstado=tbNiniosGrupos.strEstado
      and tbPaqueteNinios.intNinos=tbNiniosGrupos.intNinos
  
      and tbDiasEstanciaNinios.strGrupo=tbNiniosGrupos.strGrupo
      and tbDiasEstanciaNinios.strPais=tbNiniosGrupos.strPais
      and tbDiasEstanciaNinios.strEstado=tbNiniosGrupos.strEstado
      and tbDiasEstanciaNinios.intNinos=tbNiniosGrupos.intNinos
      order by strGrupo,strPais,strEstado
  
  insert into @tbEstadisticosGruposNinios
  SELECT strGrupo,strPais,nPorcentajePaisGrupo,strEstado,nPorcentajeEstadoGrupo,
  intNinios,nPorcentajeNiniosGrupo,strServicio,nPorcentajeServicio,strTipoHabitacion,nPorcentajeTipoHabitacion,
  strTarifa,nPorcentajeTarifa,strPaquete,nPorcentajePaquete,intDiasEstancia,nPorcentajeDiasEstancia FROM @tbTemporalEstadisticosGruposNinios;
  return
  END
  </code></pre>