SQL Server : 잠금 통신 버퍼 리소스에서 교착 상태


30

이 교착 상태 유형에 대한 가능한 이유는 무엇입니까? (일반 교착 상태 아님)

통신 버퍼 자원 잠금

이것이 표시된 시스템의 메모리가 부족하고 버퍼 수가 한계를 초과 했습니까?

자세한 오류 :

트랜잭션 (프로세스 ID 59)이 다른 프로세스와의 잠금 통신 버퍼 자원에서 교착 상태가되어 교착 상태 피해자로 선택되었습니다. 거래를 다시 실행

답변:


24

일반적으로 보이는 전체 메시지 :

잠금에서 트랜잭션 (프로세스 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 쿼리 힌트를 사용하는 것을 좋아하지는 않지만 그것이 그들의 위치와 목적이 없다는 것을 의미하지는 않습니다. 그냥 내 의견.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.