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
需要查看该执行计划 –
当您在用户定义函数之外运行脚本时会发生什么?你检查执行计划吗? –
[踢坏的习惯:使用旧式JOIN - Aaron Bertrand](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style -joins.aspx) – SqlZim