Tôi có một biểu đồ bế tắc từ một bế tắc trong đó một quy trình đang thực hiện CHỌN và một quy trình đang thực hiện CẬP NHẬT. Điều này có vẻ giống như trường hợp cổ điển trong đó CHỌN có khóa NCI để thực hiện nối và sau đó khóa CI để lấy tất cả dữ liệu bằng cách tra cứu. Và CẬP NHẬT đang sử dụng khóa CI để thực hiện cập nhật và sau đó cần khóa NCI vì bản cập nhật dẫn đến thay đổi trạng thái và NCI tạo điều kiện tìm các mục theo trạng thái.
Vấn đề là một trong những khóa mà CẬP NHẬT muốn KHÔNG có trên bảng mà nó đang cập nhật và tôi không thể tìm thấy lý do tại sao điều này xảy ra.
Đây là CHỌN:
SELECT *,
RIGHT(c.CC_NUMBER, 4) AS CC_LAST_4,
DATEDIFF(ss, '1970-01-01', plan_started ) plan_started_epoch,
DATEDIFF(ss, '1970-01-01', plan_expires ) plan_expires_epoch
FROM customers c, accounts a, parent_cos pc, htt_customers_overlay_ultra u
WHERE c.customer_id = a.customer_id
AND u.customer_id = c.customer_id
AND a.cos_id=pc.cos_id
AND u.customer_id = 9300;
Đây là CẬP NHẬT:
UPDATE htt_customers_overlay_ultra SET plan_state = 'Active' WHERE customer_id = 9300;
Nhưng theo biểu đồ khóa chết, CẬP NHẬT đang có được một khóa trên ACCOUNTS.ACCOUNT0, đó là PK (CI) của bảng TÀI KHOẢN. Không có khóa ngoại trong bảng lớp phủ. Có một số ràng buộc mặc định mà hiện tại tôi không có quyền xem.
Tôi đã xem biểu đồ khóa chết trong SSMS và trong SQL Sentry Plan Explorer Pro và không ai khôn ngoan hơn.
Dưới đây là các kế hoạch thực hiện:
Tôi muốn tìm hiểu lý do tại sao nó nhận được khóa này, và sau đó là cách tốt nhất để nối tiếp các cuộc gọi này.
Những điều tôi biết mà tôi đã tư vấn cho khách hàng đã mang khóa, nhưng không giải thích về khóa dường như không liên quan đang phát sinh:
Xóa * và xác định các cột cần thiết và thay đổi NCI để che phủ - điều này có khả năng khiến CHỌN sử dụng ít khóa hơn
Xác định lý do tại sao hệ thống CHỌN cùng một dữ liệu mà một quy trình khác đang xử lý - điều này có khả năng giảm thiểu hai quá trình này đang chạy cùng một lúc
Có một bảng quét trong CHỌN
SELECT
có một U
khóa trên chỉ số PK của htt_customers_overlay_ultra
- tại sao? Quá trình đó có 0 log được sử dụng.
process589f948
) nào có U
khóa và đang cố chuyển đổi nó thành X
khóa nhưng bị chặn bởi một S
khóa được giữ bởi SELECT
( process5240988
)
read_committed_snapshot
db.
X
khóa khóa trên "dbo.ACCOUNTS" từ một tuyên bố trước đó trong cùng một giao dịch không được hiển thị trong biểu đồ?