환경 :
SQL Server 2005를 실행하는 두 개의 32 비트 Windows Server 2003 R2 시스템이 있습니다. 하드웨어 구성은 Xeon 5160 CPU, 4GB RAM 및 13GB RAID0를 가진 동일한 서버입니다. AWE 및 / 3GB 플래그가 활성화되어 있지 않습니다.
서버는 사전 정의 된 설치 점검 목록을 사용하여 나란히 설정되었으며 설치된 모든 소프트웨어는 두 시스템에서 동일합니다.
우리가 확인하는 모든 SQL Server 설치 설정과 패치 수준은 동일합니다. 한 가지 차이점은 TEMPDB가 빠른 시스템에서 400MB이고 느린 시스템에서 1.2GB라는 것입니다. 그러나 두 경우 모두 TEMPDB 할당이 발생하지 않습니다.
문제 :
저장 프로시 저는 한 쪽에서 2 초 안에 실행되지만 다른 쪽에서는 15 분 안에 실행됩니다. 추가 15 분 동안 디스크 작업이 거의 없거나 메모리 사용량이 변경되지 않지만 한 CPU 코어가 전체 시간에 100 %로 고정됩니다.
이 동작은 데이터베이스가 한 데이터베이스에서 백업되고 다른 데이터베이스로 복원 된 경우에도 지속됩니다.
이 저장 프로 시저이기 때문에, 활동 모니터와 프로파일 러는 우리에게 대한 세부 사항이 표시되지 않는 경우 저장 프로 시저이 높은 CPU 활동이 발생하고 있습니다.
질문:
우리는 무엇을 더 살펴 봐야합니까?
후속 조치 :
다음 커서 정의에 대한 FETCH NEXT 문에서 느림이 발생합니다.
DECLARE C CURSOR FOR
SELECT X, Y
FROM dbo.A
WHERE X NOT IN (SELECT X FROM dbo.B)
AND Z <=0
...
<snip>
...
FETCH NEXT FROM C INTO @X, @Y
FETCH NEXT FROM C INTO @X, @Y
...
약 1000 개의 행만 포함하는 테이블의 각 FETCH 문에는 약 7.25 분이 필요합니다. (아니요, 왜 두 행을 계속하는지 개발자에게 물어볼 필요는 없지만 두 서버에서 올바르게 실행됩니다).
Virtual Reads가 실제로 높은 것처럼 보이기 때문에 "NOT IN (SELECT ...)"에 대해서는 조금 의심이됩니다.