CHỌN / CHERTN Bế tắc


10

Trường hợp này lưu trữ cơ sở dữ liệu SharePoint 2007 (SP). Chúng tôi đã trải qua nhiều bế tắc CHỌN / CHERTN đối với một bảng được sử dụng nhiều trong cơ sở dữ liệu nội dung SP. Tôi đã thu hẹp các tài nguyên liên quan, cả hai quá trình đều yêu cầu khóa trên chỉ mục không được nhóm.
INSERT cần khóa IX trên tài nguyên SELECT và SELECT cần khóa S trên tài nguyên INSERT. Biểu đồ khóa chết mô tả và ba tài nguyên, 1.) hai từ CHỌN (các luồng song song của nhà sản xuất / người tiêu dùng) và 2.) INSERT.
Tôi đã đính kèm biểu đồ bế tắc cho đánh giá của bạn. Bởi vì đây là cấu trúc mã và bảng của Microsoft, chúng tôi không thể thực hiện bất kỳ thay đổi nào.
Tuy nhiên, tôi đã đọc, trên trang web MSFT SP, họ khuyên bạn nên đặt tùy chọn cấu hình mức Instance MAXDOP thành 1. Vì trường hợp này được chia sẻ giữa nhiều cơ sở dữ liệu / ứng dụng khác, cài đặt này không thể bị tắt.


Do đó, tôi quyết định thử và ngăn các câu lệnh CHỌN này đi song song. Tôi biết đây không phải là một giải pháp mà là sửa đổi tạm thời để giúp khắc phục sự cố. Do đó, tôi đã tăng Ngưỡng chi phí của bộ xử lý song song từ 25 đến 40 tiêu chuẩn của chúng tôi khi làm như vậy, mặc dù khối lượng công việc không thay đổi (CHỌN / XÁC thường xuyên xảy ra) các bế tắc đã biến mất. Câu hỏi của tôi là tại sao?

SPID 356 INSERT có khóa IX trên một trang thuộc chỉ mục không phân cụm
SPID 690 CHỌN ID thực thi 0 có khóa S trên một trang thuộc cùng một chỉ mục không được phân cụm

Hiện nay

SPID 356 muốn khóa IX trên tài nguyên SPID 690 nhưng không thể giữ được vì SPID 356 đang bị chặn bởi SPID 690 ID thực thi 0 S khóa
SPID 690 ID thực thi 1 muốn khóa S trên tài nguyên SPID 356 nhưng không thể lấy được vì ID thực thi SPID 690 1 đang bị chặn bởi SPID 356 và bây giờ chúng tôi có bế tắc.

Kế hoạch thực hiện có thể được tìm thấy trên SkyDrive của tôi

Chi tiết bế tắc đầy đủ có thể được tìm thấy ở đây

Nếu ai đó có thể giúp tôi hiểu tại sao tôi thực sự đánh giá cao nó.

Bảng EventReceivers.
Id uniqueidentifier không 16
Tên nvarchar không 512
SiteID uniqueidentifier không 16
WebId uniqueidentifier không 16
hostid uniqueidentifier không 16
HOSTTYPE int không 4
ItemID int không 4
dirname nvarchar không 512
LeafName nvarchar không 256
Loại int không 4
SequenceNumber int không 4
hội nvarchar không 512
Lớp nvarchar không 512
Dữ liệu nvarchar no 512
Bộ lọc nvarchar no 512
SourceId tContentTypeId no 512
SourceType int no 4
Credential int no 4
ContextType varbinary no 16
ContextEventType varbinary không 16
ContextId varbinary không 16
ContextObjectId varbinary không 16
ContextCollectionId varbinary không 16

INDEX_NAME index_description index_keys
EventReceivers_ByContextCollectionId nonclustered nằm trên TIỂU SiteID, ContextCollectionId
EventReceivers_ByContextObjectId nonclustered nằm trên TIỂU SiteID, ContextObjectId
EventReceivers_ById nonclustered, độc đáo nằm trên TIỂU SiteID, Id
EventReceivers_ByTarget nhóm, độc đáo nằm trên TIỂU SiteID, WebId, hostid, HOSTTYPE, Type, ContextCollectionId, ContextObjectId, ContextId, ContextType, ContextEventType, SequenceNumber, hội, Class
EventReceivers_IdUnique không bao gồm, khóa duy nhất, duy nhất nằm trên Id PRIMARY


2
Chúng ta không thể làm gì proc_InsertEventReceiverproc_InsertContextEventReceiverlàm gì trong XDL? Ngoài ra để giảm sự song song tại sao không chỉ tác động trực tiếp đến các tuyên bố này (sử dụng MAXDOP 1) thay vì đóng gói với các cài đặt trên toàn máy chủ?
Aaron Bertrand

1
Tôi tò mò không biết cài đặt MAXDOP rộng của bạn là gì và bạn có bao nhiêu bộ xử lý (logic). SharePoint thực sự hoạt động tốt hơn và thích ở trên một máy chủ có máy chủ MAXDOP rộng 1 .. Tôi không thích nó, nhưng đó là cách họ phát triển nó. Bạn có thể gửi kế hoạch thực hiện thực tế? Tất cả những gì tôi thấy ở liên kết đó là .xdl (biểu đồ khóa chết)
Mike Walsh

Xin chào quý ông Tôi thực sự đánh giá cao việc bạn dành thời gian, ra khỏi lịch trình bận rộn của bạn để đáp ứng. Tôi sẽ đăng cả quy trình và kế hoạch thực hiện để bạn xem xét trên trang SkyDrive. Tôi đã nghĩ về việc sửa đổi mã để bao gồm tùy chọn truy vấn MAXDOP (1), tuy nhiên, làm như vậy sẽ làm mất sự hỗ trợ của chúng tôi với Microsoft. Máy chủ vật lý là cài đặt ProLiant DL580 G4 MAXDOP là 4 với tổng số 8 bộ xử lý vật lý và H / T bị tắt.
SQLJarHead

Xin chào quý ông, tôi đã tạo một gói zip với tất cả các chi tiết trên SkyDrive. Tôi đã sửa đổi nội dung của bài đăng gốc để bao gồm URL cho gói. Xin vui lòng, đừng cho tôi biết vấn đề là gì, chỉ cần cung cấp hướng dẫn và để tôi làm việc cho nó. LƯU Ý: Tôi không thể thực hiện bất kỳ thay đổi mã hoặc sửa đổi DDL nào cho lược đồ cơ bản.
SQLJarHead

1
Vì vậy, bạn không thể thay đổi mã và bạn không thể thay đổi lược đồ, bạn muốn chúng tôi đưa ra giải pháp nào khác? Nếu bạn lo lắng về việc làm mất hỗ trợ của Microsoft, thì điều đó có nghĩa là bạn hỗ trợ của Microsoft, trong trường hợp đó - đưa ra tất cả các hạn chế mà bạn đã nói với chúng tôi rằng bạn không thể làm - bạn đã xem xét mở một vé hỗ trợ với Microsoft chưa?
Aaron Bertrand

Câu trả lời:


14

Trên mặt của nó, điều này trông giống như một bế tắc tra cứu cổ điển . Các thành phần thiết yếu cho mẫu bế tắc này là:

  • một SELECTtruy vấn sử dụng một chỉ mục không bao gồm không bao gồm với Tra cứu khóa
  • một INSERTtruy vấn sửa đổi chỉ mục được nhóm và sau đó là chỉ mục không bao gồm

Các SELECTtruy cập chỉ mục không bao gồm đầu tiên, sau đó chỉ mục cụm. Việc INSERTtruy cập chỉ mục được nhóm trước, sau đó là chỉ mục không bao gồm. Truy cập cùng một tài nguyên theo một thứ tự khác có được các khóa không tương thích là một cách tuyệt vời để 'đạt được' một sự bế tắc tất nhiên.

Trong trường hợp này, SELECTtruy vấn là:

Truy vấn CHỌN

... và INSERTtruy vấn là:

Truy vấn INSERT

Lưu ý bảo trì chỉ mục không phân cụm màu xanh lá cây nổi bật.

Chúng ta sẽ cần phải xem phiên bản nối tiếp của SELECTkế hoạch trong trường hợp nó rất khác so với phiên bản song song, nhưng như Jonathan Kehayias lưu ý trong hướng dẫn của mình về Xử lý các bế tắc , mẫu khóa cụ thể này rất nhạy cảm với các chi tiết thực hiện truy vấn nội bộ và thời gian. Loại bế tắc này thường đến và đi mà không có lý do bên ngoài rõ ràng.

Được cấp quyền truy cập vào hệ thống có liên quan và các quyền phù hợp, tôi chắc chắn cuối cùng chúng ta cũng có thể tìm ra chính xác lý do tại sao bế tắc xảy ra với kế hoạch song song nhưng không phải là nối tiếp (giả sử có cùng hình dạng chung). Dòng tiềm năng của cuộc điều tra bao gồm kiểm tra các vòng lặp lồng nhau tối ưu hóa và / hoặc tìm nạp trước - cả hai đều có nội có thể leo thang mức độ cách ly để REPEATABLE READtrong suốt thời gian báo cáo kết quả. Cũng có thể một số tính năng của chỉ mục tìm kiếm phạm vi song song góp phần vào vấn đề. Nếu kế hoạch nối tiếp trở nên khả dụng, tôi có thể dành thời gian để xem xét chi tiết hơn nữa, vì nó có khả năng thú vị.

Giải pháp thông thường cho loại bế tắc này là làm cho chỉ số bao trùm, mặc dù số lượng cột trong trường hợp này có thể khiến điều đó không thực tế (và bên cạnh đó, chúng tôi không được phép gây rối với những điều như vậy trên SharePoint, tôi được cho biết). Cuối cùng, đề xuất cho các kế hoạch chỉ nối tiếp khi sử dụng SharePoint là có lý do (mặc dù không nhất thiết phải là một kế hoạch tốt, khi nó đi thẳng vào nó). Nếu sự thay đổi trong ngưỡng chi phí cho sự song song khắc phục vấn đề tại thời điểm này, điều này là tốt. Về lâu dài, tôi có thể tìm cách tách khối lượng công việc, có thể sử dụng Resource Governor để các truy vấn nội bộ SharePoint có MAXDOP 1hành vi mong muốn và ứng dụng khác có thể sử dụng song song.

Câu hỏi về sự trao đổi xuất hiện trong dấu vết bế tắc dường như là một cá trích đỏ đối với tôi; chỉ đơn giản là hệ quả của các luồng độc lập sở hữu tài nguyên mà về mặt kỹ thuật phải xuất hiện trong cây. Tôi không thể thấy bất cứ điều gì cho thấy rằng các sàn giao dịch đang đóng góp trực tiếp vào vấn đề bế tắc.


6

Nếu đây là một bế tắc tra cứu cổ điển , danh sách tài nguyên sẽ bao gồm cả Chỉ mục cụm và Chỉ mục không cụm. Thông thường, CHỌN sẽ giữ khóa CHIA SẺ trên chỉ mục NC và đợi khóa CHIA SẺ trên CI, trong khi đó, INSERT sẽ nhận được khóa ĐỘC QUYỀN trên CI và chờ khóa ĐỘC QUYỀN trên NC. Danh sách tài nguyên trong xml deadlock sẽ liệt kê cả hai đối tượng này trong trường hợp này.

Vì biểu đồ khóa chết chỉ liên quan đến Chỉ số NC, chúng tôi có thể loại trừ tùy chọn đó.

Ngoài ra, nếu đây là một khóa chết do Nested Loop Tham gia với UNORDERED PREFECH , kế hoạch thực hiện sẽ cho chúng ta biết liệu thuật toán UNORDERED PREFECH có được sử dụng hay không, xem lại ở đây (xem cập nhật bên dưới).

Điều đó khiến chúng ta cho rằng đây là một sự bế tắc do Kế hoạch song song.

Biểu đồ khóa chết không được hiển thị đúng, nhưng nếu bạn nhìn vào Deadlock XML, bạn có thể thấy hai luồng từ câu lệnh SELECT (SPID 690) có liên quan đến khóa chết. Chủ đề người tiêu dùng đang giữ khóa CHIA SẺ trên TRANG 1219645 và chờ nhà sản xuất trên port801f8ed0 (e_waitPipeGetRow). Chủ đề của nhà sản xuất đang chờ khóa chia sẻ trên TRANG 1155940.

Câu lệnh INSERT đang giữ khóa IX trên TRANG 1155940 và chờ khóa IX trên TRANG 1219645, dẫn đến bế tắc.

Tôi tin rằng một bế tắc sẽ được đảo ngược khi sử dụng một kế hoạch nối tiếp cho câu lệnh CHỌN vì không có lúc nào nó sẽ yêu cầu khóa CHIA SẺ trên nhiều trang. Tôi cũng nghĩ rằng kế hoạch nối tiếp sẽ gần giống như kế hoạch song song (sans toán tử song song).

[CẬP NHẬT dựa trên bình luận của Paul]

Rõ ràng kế hoạch đang sử dụng thuật toán Nested Loop được tối ưu hóa

Điều đó giải thích tại sao các khóa SHARED được giữ cho đến khi kết thúc câu lệnh. REPEATABLE READ kết hợp với kế hoạch song song dễ bị bế tắc hơn so với kế hoạch nối tiếp bởi vì kế hoạch song song có thể thu được và giữ các khóa từ các phạm vi khác nhau của một chỉ mục trong khi kế hoạch nối tiếp có được các khóa theo cách tuần tự hơn.


Đã đồng ý. Nếu sự bế tắc này có liên quan đến một LOOKUP thực tế, tài nguyên chờ, đối với CHỌN, sẽ tham chiếu chỉ mục được nhóm. Tôi đã có thể loại trừ điều đó bằng cách hiển thị tiêu đề trang cho mỗi tài nguyên chờ (SPID 690 Wait Resource = PAGE: 1155940 | SPID 356 Wait Resource = PAGE 1219645) qua DBCC PAGE và cả hai đều nằm trên chỉ mục ID 5 (IndexID 5 = EventReceivers_ByContextObjectI) trỏ đến chỉ mục NC trên bảng đã chỉ định (EventReceivers).
SQLJarHead

Các quý ông, Cảm ơn một lần nữa vì đã dành thời gian để giúp phân tích vấn đề thú vị này. Vài câu hỏi: 1.) Roji chỉ ra rằng SPID song song đang yêu cầu nhiều hơn một trang. Tôi không thấy điều đó trong bất kỳ kế hoạch thực hiện nào. Nhìn vào số cho các hàng, đối với toán tử INDEX SEEK, chỉ có một luồng trong số hai nhà sản xuất đang xử lý bất kỳ hàng nào. Làm thế nào bạn xác định rằng nó đã yêu cầu nhiều hơn một trang? (1/2)
SQLJarHead

2.) Thuật toán Nested Loop được tối ưu hóa sẽ luôn đặt mức cô lập thành READ REAPTABLE READ? Tôi đã kiểm tra các kế hoạch thực hiện đầu ra XML và tôi chỉ thấy đọc cam kết cho kết nối SPID. Tôi đang đưa ra một giả định rằng điều này chỉ được gọi ở cấp độ toán tử kế hoạch mà thôi. (2/2)
SQLJarHead

Hành vi khóa của các vòng lặp lồng nhau được tối ưu hóa có thể so sánh với REPEATABLE READ (giữ các khóa cho đến khi kết thúc câu lệnh ), nhưng không giải thích được đặt mức cô lập của giao dịch thành REPEATABLE READ. Tôi nghĩ rằng câu trả lời câu hỏi của bạn quá. Không phải là các luồng song song đang yêu cầu nhiều hơn một trang cùng một lúc, nhưng một luồng song song đang giữ một khóa trên một trang và một luồng khác đang chờ khóa trên một trang khác
Roji P Thomas
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.