2017-08-22 151 views
2

我有以下功能,返回由Group,Country,State和季节,房间类型etec记录的平均值。这个功能的问题是响应时间是15分钟,请有人帮我解决这个问题吗?我也注意到,每次我运行的响应时间增加Sql服务器功能运行缓慢

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 
+2

需要查看该执行计划 –

+0

当您在用户定义函数之外运行脚本时会发生什么?你检查执行计划吗? –

+3

[踢坏的习惯:使用旧式JOIN - Aaron Bertrand](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style -joins.aspx) – SqlZim

回答

0

我能解决我的问题的功能,这要归功于SqlZim公布的链接,我提高了我的查询执行内部联接,并全面加入和我把时间缩短到一秒钟或2秒钟,非常感谢。