我有一个存储过程可以生成一个select语句(5000条记录)。 在select语句中我调用了表值函数。 表值函数执行一些聚合计算
我花了一分多钟才能返回结果
这是聚合函数代码
ALTER FUNCTION [dbo].[GetParticipationEvaluation](@Participation_ID int)
RETURNS @TabEvaluation TABLE (
JudgeCount int NOT NULL,
JudgeEvaluationCount int NOT NULL,
Evaluation float
)
AS
BEGIN
declare @JudgeCount int
declare @JudgeEvaluationCount int
declare @Evaluation float
SELECT
@JudgeCount=COUNT(*),@Evaluation= AVG(Evaluation) from Judge_Participation where Participation_ID=@Participation_ID and Sys_Is_Active=1
and status_ID =2
SELECT
@JudgeEvaluationCount=COUNT(*),@Evaluation= AVG(Evaluation) from Judge_Participation where Participation_ID=@Participation_ID and Sys_Is_Active=1
INSERT INTO @TabEvaluation (JudgeCount, JudgeEvaluationCount, Evaluation)
select @JudgeCount,@JudgeEvaluationCount,@Evaluation
RETURN;
END;
这是存储过程代码
ALTER procedure [dbo].[GetEvalutionStatistics]
as
select [Participation].[Participation_ID]
,[Participation].[Name_Ar]
,[Participation].[Name_En]
,[Participation].[Is_Submitted]
,[Participation].[Student_ID]
,[Participation].[Result_ID]
,[Participation].[Field_ID]
,[Participation].[Category_ID]
,[Participation].[Actual_Field_ID]
,[Participation].[Current_Member_ID]
,[Participation].[Sys_Is_Active]
,[Participation].[Turnitin_Value]
,[Participation].[Turnitin_Link]
,Eval.JudgeCount
,Eval.JudgeEvaluationCount
,Eval.Evaluation
,[Actual_Field_ID].[Name_Ar] as 'Actual_Field_ID.Name_Ar'
,[Actual_Field_ID].[Name_En] as 'Actual_Field_ID.Name_En'
,[Result_ID].[Name_Ar] as 'Result_ID.Name_Ar'
,[Result_ID].[Name_En] as 'Result_ID.Name_En'
--,dbo.getjudgecount(participation_ID,null) 'JudgeCount'
--,dbo.getjudgecount(participation_ID,2) 'JudgeEvaluationCount'
--,dbo.GetAvgParticipationEvaluation(Participation_ID) 'Evaluation'
--,dbo.getParticipationSpecialist(Participation_ID) as 'specialist'
from [Participation]
left join [Participation_Field_List] as [Actual_Field_ID] on [Actual_Field_ID].[Field_ID]=[Participation].[Actual_Field_ID]
left join [Participation_Result] as [Result_ID] on [Result_ID].[Result_ID]=[Participation].[Result_ID]
OUTER APPLY dbo.GetParticipationEvaluation([Participation].participation_ID) Eval
where
participation.Sys_Is_Active=1 and participation.is_submitted=1
我想知道造成这种不良表现的部分
答案 0 :(得分:1)
通常你需要对'join columns'和'where子句'进行索引,尝试获取执行计划,看看是否缺少索引。
答案 1 :(得分:1)
尝试不使用慢速功能的此过程
CREATE procedure [dbo].[GetEvalutionStatistics]
as
select p.[Participation_ID]
,p.[Name_Ar]
,p.[Name_En]
,p.[Is_Submitted]
,p.[Student_ID]
,p.[Result_ID]
,p.[Field_ID]
,p.[Category_ID]
,p.[Actual_Field_ID]
,p.[Current_Member_ID]
,p.[Sys_Is_Active]
,p.[Turnitin_Value]
,p.[Turnitin_Link]
,Eval.JudgeCount
,Eval.JudgeEvaluationCount
,Eval.Evaluation
,[Actual_Field_ID].[Name_Ar] as 'Actual_Field_ID.Name_Ar'
,[Actual_Field_ID].[Name_En] as 'Actual_Field_ID.Name_En'
,[Result_ID].[Name_Ar] as 'Result_ID.Name_Ar'
,[Result_ID].[Name_En] as 'Result_ID.Name_En'
--,dbo.getjudgecount(participation_ID,null) 'JudgeCount'
--,dbo.getjudgecount(participation_ID,2) 'JudgeEvaluationCount'
--,dbo.GetAvgParticipationEvaluation(Participation_ID) 'Evaluation'
--,dbo.getParticipationSpecialist(Participation_ID) as 'specialist'
from [Participation] p
left join [Participation_Field_List] as [Actual_Field_ID] on [Actual_Field_ID].[Field_ID]= p.[Actual_Field_ID]
left join [Participation_Result] as [Result_ID] on [Result_ID].[Result_ID]= p.[Result_ID]
OUTER APPLY (
SELECT COUNT(CASE WHEN Sys_Is_Active=1 and status_ID = 2 THEN 1 END) AS JudgeCount,
AVG(CASE WHEN Sys_Is_Active=1 THEN Evaluation END) AS Evaluation,
COUNT(CASE WHEN Sys_Is_Active=1 THEN 1 END) AS JudgeEvaluationCount
FROM Judge_Participation
WHERE Participation_ID = p.participation_ID and (Sys_Is_Active=1 OR status_ID =2)
) Eval
where p.Sys_Is_Active=1 and p.is_submitted=1
答案 2 :(得分:0)
好吧,我发现你在外部应用中使用的函数中有一些逻辑。没有这个功能你测试过吗?当然,你将缺少逻辑,但要确定函数或查询的其余部分是否是问题,这是可能的。
除非我真的需要,否则我不会尝试使用函数。对于我所看到的,您可以将所有逻辑放入存储过程中。
我会查看此查询将生成的查询计划。如果您不知道如何做到这一点,可以在http://plixa.nl/how-to-read-query-execution-plans/找到解决方法。
答案 3 :(得分:0)
我认为在此查询中使用函数导致性能成本。由于在查询中调用用户定义的函数,因此会降低性能。
所以请考虑尝试替代方法以避免功能。
请检查表格中的索引。
请参阅以下链接
http://www.mindfiresolutions.com/SqlServer-Query-Optimization-Tips-470.php
http://www.mssqltips.com/sql-server-tip-category/37/query-optimization/