주말에 SQL Server 2000에서 2008로 업그레이드되었습니다. 이제 하나의 쿼리가 실제로 느리게 실행됩니다 (약 50 개 행에 대해 30 초 이상).Sql Server 2008로 업그레이드되었습니다. 이제는 하나의 쿼리가 실제로 느리게 실행 중입니다.
쿼리는 다음과 같습니다
SELECT TOP 200 AccData.SurName + ', ' + AccData.FirstNames AS Name,
DATEDIFF(day, COALESCE (AccData.DateReceived, AccData.DateOpened,
AccData.InjuryDate),
GETDATE()) AS Duration, AccData.M46No, Clients.ClientName,
AccData.HomePhone, AccData.WorkPhone, AccData.InjuryDate,
AccData.ClaimID,
luClaimStatus.Meaning AS Status, AccData.Claim,
vw_LastMedCert.Fitness, vw_LastMedCert.UntilDate
FROM AccData INNER JOIN
Clients ON AccData.ClientID = Clients.ID
INNER JOIN
luClaimStatus ON AccData.ClaimStatus = luClaimStatus.ClaimStatus
LEFT OUTER JOIN
vw_LastMedCert ON AccData.Claim = vw_LastMedCert.Claim
WHERE AccData.ClientID>1 and CaseManagerId = :CaseManagerID
and (DateClosed is null or AccData.ClaimStatus ='R')
order by Surname, FirstNames
문제는 LastMedCert
ALTER VIEW [dbo].[vw_LastMedCert] WITH SCHEMABINDING
AS
SELECT Claim, ClaimId, ReferralID, FromDate, UntilDate, Fitness, DateSeen,
DateEntered, PeriodFor
FROM dbo.Med_cert
WHERE (ReferralID IN
(SELECT MAX(ReferralID) AS MaxOfReferralID
FROM dbo.Med_cert AS Med_cert_1
WHERE (Fitness IS NOT NULL)
GROUP BY Claim))
어떤 아이디어가 함께 할 수있는 뭔가가? 나는 인덱스를 다시 작성 및 통계
를 업데이트 한실행 계획은 다음과 같습니다
|--Compute Scalar(DEFINE:([Expr1020]=datediff(day,[Expr1024],getdate())))
|--Nested Loops(Left Outer Join, OUTER REFERENCES:([CmsDB].[dbo].[AccData].[Claim]))
|--Nested Loops(Inner Join, OUTER REFERENCES:([CmsDB].[dbo].[AccData].[ClientID]))
| |--Nested Loops(Inner Join, OUTER REFERENCES:([CmsDB].[dbo].[AccData].[ClaimStatus]))
| | |--Compute Scalar(DEFINE:([Expr1019]=((([CmsDB].[dbo].[AccData].[SurName]+', ')+[CmsDB].[dbo].[AccData].[FirstNames])+' ')+CASE WHEN [CmsDB].[dbo].[AccData].[MiddleNames] IS NOT NULL THEN [CmsDB].[dbo].[AccData].[MiddleNames] ELSE '' END, [Expr1024]=CASE WHEN [CmsDB].[dbo].[AccData].[DateReceived] IS NOT NULL THEN [CmsDB].[dbo].[AccData].[DateReceived] ELSE CASE WHEN [CmsDB].[dbo].[AccData].[DateOpened] IS NOT NULL THEN [CmsDB].[dbo].[AccData].[DateOpened] ELSE [CmsDB].[dbo].[AccData].[InjuryDate] END END))
| | | |--Nested Loops(Inner Join, OUTER REFERENCES:([Uniq1002], [CmsDB].[dbo].[AccData].[Claim], [CmsDB].[dbo].[AccData].[SurName], [CmsDB].[dbo].[AccData].[FirstNames], [Expr1027]) WITH ORDERED PREFETCH)
| | | |--Index Seek(OBJECT:([CmsDB].[dbo].[AccData].[IX_AccData_ByCaseManagerId]), SEEK:([CmsDB].[dbo].[AccData].[CaseManagerID]=(100346)) ORDERED FORWARD)
| | | |--Clustered Index Seek(OBJECT:([CmsDB].[dbo].[AccData].[byName]), SEEK:([CmsDB].[dbo].[AccData].[SurName]=[CmsDB].[dbo].[AccData].[SurName] AND [CmsDB].[dbo].[AccData].[FirstNames]=[CmsDB].[dbo].[AccData].[FirstNames] AND [CmsDB].[dbo].[AccData].[Claim]=[CmsDB].[dbo].[AccData].[Claim] AND [Uniq1002]=[Uniq1002]), WHERE:([CmsDB].[dbo].[AccData].[ClientID]>(1) AND ([CmsDB].[dbo].[AccData].[DateClosed] IS NULL OR [CmsDB].[dbo].[AccData].[ClaimStatus]='R')) LOOKUP ORDERED FORWARD)
| | |--Clustered Index Seek(OBJECT:([CmsDB].[dbo].[luClaimStatus].[PK_luClaimStatus_1__172]), SEEK:([CmsDB].[dbo].[luClaimStatus].[ClaimStatus]=[CmsDB].[dbo].[AccData].[ClaimStatus]) ORDERED FORWARD)
| |--Index Seek(OBJECT:([CmsDB].[dbo].[Clients].[PK_Clients_2__13]), SEEK:([CmsDB].[dbo].[Clients].[ID]=[CmsDB].[dbo].[AccData].[ClientID]), WHERE:([CmsDB].[dbo].[Clients].[ID]>(1)) ORDERED FORWARD)
|--Nested Loops(Inner Join, WHERE:([Expr1018]=[CmsDB].[dbo].[Med_cert].[ReferralID]))
|--Clustered Index Seek(OBJECT:([CmsDB].[dbo].[Med_cert].[byClaim]), SEEK:([CmsDB].[dbo].[Med_cert].[Claim]=[CmsDB].[dbo].[AccData].[Claim]) ORDERED FORWARD)
|--Table Spool
|--Stream Aggregate(GROUP BY:([CmsDB].[dbo].[Med_cert].[Claim]) DEFINE:([Expr1018]=MAX([CmsDB].[dbo].[Med_cert].[ReferralID])))
|--Clustered Index Scan(OBJECT:([CmsDB].[dbo].[Med_cert].[byClaim]), WHERE:([CmsDB].[dbo].[Med_cert].[Fitness] IS NOT NULL) ORDERED FORWARD)
내가 초기 쿼리를 다시 작성하여 솔루션을 해결했다. 이제 약 1 초 후에 실행되지만, 무엇이 잘못되었는지 계속 알고 싶기 때문에 다시 나타나는 경우 문제를 해결할 수 있습니다.
요약 매개 변수에 따라 초기 쿼리 실행 시간이 약 2 분입니다. exeqution 계획 및 dm_db_missing_index_details에서 제안한대로 인덱스를 추가하면 실행 시간이 약 4 초로 단축됩니다. 해시 힌트를 추가하면 실행 시간이 2 초로 단축되었습니다.
어떤 대답을 수락할지 결정하는 것이 힘들었습니다. 대부분의 대답은 도움이되었습니다.
쿼리 계획은 어떻게 생겼습니까? –