6500 검사기에 대해 일부 통계를 실행하도록 SQL 쿼리를 설계했지만 너무 오래 걸립니다. sql에는 다른 많은 선택 쿼리가 있지만 실행 중입니다. 그러나 "TotalVisitsWithAtLeastOneReport"선택이 매우 느리게 실행됩니다.쿼리가 매우 느리게 실행 중입니다.
요건 :
Inspectors: InspectorID
InspectionScope: ScopeID, InspectorID (FK)
Visits: VisitID, VisitDate ScopeID (FK)
VisitsDoc: DocID, DocType, VisitID (FK)
SQL :
방문 문서 (1 또는 2 또는 13)에 업로드 한 각 검사테이블에 대한 방문
- 번호
이DECLARE @DateFrom90 date, @DateTo date, @DateFrom180 date, @DateFrom date; SELECT @DateTo = CAST(GETDATE() AS DATE) ,@DateFrom90 = CAST(GETDATE() - 90 AS DATE) ,@DateFrom180 = CAST(GETDATE() - 180 AS DATE) DECLARE @Inspectors TABLE ( InspectorID int, InspectorGrade int, DateFrom date, DateTo date ); insert into @inspectors ( InspectorID , InspectorGrade, DateFrom , DateTo ) select tmp.InspectorID , tmp.InspectorGrade ,case when tmp.VisitWithReport = 0 then @DateFrom180 else @DateFrom90 end StartDate ,@DateTo EndDate from ( select i.InspectorID , i.InspectorGrade ,VisitWithReport = (select COUNT(v.visitid) from visits v inner join InspectionScope s on s.ScopeID = v.ScopeID where v.ReportStandard not in (0,9) and v.VisitType = 1 and v.VisitDate BETWEEN @DateFrom90 and @DateTo and s.InspectorID = i.InspectorID) from inspectors i ) tmp; SELECT i.InspectorID , i.InspectorGrade ,TotalVisitsWithAtLeastOneReport = (select COUNT(distinct v.visitID) from Visits v inner join InspectionScope s on s.ScopeID = v.ScopeID inner join VisitDocs vd on vd.VisitID = v.VisitID where vd.DocType IN (1,2,13) and s.InspectorID = i.InspectorID and v.VisitDate BETWEEN i.DateFrom and i.DateTo ) from @Inspectors i
select i.InspectorID , i.InspectorGrade ,VisitWithReport = (select COUNT(v.visitid) from visits v inner join InspectionScope s on s.ScopeID = v.ScopeID where v.ReportStandard not in (0,9) and v.VisitType = 1 and v.VisitDate BETWEEN @DateFrom90 and @DateTo and s.InspectorID = i.InspectorID) from inspectors i
을 수행하지 않는
좋은 검색어입니다. 너는 더 나은 선택권이있다. – johnny
커서가 느리기 때문에이 속도가 느립니다. –
'COUNT (v.visitid)'와'COUNT (distinct v.visitID) '에있는 해당 subselect는 전체 스크립트에 대해 취해진 실행 계획을 (그림) 포함시켜야한다는 것을 의미합니다. – DrCopyPaste