我有一个存储过程,获取60个记录,并花费7-8秒,提示改善存储过程。如何使用group by子句优化包含多个子查询的存储过程?
ALTER PROCEDURE [dbo].[Exat_ProductionLog]
@Condition varchar(max) = ''
AS
BEGIN
EXEC ('declare @startedstatus uniqueidentifier = (select [dbo].[GetMasterSatusByName](''WIP''))
DECLARE @Clarification uniqueidentifier = (select [dbo].[GetMasterSatusByName](''OnHold''))
DECLARE @Completed uniqueidentifier = (select [dbo].[GetMasterSatusByName](''Completed''))
SELECT A.*,Total = A.NoofAccounts
FROM
(SELECT DISTINCT
J.ReceivedOn ReceivedOn,
CONVERT(varchar(10), J.ReceivedOn, 20) ReceivedDate,
(SELECT TOP 1
Convert(varchar(10), AssignedDate, 20)
FROM AssignedCase
WHERE CaseID = AC.CaseID
ORDER BY AssignedDate DESC) AssignedDate,
UF.Name Facility, UT.Name [Type],
C.CaseNumber Batch, C.ACHA ACHA, J.Noofaccounts,
[BatchStartdate] = Convert(varchar(10), (select top 1 StatusOnUTC from log_CaseStatus where CaseID = C.CaseID and [email protected] order by StatusOnUTC asc),20),
[AccountProcessed]=(select COUNT(*) from Account ACC inner join log_AccountStatus LA on LA.AccountID = ACC.AccountId where ACC.CaseId = C.CaseID and [email protected]),
[ClarificationLog] =(select dbo.[Exat_GetClarificationCount](C.CaseID)),
[Status] = (select Name from [MasterStatus] where StatusId = (select [dbo].[GetStatusIdByCaseID](C.CaseID))),
[Reviewer] =(select SUBSTRING((SELECT ('','' + DisplayName) from um_user where UserID in
(select UserID from AssignedCase where CaseID = C.CaseID and [Type] in(''DC'',''Demo'',''Charges''))FOR XML PATH('''')), 2, 1000)),
[Auditor] =(select SUBSTRING((SELECT ('','' + DisplayName) from um_user where UserID in
(select ValidatedBy from Account where Validated = 1 and CaseID = C.CaseID)FOR XML PATH('''')), 2, 1000)),
[AuditCount] = (select Count(*) from Account where CaseID = C.CaseID),
[Errors] = (select Count(*) from log_AccountError LA inner join Account ACO on ACO.AccountID = LA.AccountID where ACO.CaseID = C.CaseID)
from [Job] J inner join [Case] C on J.JobID = C.JobID
inner join log_casestatus lcs on lcs.caseid=c.caseid
inner join [Account] A on C.CaseID = A.CaseID inner join [AssignedCase] AC on AC.CaseID = C.CaseID
inner join um_Facility UF on UF.FacilityID = J.FacilityID
inner join um_Type UT on UT.TypeID = J.TypeID
inner join log_AccountStatus LA on LA.AccountID = A.AccountID)A where 1=1 '[email protected]+'')
End
提高所述SP性能的任何线索?
在此先感谢。
你是否能够添加主查询的执行计划 – pacreely
在执行计划主选择A. *,......花了99%的成本。所有其他需要1%。 –
查看性能改进之前我建议您尝试停止使用EXEC并将其转换为sp_ExecuteSQL。 EXEC很容易发生SQL注入。 – pacreely