머리를 get 수없는 쿼리로 성능 문제가 발생했습니다.
커서 정의에서 쿼리를 가져 왔습니다.
이 쿼리는 실행하는 데 몇 초가 걸립니다
SELECT A.JOBTYPE
FROM PRODROUTEJOB A
WHERE ((A.DATAAREAID=N'IW')
AND ((A.CALCTIMEHOURS<>0)
AND (A.JOBTYPE<>3)))
AND EXISTS (SELECT 'X'
FROM PRODROUTE B
WHERE ((B.DATAAREAID=N'IW')
AND (((((B.PRODID=A.PRODID)
AND ((B.PROPERTYID=N'PR1526157') OR (B.PRODID=N'PR1526157')))
AND (B.OPRNUM=A.OPRNUM))
AND (B.OPRPRIORITY=A.OPRPRIORITY))
AND (B.OPRID=N'GRIJZEN')))
AND NOT EXISTS (SELECT 'X'
FROM ADUSHOPFLOORROUTE C
WHERE ((C.DATAAREAID=N'IW')
AND ((((((C.WRKCTRID=A.WRKCTRID)
AND (C.PRODID=B.PRODID))
AND (C.OPRID=B.OPRID))
AND (C.JOBTYPE=A.JOBTYPE))
AND (C.FROMDATE>{TS '1900-01-01 00:00:00.000'}))
AND ((C.TODATE={TS '1900-01-01 00:00:00.000'}))))))
GROUP BY A.JOBTYPE
ORDER BY A.JOBTYPE
실제 실행 계획은 다음과 같습니다.
서버 전체 설정이 MaxDOP 1로 설정되어 있음을 알았습니다. maxdop 설정으로 놀았습니다.
OPTION (MAXDOP 0)
쿼리에 추가 하거나 서버 설정을 변경하면 성능과 쿼리 계획이 훨씬 향상됩니다.
그러나 해당 응용 프로그램 (Dynamics AX)은 이와 같은 쿼리를 실행하지 않으며 커서를 사용합니다.
실제 코드는 다음과 같습니다.
declare @p1 int
set @p1=189527589
declare @p3 int
set @p3=16
declare @p4 int
set @p4=1
declare @p5 int
set @p5=2
exec sp_cursoropen @p1 output,N'SELECT A.JOBTYPE FROM PRODROUTEJOB A WHERE ((A.DATAAREAID=N''IW'') AND ((A.CALCTIMEHOURS<>0) AND (A.JOBTYPE<>3))) AND EXISTS (SELECT ''X'' FROM PRODROUTE B WHERE ((B.DATAAREAID=N''IW'') AND (((((B.PRODID=A.PRODID) AND ((B.PROPERTYID=N''PR1526157'') OR (B.PRODID=N''PR1526157''))) AND (B.OPRNUM=A.OPRNUM)) AND (B.OPRPRIORITY=A.OPRPRIORITY)) AND (B.OPRID=N''GRIJZEN''))) AND NOT EXISTS (SELECT ''X'' FROM ADUSHOPFLOORROUTE C WHERE ((C.DATAAREAID=N''IW'') AND ((((((C.WRKCTRID=A.WRKCTRID) AND (C.PRODID=B.PRODID)) AND (C.OPRID=B.OPRID)) AND (C.JOBTYPE=A.JOBTYPE)) AND (C.FROMDATE>{TS ''1900-01-01 00:00:00.000''})) AND ((C.TODATE={TS ''1900-01-01 00:00:00.000''})))))) GROUP BY A.JOBTYPE ORDER BY A.JOBTYPE ',@p3 output,@p4 output,@p5 output
select @p1, @p3, @p4, @p5
이 실행 계획을 초래합니다 (불행히도 동일한 수초의 실행 시간).
캐시 된 계획을 삭제하고 커서 정의 내부의 쿼리에 옵션을 추가하는 것과 같은 몇 가지 시도를 시도했지만 ...
또한 커서의 병렬 처리 제한 사항을 찾고있는 Google을 검색했지만 제한 사항을 찾을 수없는 것 같습니다.
여기에 명백한 것이 빠져 있습니까?
실제 SQL 빌드는 SQL Server 2008 (SP1) - 10.0.2573.0 (X64)
지원되지 않는다는 것을 알고 있지만 적합하다고 생각되면이 인스턴스를 업그레이드 할 수 없습니다. 데이터베이스를 다른 서버로 전송해야하므로 느린 WAN을 통해 상당히 큰 압축되지 않은 백업을 가져옵니다.
추적 플래그 4199는 차이가 없으며 OPTION (RECOMPILE)도 마찬가지입니다.
커서 속성은 다음과 같습니다.
API | Fast_Forward | Read Only | Global (0)