답변:
일반적으로 보이는 전체 메시지 :
잠금에서 트랜잭션 (프로세스 ID 53)이 교착 상태에 빠졌습니다 | 통신 버퍼 자원을 다른 프로세스와 교착 상태로 선택했습니다. 트랜잭션을 다시 실행하십시오.
이 잠금 유형은 일반적으로 SQL Server가 병렬로 실행 한 교착 상태 쿼리 (때때로 "쿼리 내부 병렬 교착 상태"라고 함)에서 볼 수 있습니다. 나는 이것이 또한 시스템 리소스가 적다는 것을 나타내는 몇 가지 진술을 보았습니다.
병렬 교착 상태인지 여부를 결정하는 일반적인 지침은 XML 교착 상태 그래프를 당기는 것입니다 (2008 년의 system_health 세션에서 수행 할 수 있음). 실행 스택.
또한 교착 상태 그래프의 자원 목록을보고 웨이터 이벤트 유형을 기록하십시오. 가장 일반적으로 "e_xxxxxx"또는 다음과 같이 표시됩니다.
<waiter-list>
<waiter event="e_waitPipeGetRow" type="consumer" id="process821d828" />
<waiter event="e_waitPipeGetRow" type="consumer" id="process8209198" />
<waiter event="e_waitPipeGetRow" type="consumer" id="process3827c18" />
<waiter event="e_waitPipeGetRow" type="consumer" id="process3809eb8" />
<waiter event="e_waitPipeGetRow" type="consumer" id="process8226b08" />
<waiter event="e_waitPipeGetRow" type="consumer" id="process9acb6d8" />
<waiter event="e_waitPipeGetRow" type="consumer" id="process6188d7828" />
<waiter event="e_waitPipeGetRow" type="consumer" id="process381cef8" />
</waiter-list>
이 문제를 시도하고 해결하기 위해 다양한 경로가 온라인과 책으로 제공됩니다. 나는 일반적으로 쿼리 / 프로 시저의 실행 계획을 살펴보고 병렬 실행을 보여주는 영역에 중점을 둡니다. 그런 다음 쿼리를 먼저 조정하려고 시도한 다음 마지막 힌트로 쿼리 힌트를 사용할 수 있습니다.
이러한 교착 상태를 해결하기 위해 언급 된 가장 일반적인 쿼리 힌트는 구현 MAXDOP 1
입니다. 그러나이를 수행하기 전에 서버 레벨 MAXDOP 및 비용 임계 값이 설정되어 있는지 확인할 수 있습니다. 비용 임계 값은 일반적으로 기본적으로 5로 설정되어 있으며 시작하려면 35 또는 40으로 높이고 싶습니다. 문제가되는 쿼리가 해당 코드 섹션의 비용이 낮 으면 전혀 병렬로 실행할 필요가 없습니다. 나는 MAXDOP 쿼리 힌트를 사용하는 것을 좋아하지는 않지만 그것이 그들의 위치와 목적이 없다는 것을 의미하지는 않습니다. 그냥 내 의견.