SQL Server 쿼리 처리 아키텍처_병렬 쿼리 처리
- Version : SQL Server 2005, 2008, 2008R2, 2012
SQL Server에서 CPU를 두 개 이상 사용하는 컴퓨터에서는 운영체제의 다중 스레드로 쿼리나 인덱스 작업을 병렬 수행 할 수 있음으로 작업을 빠르고 효율적으로 완료 할 수 있다.
쿼리를 최적화 하는 동안 SQL Server는 병렬 실행에 적합한 쿼리 인덱스 작업을 찾는다. 이러한 쿼리에 대해 SQL Server는 쿼리 실행 계획에 교환 연산자를 삽입하여 병렬 실행할 쿼리를 준비한다. 교환 연산자는 프로세스 관리, 데이터 재배포 및 흐름 제어를 제공하는 쿼리 실행 계획의 연산자이다.
교환연산자에는 하위 유형으로 Distribute Streams, Repartition Streams, Gather Streams 논리 연산자가 포함되어 있다. 이중 하나 이상이 병렬 쿼리를 위한 쿼리 계획의 실행 계획 출력에 표시 될 수 있다.
[Distribute Streams]
[Repartition Streams]
[Gather Streams]
[XML 실행 계획]
특정 작업에서 병렬 처리시 사용된 스레드 개수와 처리 행 수 등을 확인 할 수 있다.
교환 연산자를 삽입하면 병렬 쿼리 실행 계획이 완성 된다. 병렬 쿼리 실행 계획은 스레드를 여러 개 사용 할 수 있다. 병렬이 아닌 쿼리에 사용하는 직렬 실행 계획은 실행한 한 스레드만 사용한다. 병렬에 사용된 실제 스레드 수는 쿼리 계획 실행 초기화 시 결정되며 계획의 복잡성과 병렬 처리 수준에 사용할 최대 CPU 수가 결정 된다.(사용할 스레드 수를 의미하지는 않음)
병렬 처리 수준 값은 서버 수준에서 설정되며 sp_configure 시스템 저장 프로시저를 사용하여 수정 할 수 있다. MAXDOP 또는 쿼리힌트 MAXDOP 인덱스 옵션을 지정하여 개별 쿼리나 인덱스 문에 대해 이 값을 재정의 할 수 있다.
[sp_configure]
SQL Server MAX DOP 설정 : http://sqlmvp.kr/140176043445
[쿼리 힌트]
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total FROM Sales.SalesOrderDetail WHERE UnitPrice < $5.00 GROUP BY ProductID, OrderQty ORDER BY ProductID, OrderQty OPTION (MAXDOP 2); GO |
SQL Server쿼리 최적화 프로그램은 다음의 조건이 있을 때 병렬 실행 계획을 사용하지 않는다.
- 쿼리의 직렬 실행 비용이 크지 않아 병렬 실행 계획을 대안으로 고려할 필요가 없다
- 직렬 실행 계획이 특정 쿼리에 사용한 병렬 실행 계획보다 더 빠르다
- 쿼리에 병렬로 실행 할 수 없는 스칼라 또는 관계형 연산자가 포함되어 있다. 특정 연산자는 쿼리 계획의 한 섹션이 직렬모드로 실행 되도록 하거나 전체 계획이 직렬 모드로 실행 되도록 할 수 있다.
[참고자료]
- Parallelism I :http://www.qdpma.com/cbo/cbo07_parallelismi.html
2013-05-16 / 강성욱 / http://sqlmvp.kr
'SQL Server > SQL Server Tip' 카테고리의 다른 글
SQL Server 쿼리 처리 아키텍처_병렬 쿼리 처리 - 병렬 인덱스 작업 (0) | 2015.07.22 |
---|---|
SQL Server 쿼리 처리 아키텍처_병렬 쿼리 처리 - 병렬 처리 수준 (0) | 2015.07.22 |
SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 - Preparing SQL Statements (0) | 2015.07.22 |
SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 – 강제 매개 변수화 (0) | 2015.07.22 |
Event log 기록 실패로 인한 SQL Agent Service 시작 실패 (0) | 2015.07.21 |