데이터베이스 개발자 Tip & 강좌

SQLER의 개발자들이 만들어가는 데이터베이스 사용자 Tip & 강좌 게시판입니다. SQL서버, Oracle, MySQL 등 여러 클라우드/오픈소스 기반 데이터베이스 개발 및 운영 관련 팁과 쿼리 노하우를 이곳에서 가장 먼저 접하실 수 있습니다. 많은 도움 되시길 바랍니다.

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
1790 메모리 관리 아키텍처 – 버퍼 관리_페이지 읽기 jevida(강성욱) 2016.09.28 1250
1789 메모리 관리 아키텍처 – 버퍼 관리 jevida(강성욱) 2016.09.28 1808
1788 메모리 관리 아키텍처 – Min/Max Server Memory 효과 jevida(강성욱) 2016.09.28 2549
1787 메모리 관리 아키텍처 – 동적 메모리 관리 jevida(강성욱) 2016.09.28 1364
1786 메모리 관리 아키텍처 – 프로세스 주소 공간 jevida(강성욱) 2016.09.28 1363
1785 메모리 관리 아키텍처 – 메모리 아키텍처 jevida(강성욱) 2016.09.28 1867
1784 데이터 압축 상태에 대한 개체 크기 예상 jevida(강성욱) 2016.09.28 1365
1783 sp_MSforeachdb, sp_MSforeachtable 프로시저 활용하기 jevida(강성욱) 2016.09.28 2861
1782 SQL Server 쿼리 처리 아키텍처_분산 쿼리 아키텍처 jevida(강성욱) 2016.09.28 1145
1781 SQL Server 쿼리 처리 아키텍처_병렬 쿼리 처리 - 병렬 인덱스 작업 jevida(강성욱) 2016.09.28 1338
1780 SQL Server 쿼리 처리 아키텍처_병렬 쿼리 처리 - 병렬 처리 수준 jevida(강성욱) 2016.09.28 1846
» SQL Server 쿼리 처리 아키텍처_병렬 쿼리 처리 jevida(강성욱) 2016.09.28 1781
1778 SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 - Preparing SQL Statements jevida(강성욱) 2016.09.28 1008
1777 SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 - 강제 매개 변수화 jevida(강성욱) 2016.09.28 998
1776 SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 - 단순 매개 변수화 jevida(강성욱) 2016.09.28 879
1775 SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 - 매개 변수 및 실행 계획 재사용 jevida(강성욱) 2016.09.28 1096
1774 SQL Server 쿼리 처리 아키텍처_실행 계획 캐싱 및 다시 사용 jevida(강성욱) 2016.09.28 1434
1773 DMV를 이용한 캐시된 저장 프로시저 통계 정보 확인 jevida(강성욱) 2016.09.28 979
1772 SQL Server 쿼리 처리 아키텍처_저장 프로시저 및 트리거 실행 jevida(강성욱) 2016.09.27 941
1771 SQL Server 쿼리 처리 아키텍처 _ SQL 문 처리 (4/4) – 분산형 분할 뷰(View) 확인 jevida(강성욱) 2016.09.27 1337





XE Login