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쿼리 최적화 프로그램은 다음의 조건이 있을 때 병렬 실행 계획을 사용하지 않는다.

  • 쿼리의 직렬 실행 비용이 크지 않아 병렬 실행 계획을 대안으로 고려할 필요가 없다
  • 직렬 실행 계획이 특정 쿼리에 사용한 병렬 실행 계획보다 더 빠르다
  • 쿼리에 병렬로 실행 할 수 없는 스칼라 또는 관계형 연산자가 포함되어 있다. 특정 연산자는 쿼리 계획의 한 섹션이 직렬모드로 실행 되도록 하거나 전체 계획이 직렬 모드로 실행 되도록 할 수 있다.

 

 

 

[참고자료]

 

 


강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp

No. Subject Author Date Views
Notice SQL강좌: 챗GPT와 함께 배우는 SQL Server 무료 강좌 목차와 소개 (2023년 9월 업데이트) 코난(김대우) 2023.08.18 37971
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 20648
1794 메모리 관리 아키텍처 – NUMA 지원 방법 jevida(강성욱) 2016.09.29 1629
1793 메모리 관리 아키텍처 – NUMA(Non-Uniform Memory Access)이해 jevida(강성욱) 2016.09.29 1512
1792 메모리 관리 아키텍처 – Hot Add 메모리 jevida(강성욱) 2016.09.28 979
1791 메모리 관리 아키텍처 – 버퍼 관리_페이지 쓰기 jevida(강성욱) 2016.09.28 1127
1790 메모리 관리 아키텍처 – 버퍼 관리_페이지 읽기 jevida(강성욱) 2016.09.28 1310
1789 메모리 관리 아키텍처 – 버퍼 관리 jevida(강성욱) 2016.09.28 1939
1788 메모리 관리 아키텍처 – Min/Max Server Memory 효과 jevida(강성욱) 2016.09.28 2640
1787 메모리 관리 아키텍처 – 동적 메모리 관리 jevida(강성욱) 2016.09.28 1413
1786 메모리 관리 아키텍처 – 프로세스 주소 공간 jevida(강성욱) 2016.09.28 1422
1785 메모리 관리 아키텍처 – 메모리 아키텍처 jevida(강성욱) 2016.09.28 1954
1784 데이터 압축 상태에 대한 개체 크기 예상 jevida(강성욱) 2016.09.28 1432
1783 sp_MSforeachdb, sp_MSforeachtable 프로시저 활용하기 jevida(강성욱) 2016.09.28 3310
1782 SQL Server 쿼리 처리 아키텍처_분산 쿼리 아키텍처 jevida(강성욱) 2016.09.28 1213
1781 SQL Server 쿼리 처리 아키텍처_병렬 쿼리 처리 - 병렬 인덱스 작업 jevida(강성욱) 2016.09.28 1436
1780 SQL Server 쿼리 처리 아키텍처_병렬 쿼리 처리 - 병렬 처리 수준 jevida(강성욱) 2016.09.28 1977
» SQL Server 쿼리 처리 아키텍처_병렬 쿼리 처리 jevida(강성욱) 2016.09.28 1841
1778 SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 - Preparing SQL Statements jevida(강성욱) 2016.09.28 1079
1777 SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 - 강제 매개 변수화 jevida(강성욱) 2016.09.28 1068
1776 SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 - 단순 매개 변수화 jevida(강성욱) 2016.09.28 951
1775 SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 - 매개 변수 및 실행 계획 재사용 jevida(강성욱) 2016.09.28 1174





XE Login