병렬 처리 수준
SQL Server에서는 병렬 쿼리 실행 또는 인덱스 DDL(데이터 정의 언어) 작업의 각각의 인스턴스에 대해 가장 적합한 병렬 처리 수준이 자동으로 검색됩니다. 이것은 다음과 조건을 기준으로 수행됩니다.
SMP(대칭적 다중 처리) 컴퓨터와 같이 둘 이상의 마이크로프로세서 또는 CPU가 있는 컴퓨터에서 SQL Server가 실행 중인지 여부
두 개 이상의 CPU가 있는 컴퓨터에서만 병렬 쿼리를 사용할 수 있습니다.
사용할 수 있는 스레드 수가 충분한지 여부
각 쿼리 또는 인덱스 작업을 실행하려면 일정 수의 스레드가 필요합니다. 병렬 계획을 실행하려면 직렬 계획보다 많은 스레드가 필요하고 필요한 스레드의 수는 병렬 처리 수준에 따라 증가합니다. 특정 병렬 처리 수준에 대한 병렬 계획의 스레드 요구 사항이 충족되지 않는 경우에는 데이터베이스 엔진에서 병렬 처리 수준을 자동으로 낮추거나 지정된 작업 컨텍스트의 병렬 계획을 완전히 중단합니다. 그런 다음 하나의 스레드만 사용되는 직렬 계획을 실행합니다.
실행한 쿼리 또는 인덱스 작업의 유형
병렬 계획은 인덱스를 새로 작성 또는 다시 작성하거나 클러스터형 인덱스 및 CPU 주기 사용량이 큰 쿼리를 삭제하는 등의 인덱스 작업에 적합합니다. 예를 들어 대형 테이블의 조인, 대규모 집계 및 대형 결과 집합의 정렬이 병렬 쿼리에 적절합니다. 주로 트랜잭션 처리 응용 프로그램에서 사용되는 단순 쿼리의 경우 이 쿼리를 병렬로 실행하는 데 필요한 추가 조정 작업은 성능을 향상시키기보다는 부담이 됩니다. 데이터베이스 엔진은 병렬 처리에 적합한 쿼리와 그렇지 않은 쿼리를 구분하기 위해 쿼리 또는 인덱스 작업 실행 시 예상되는 비용을 cost threshold for parallelism 값과 비교합니다. 권장되지는 않지만 사용자들은 sp_configure를 사용하여 기본값 5를 변경할 수 있습니다.
처리할 행 수가 충분한지 여부
쿼리 최적화 프로그램에서 행 수가 부족하다고 판단하는 경우 행을 배포하기 위해 교환 연산자를 사용하지 않습니다. 결과적으로 연산자는 직렬로 실행됩니다. 시작, 배포 및 조정 비용이 병렬 연산자 실행으로 얻은 이익보다 큰 경우 연산자를 직렬 계획으로 실행하면 이 시나리오를 피할 수 있습니다.
최신 배포 통계를 사용할 수 있는지 여부
가장 높은 병렬 처리 수준을 제공할 수 없는 경우 병렬 처리를 중단하기 전에 더 낮은 병렬 처리 수준이 가능한지 확인합니다.
예를 들어 뷰에서 클러스터형 인덱스를 만드는 경우 클러스터형 인덱스가 아직 생성되지 않았으므로 배포 통계를 계산할 수 없습니다. 이 경우 데이터베이스 엔진은 이 인덱스 작업에는 가장 높은 병렬 처리 수준을 할당하지 않습니다. 그러나 이 경우에도 정렬 또는 검색과 같은 일부 연산자에는 병렬 처리의 이점이 적용될 수 있습니다.
[!참고]
병렬 인덱스 작업은 SQL Server Enterprise, Developer 및 Evaluation Edition에서만 사용할 수 있습니다.
데이터베이스 엔진은 실행 시 앞서 설명한 현재 시스템 작업과 구성 정보에서 병렬 실행이 가능한지 확인합니다. 병렬 실행이 보장되는 경우 데이터베이스 엔진은 최적의 스레드 수를 결정하고 이 스레드에 병렬 계획을 분산하여 실행합니다. 병렬 실행을 위해 쿼리 또는 인덱스 작업이 여러 스레드에서 실행되기 시작하면 해당 작업이 완료될 때까지 동일한 수의 스레드가 사용됩니다. 데이터베이스 엔진은 프로시저 캐시에서 실행 계획을 가져올 때마다 최적의 스레드 수를 다시 검사합니다. 예를 들어 쿼리를 한 번 실행할 때는 직렬 계획을 사용할 수 있고 동일한 쿼리를 두 번째 실행할 때는 세 개의 스레드를 사용하는 병렬 계획을 사용할 수 있으며 이 쿼리를 세 번째로 실행할 때는 네 개의 스레드를 사용하는 병렬 계획을 사용할 수 있습니다.
병렬 쿼리 실행 계획에서 삽입, 업데이트 및 삭제 작업은 직렬로 실행됩니다. 그러나 UPDATE 또는 DELETE 문의 WHERE 절이나 INSERT 문의 SELECT 부분은 병렬로 실행될 수 있습니다. 그런 다음 실제 데이터 변경 내용은 데이터베이스에 직렬로 적용됩니다.
정적 커서 및 키 집합 커서는 병렬 실행 계획에 따라 채워질 수 있습니다. 그러나 동적 커서의 동작은 직렬 실행에 의해서만 제공될 수 있습니다. 쿼리 최적화 프로그램은 동적 커서에 포함된 쿼리에 대해서는 항상 직렬 실행 계획을 생성합니다.
병렬 처리 수준 재정의
max degree of parallelism 서버 구성 옵션을 사용하여 병렬 계획 실행에 사용할 프로세서 수를 제한할 수 있습니다. 개별 쿼리 및 인덱스 작업 문에 대한 max degree of parallelism 옵션은 MAXDOP 쿼리 힌트나 MAXDOP 인덱스 옵션을 지정하여 재정의할 수 있습니다. MAXDOP 옵션을 사용하면 개별 쿼리 작업과 인덱스 작업을 보다 상세히 제어할 수 있습니다. 예를 들어 MAXDOP 옵션을 사용하여 온라인 인덱스 작업 전용으로 사용되는 프로세서의 수를 늘리거나 줄일 수 있습니다. 이런 방법으로 인덱스 작업에 사용되는 리소스와 동시 사용자의 리소스 간에 균형을 유지할 수 있습니다. max degree of parallelism 옵션을 0으로 설정하면 SQL Server에서는 병렬 계획 실행에 최대 64개의 프로세서까지 모두 사용할 수 있습니다. 쿼리 및 인덱스에 대한 MAXDOP를 0으로 설정하면 SQL Server에서는 병렬 계획 실행에 주어진 쿼리 또는 인덱스에 대해 최대 64개의 프로세서까지 모두 사용할 수 있습니다.