교착 상태 그래프에 피해자가없는 항목이있는 이유는 무엇입니까?


11

SQL Server 2008의 교착 상태 그래프 를 분석하는 방법을 배우려고하는데 빈 <victim-list>노드 가있는 항목이 많이 있습니다. 이 항목이 무엇을 나타내는 지 이해하지 못합니다. 피해자가없는 경우 교착 상태를 일으키는 대기 자원을 어떻게 식별 할 수 있습니까? 이 항목들은 무엇을 의미합니까?

내가보고있는 항목의 간단한 예는 다음과 같습니다.

<deadlock-list>
 <deadlock>
  <victim-list />
  <process-list>
   <process id="processd2b6508" taskpriority="0" logused="10000" waittime="31" schedulerid="63" kpid="9104" status="suspended" spid="69" sbid="0" ecid="184" priority="0" trancount="0" lastbatchstarted="2012-07-30T01:10:45.550" lastbatchcompleted="2012-07-30T01:10:45.550" clientapp=".Net SqlClient Data Provider" hostname="XXXXXXX" hostpid="3648" isolationlevel="read committed (2)" xactid="30461033" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
    <executionStack>
     <frame procname="" line="1" sqlhandle="0x020000002340c50225c17d0eec9bf7c51129348edffd1c70" /> 
     <!--About 2 more frame tags... -->
    </executionStack>
    <inputbuf /> 
   </process>
   <!-- 3 or so more process tags... -->
  </process-list>
  <resource-list>
   <exchangeEvent id="Pipeb005eeba0" WaitType="e_waitPipeNewRow" nodeId="7">
    <owner-list>
     <owner id="processd23fdc8" /> 
    </owner-list>
    <waiter-list>
     <waiter id="processd2b6508" /> 
    </waiter-list>
   </exchangeEvent>
   <!-- 2 more exchangeEvents -->
  </resource-list>
 </deadlock>
</deadlock-list>

** 편집 ** 요청한대로 다음은 sqlhandle로 쿼리를 식별하는 데 사용되는 쿼리입니다.

select sql_handle as Handle,
    SUBSTRING(st.text, (qs.statement_start_offset/2)+1, 
        ((CASE qs.statement_end_offset
          WHEN -1 THEN DATALENGTH(st.text)
         ELSE qs.statement_end_offset
         END - qs.statement_start_offset)/2) + 1) AS Text

from sys.dm_exec_query_stats as qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
where sql_handle = --0x04000D00E3572A56542E4601CE9E00010100001000000000

에서 RyanBoyer.net


내 SQL Server 버전은 10.50.1617.0입니다.
Slider345

답변:


9

ExchangeEvent & e_waitPipeNewRow는 Bart Duncan이 성가 시게 다루기 어려운 용어 인 "인트라 쿼리 병렬 스레드 교착 상태"라고 언급했습니다 .

대부분의 쿼리 내 병렬 처리 교착 상태는 버그로 간주되지만 일부는 수정하기에 위험한 버그 일 수 있으므로 수정이 불가능할 수 있습니다. 이미 최신 SQL 서비스 팩을 사용하고 있다면 해결 방법을 조사하는 것이 가장 좋습니다.

따라서 다음 이외의 다른 작업은 할 수 없습니다.

  • 최신 서비스 팩 및 누적 업데이트 상태인지 확인하십시오.
  • 쿼리 성능을 향상시키기 위해 인덱스 및 / 또는 기타 최적화를 식별하십시오. inputbuf는 채워지지 않지만 그래프 XML의 sqlhandle을 통해 재생중인 쿼리를 식별 할 수 있습니다. 그로부터 아무것도 얻지 못하면 추적을 실행하고 이러한 교착 상태가 발생하는 시간과 상관 관계를 시도하십시오.
  • MAXDOP이 쿼리를 줄이거 나 MAXDOP(1)단일 스레드 실행을 시도하십시오 . 교착 상태를 해결할 수는 있지만 병렬 처리를 제한하여 다른 성능 문제가 발생할 수 있습니다.
  • Microsoft와의 지원 요청을여십시오. a)이 시나리오에 대한 비공개 핫픽스가 있거나 b) 이러한 쿼리 내 교착 상태가 버그로 간주되어 수정 사항을 찾기 위해 사용할 수있는 버그 일 수 있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.