6500 검사기에 대해 일부 통계를 실행하도록 커서를 설계했지만 너무 오래 걸립니다. 커서에는 다른 많은 선택 쿼리가 있지만 괜찮아 보이지만 다음 선택은 매우 느리게 실행됩니다. 커서를 선택하지 않으면 쿼리가 완벽하게 정상적으로 실행됩니다.커서가 너무 오래 걸리는 쿼리
요건 :
Inspectors: InspectorID
InspectionScope: ScopeID, InspectorID (FK)
: 방문 문서 (1 또는 2 또는 13)에 업로드 한 각 검사
Visits: VisitID, VisitDate ScopeID (FK)
VisitsDoc: DocID, DocType, VisitID (FK)
테이블에 대한 방문
번호
커서 코드 :
DECLARE
@curInspID int,
@DateFrom date, @DateTo date;
SELECT @DateTo = CAST(GETDATE() AS DATE)
,@DateFrom = CAST(GETDATE() - 90 AS DATE)
DECLARE
@InspectorID int,
@TotalVisits int;
DECLARE @Report TABLE (
InspectorID int,
TotalVisits int)
DECLARE curList CURSOR FOR
SELECT InspectorID FROM Inspectors ;
OPEN curList
FETCH NEXT FROM curList INTO @curInspID;
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT
@curInspID = s.InspectorID
,@TotalVisits = 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 s.InspectorID = @curInspID and vd.DocType IN (1,2,13)
and v.VisitDate BETWEEN @DateFrom and @DateTo
group by s.InspectorID
INSERT INTO @Report VALUES(@curInspID,@TotalVisits);
FETCH NEXT FROM curList INTO @curInspID;
END
CLOSE curList
DEALLOCATE curList
SELECT * FROM @Report
다음 쿼리가 여기에 커서 필요가
,@TotalVisitsWithReportScore = (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 @DateFrom and @DateTo
and s.InspectorID = @curInspID
)
,@TotalVisitsWith_ReportScore_RejectionFeedBack = (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.DiscrepancyType IN (2,5,6,7,8)
and v.VisitDate BETWEEN @DateFrom and @DateTo
and s.InspectorID = @curInspID
)
커서를 사용하여 쿼리를 실행하기 전에 문제가 발생했습니다. 반쯤 취소하면 열려있는 커서가 메모리에 유지됩니다. – Donal
제발, clarify - 동일한 매개 변수를 선택하지만 커서 밖에서 천천히 실행되는 커서 내부의 단일 선택 또는이 선택의 총 6500 반복은 예상보다 느립니다? –
@Andy, 외부 커서 선택은 동일한 매개 변수로 8 초 미만이지만 내부에는 1 분 이상 걸립니다.이 동일한 커서에는 잘 실행되는 많은 다른 선택 쿼리가 있지만이 예제를 더 짧게 만들려면 느리게 실행되는 쿼리를 포함 시켰습니다. – user1263981