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

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

CPU 리소스 상태에 따른 병렬 처리 제한

 

  • Version : SQL Server 2005, 2008, 2008R2, 2012

 

우리는 SQL Server에서 코어가 2개 이상일 경우 병렬 처리를 수행 할 수 있다는 것은 잘 알고 있다. 그런데 동일한 쿼리이면서 병렬 실행계획까지 똑같은데 왜 실행 시간이 다를까?

CPU와 병렬처리간에 어떤 상관관계가 있는지 알아 보자.

 

결론은 쿼리를 병렬로 컴파일 할 때 여러 스레드로 실행 된다는 보장은 없다. SQL Server는 시스템 부하에 따라 병렬로 수행하지 않도록 선택한다. 서버가 매우 바쁜 경우 불특정한 응답 시간을 나타낸다.

 

이번 포스트는 CSS SQL Server Engineer 팀블로그에 게제되어 있는 내용으로 필자가 읽고 이해한 내용을 바탕으로 정리 하였으며 번역의 오류나 기술적 오류가 있음을 인지한다. 가급적 원문을 참고하길 바란다.

 

40코어 시스템에서 스트레스 테스트를 수행하였다. 쿼리는 반복적으로 실행 되었으며 쿼리의 작업은 CPU 집중적이었으며 병렬 계획이 생성 되었다. 여러 사용자가 같은 쿼리를 동시에 테스트를 진행 하였으며 이때 발견한 것은 어떤 연결의 쿼리는 다른 사람의 쿼리보다 훨씬 적은 시간 동안 실행 되었다.

 

우리는 서로 다른 쿼리 계획이 실행되는지 확인 하였다. 하지만 쿼리 실행계획은 동일 하였다. 원인은 쿼리가 실행 될 때의 CPU 사용량과 관련이 있었다. 쿼리가 실행 될 때 SQL Server는 부하에 따라 각 쿼리를 실행을 위해 얼마나 많은 스레드를 사용할지 결정했다. 즉 여러 사용자가 스트레스 테스트를 진행하는 과정에서 CPU 사용량이 증가 하였고 SQL Server는 순차적으로 쿼리 일부를 수행 한 것이다. 실행 계획은 병렬계획이었지만 실제로는 여러 스레드로 실행되지 않았다.

 

이 문제를 발견하기는 쉽지 않았다. 이 문제를 확인 하기 위해서는 "showplan XML Statistics Profile" 추적 이벤트로 정보를 얻을 수 있다.

 

다음 그림을 보면 실행계획에서 빌드 및 프로브 작업이 병렬화 되어 있는 것을 확인 할 수 있다, 그러나 자세히 보면 그림1은 직렬, 그림 2는 병렬로 처리 된 것을 확인 할 수 있다.

 

 

이를 식별하는 또 다른 방법은 XML 실행 계획에서 RunTimeCountersPerThread Thread="0" 은 병렬화 되지 않았다는 것을 뜻한다.

 

다음의 예시를 참고여 확인 할 수 있다.

<RunTimeCountersPerThread Thread="2" ActualRows="63125" Batches="0" ActualExecutionMode="Row" ActualEndOfScans="1" ActualExecutions="1" />

 

< RunTimeCountersPerThread Thread="1" ActualRows="75847" Batches="0" ActualExecutionMode="Row" ActualEndOfScans="1" ActualExecutions="1" />

 

< RunTimeCountersPerThread Thread="0" ActualRows="0" ActualEndOfScans="0" ActualExecutions="0" />

 

 

고도의 동시성이나 균일한 응답성을 원한다면 SQL Server의 시스템 부하를 체크하고 DOP 지정 및 쿼리 수정을 통하여 고도화 작업을 할 수 있도록 하자.

 

[참고자료]

http://blogs.msdn.com/b/psssql/archive/2012/12/21/uneven-query-executions-with-parallelism.aspx

 

 



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

No. Subject Author Date Views
1831 SQL Server CREATE TABLE syntax diagrams jevida(강성욱) 2016.09.30 1421
1830 SQL Server 2012 Sp1 설치 이슈 및 해결 jevida(강성욱) 2016.09.30 1582
1829 SSD에서 DBCC CHECKDB 성능 벤치마킹 jevida(강성욱) 2016.09.30 1932
1828 Collation에 따른 ALTER DATABASE 실패 jevida(강성욱) 2016.09.30 1942
1827 LDF 파일이 잘리지 않는 이유 jevida(강성욱) 2016.09.30 2054
1826 Tempdb 경합 확인 및 해결 (Tempdb Contention) jevida(강성욱) 2016.09.30 2222
1825 SQL Server IO 병목 확인과 오해 jevida(강성욱) 2016.09.30 2512
1824 SQL Version에 따른 sp_prepare 정보 반환 jevida(강성욱) 2016.09.30 1717
1823 DReplay 활성 세션 초과 에러 jevida(강성욱) 2016.09.30 1543
1822 저장 프로시저 내 임시 테이블 사용과 프로시저 재컴파일 jevida(강성욱) 2016.09.30 1872
1821 NUMA 노드와 추척플래그 8048 jevida(강성욱) 2016.09.30 820
1820 온라인 인덱스 리빌드와 조각화 증가 jevida(강성욱) 2016.09.30 1608
1819 VARCHAR(MAX) and NTEXT 쿼리 성능 jevida(강성욱) 2016.09.30 4579
» CPU 리소스 상태에 따른 병렬 처리 제한 jevida(강성욱) 2016.09.30 1077
1817 매개변수 값의 변경과 SQL 서버 성능 저하 jevida(강성욱) 2016.09.30 1273
1816 IN 절 사용시 예기치 못한 액세스 위반과 SQL Server 종료 jevida(강성욱) 2016.09.30 1060
1815 SQL 버전과 CLR (.NET Framework 버전에 따른 오류) jevida(강성욱) 2016.09.30 1191
1814 SWITCHOFFSET 내장함수의 잘 못된 예측 - 미리 계산한 값을 쿼리에 연결하여 최적화 하기 jevida(강성욱) 2016.09.30 1331
1813 테이블 반환 매개변수 사용과 SQL 2012의 향상된 캐싱 기능 jevida(강성욱) 2016.09.30 1233
1812 디스크 섹터 크기와 데이터베이스 성능 jevida(강성욱) 2016.09.29 1638





XE Login