Tôi có ba bảng Chỉ mục cột phân cụm (CCI) trong SQL Server 2016. Tất cả các CCI này đều nằm trong cùng một sơ đồ phân vùng, dựa trên ID đối tượng thuê. Gần đây, và không nhất quán, tôi đang gặp bế tắc về các câu lệnh chọn đơn giản từ các phép nối đến các bảng này. Ví dụ truy vấn mà bế tắc:
SELECT TOP 33 r.tenantid
FROM Table_r r
INNER JOIN Table_cm cm ON r.MyKey=cm.MyKey
INNER JOIN Table_pe pe ON r.MyKey=pe.MyKey
WHERE r.TenantId = 69
AND pe.TenantId = 69
AND cm.TenantId = 69
Thông báo lỗi:
Giao dịch (ID quy trình 56) đã bị bế tắc trên các tài nguyên đối tượng có thể chờ chung với một quy trình khác và đã được chọn làm nạn nhân của bế tắc. Chạy lại giao dịch.
Manh mối:
- Nếu truy vấn sử dụng một chỉ mục khác ngoài CCI, nó không bế tắc.
- Nếu tôi loại bỏ hai trong số ba bộ lọc tenantid thì nó không bị bế tắc.
- Nếu tôi CHỌN top 32 hoặc thấp hơn thì nó không bế tắc.
- Nếu tôi thêm TÙY CHỌN (MAXDOP 1) thì nó không bế tắc.
- Tôi có thể repro điều này trong bản sao sản xuất bị xáo trộn của mình, thứ cấp CHỈ ĐỌC HIỂU và chính sản xuất.
- Tôi không thể repro hành vi này trong DEV hoặc INT.
- Nó vẫn bế tắc nếu tôi thêm VỚI (NOLOCK) cho cả 3 bảng tham gia
- Các truy vấn bế tắc chính nó. Nó sẽ bế tắc khi không có quá trình hoạt động khác.
- Các kế hoạch truy vấn không có song song không bế tắc
Phiên bản sản xuất của chúng tôi:
Microsoft SQL Server 2016 (SP2-CU5) (KB4485776) - 13.0.5264.1 (X64) ngày 10 tháng 1 năm 2019 18:51:38 Bản quyền (c) Microsoft Corporation Enterprise Edition (64-bit) trên Windows Server 2012 R2 Standard 6.3 (Build 9600 :) (Hypervisor)
Làm cách nào để ngăn chặn bế tắc đối với truy vấn này?