2015-01-21 3 views
1

MS SQL 2012를 실행하는 2 대의 MS SQL 서버가 있습니다. 하나는 8GB RAM, 2 프로세서 및 충분한 저장 공간이 있습니다. 다른 하나는 8 개의 프로세서, 64GB RAM, 데이터, 프로그램, 로그 및 tempdb가 분리 된 여러 첨부 드라이브가 있습니다.더 느린 컴퓨터에서 더 빠른 SQL 쿼리

대개 큰 서버는 쿼리가 빠릅니다. 그러나 간단한 쿼리에서 작은 시스템에는 10 초가 소요되고 다른 시스템에는 5 분이 소요됩니다. 우리가 결정할 수있는 한 SQL Server 설정은 동일하고 데이터는 동일하며 쿼리는 두 시스템에서 동일하며 예상 된 실행 계획과 실제 실행 계획은 두 시스템에서 동일하지만 큰 시스템은 느립니다 . Tempdb는 작은 컴퓨터의 SQL.exe와 같은 디스크에있는 하나의 파일이고 큰 컴퓨터의 SSD 드라이브에는 tempdb에 8 개의 파일이 있습니다.

큰 머신에서 작은 머신보다 쿼리가 느린 이유를 확인하기 위해 수행 할 수있는 단계는 무엇입니까?

쿼리는 다음과 같습니다

SELECT field1, field2 
FROM lookuptable1 
WHERE field2 <> '' 
AND field1 not in (SELECT field1 
    FROM lookuptable2 
) 

우리는 작은에 큰 기계와 4 병렬 작업에 대한 16 개 스레드를 가지고있다. 쿼리는 아무런 값도 반환하지 않지만 더 큰 시스템에서는 훨씬 느립니다. 통계가 다시 작성되고 쿼리 계획이 플러시됩니다.

+0

데이터가 동일하다고 확신하는 경우 다음 단계는 구조가 동일해야합니다 (제약 조건, 트리거, 인덱스 ...) – DrCopyPaste

+0

흠, 실제 실행 계획이 동일하다고합니까? 다시 확인, 데이터가 동일합니다; 수동으로 쿼리를 실행하십시오 (프로파일 러를 사용하여 쿼리를 검사 했습니까?). 또한 단순히 "큰 서버"가 실행 계획이 최적 일 수 있음을 의미하지만 작은 것보다 더 많은 화재가있을 수 있지만 서버가 많이 사용되므로 조금만 기다려야 할 수 있습니다 ... – DrCopyPaste

+0

'set statistics io on'으로 두 머신에서 실행 한 결과? 'set showplan_xml on'을 사용하면 diff 도구를보고 통찰력을 얻을 수 있습니다. –

답변

-1

존재하는지 확인 (vs IN)이 차이를 만들 수 있습니다.

SELECT field1, field2 
FROM lookuptable1 outerTableAlias 
WHERE field2 <> '' 
AND not exists (SELECT * 
    FROM lookuptable2 innerTable where innerTable.field1 = outerTableAlias.field1) 

)

은하지 않고 쿼리를보십시오 "FIELD2 <> '' '. 이것은 table_scan에 대해 매우 의심스러운 장소입니다.

+0

IN 대 EXISTS 쿼리에 대한 나의 경험은 테스트를 거쳐야한다는 것입니다. 하지만 downvote 주셔서 감사합니다 ............. – granadaCoder

+0

그것은 내 downvote 아니었지만 당신은 IN을 사용하는 등 광범위한 주장을하기 전에이 문서를 읽고 싶지 수도 있습니다. http://sqlinthewild.co.za/index.php/2009/08/17/exists-vs-in/ 나는 여기서 당신의 예와 같이 존재를 사용하는 경향이있다. <> '를 간단하게하는 것은 간단합니다. >로 변경하십시오. '' –

+0

기사 참조 주셔서 감사합니다. 나는 "try out"과 독단적 인 진술을하기 위해 나의 지위를 바꿨다. 개인적으로, 나는 존재하는 것이 큰 차이를 만든 내 인생에서 약 3 개의 쿼리를 보았습니다. 또한 중첩 된 IN 절을 좋아하는 개발자도있었습니다. 그리고 3 개월 후에이 사람은 당신에게 왜 (이 동일한 사람이) 그런 식으로 그것을 썼는지 말할 수 없었습니다. 그래서 나는 지쳤다. – granadaCoder