Tại sao có mục nhập nạn nhân trên biểu đồ Deadlock?


11

Tôi đang cố gắng tìm hiểu cách phân tích biểu đồ khóa chết của SQL Server 2008 và tôi đang tìm thấy rất nhiều mục với một <victim-list>nút trống . Tôi không hiểu những mục này đại diện cho điều gì: nếu không có nạn nhân, làm cách nào tôi có thể xác định được nguồn chờ đang gây ra bế tắc? Những mục này có ý nghĩa gì?

Dưới đây là một ví dụ nhanh về các mục tôi đang thấy:

<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>

** chỉnh sửa ** Theo yêu cầu, đây là truy vấn được sử dụng để xác định truy vấn bởi 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

từ RyanBoyer.net


Phiên bản SQL Server của tôi là 10.50.1617.0
Slider345

Câu trả lời:


9

ExchangeEvent & e_waitPipeNewRow gợi ý bạn đã gặp phải những gì Bart Duncan gọi là Thuật ngữ gây phiền toái: "Bế tắc chủ đề song song truy vấn nội bộ" .

Hầu hết các bế tắc song song truy vấn nội bộ được coi là lỗi, mặc dù một số trong số chúng có thể là lỗi rủi ro để khắc phục vì vậy không thể khắc phục được. Nếu bạn gặp phải một và bạn đã có gói dịch vụ SQL mới nhất, cách tốt nhất của bạn có thể là điều tra các cách giải quyết.

Vì vậy, bạn không thể làm gì khác ngoài:

  • Đảm bảo bạn đang ở trên gói dịch vụ mới nhất và cập nhật tích lũy.
  • Cố gắng xác định các chỉ mục và / hoặc các tối ưu hóa khác để cải thiện hiệu suất của truy vấn. Bạn đề cập rằng inputbuf không được điền nhưng bạn có thể xác định truy vấn đang phát qua sqlhandle trong biểu đồ XML. Nếu bạn không nhận được gì từ đó, hãy thử chạy một dấu vết và tương quan với thời gian những bế tắc này xảy ra.
  • Giảm MAXDOPcho truy vấn này hoặc cố gắng MAXDOP(1)buộc thực thi đơn luồng. Xin lưu ý rằng bạn có thể khắc phục các bế tắc nhưng đưa ra một loạt các vấn đề hiệu suất khác bằng cách hạn chế song song.
  • Mở một cuộc gọi hỗ trợ với Microsoft. Có thể là a) họ có một hotfix không công khai cho kịch bản này hoặc b) vì những bế tắc truy vấn nội bộ này được coi là lỗi mà họ có thể muốn làm việc với bạn để tìm cách khắc phục.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.