2008-11-26 49 views
5

Tôi có một số bế tắc buồn cười do truy vấn SQL UPDATE đơn giản ngu ngốc, trên một bảng phẳng đơn giản, theo giao dịch "ĐÃ ĐỌC" mặc định.Giảm bế tắc trên mức PAGE khi truy vấn cập nhật trên MS SQL

Bảng cập nhật SET column = @ P1 WHERE PK = @ P2; Trong khi PK varchar (11), có một chỉ số nhóm trên đó. không có quan hệ kích hoạt hoặc bảng ..vào bảng.

Tôi đã kiểm tra và thấy rằng bế tắc xảy ra ở cấp "TRANG", không ở mức ROW/bản ghi. Sau đó, tôi thấy rằng đối với mỗi truy vấn cập nhật, phải mất 100 (và nhiều hơn nữa) PAGE khóa. (Điều đó không có ý nghĩa với tôi vì tôi đang cập nhật một hàng cùng một lúc)

Có cách nào để ngăn chặn bế tắc xảy ra không? Hoặc, làm cách nào để giảm số lượng khóa cần thiết cho một bản cập nhật hàng đơn mà không cần sử dụng con trỏ?

-

Cảm ơn đề xuất của bạn.

Tôi đã cố gắng xây dựng lại chỉ mục một vài lần, với hệ số lấp đầy cao và thấp. Tôi đã cố gắng làm cho các quá trình cập nhật vị trí/lát khác nhau. Nhưng không có gì được cải thiện hay tệ nhất.

-

Tôi đã thử Trình cấu hình máy chủ SQL. Tôi đã chụp một số "Lock: Deadlock Chain" và "Lock: Deadlock", nhưng không có "Biểu đồ khóa chết" đã bị bắt. Cả hai bên đang thực hiện truy vấn cập nhật đơn giản trong chế độ cam kết đã đọc, tự động cam kết.

Lock:Deadlock Chain 17887475 1  0X01 4 myserver  2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                 0   971497 102 - Resource type Exchange     Lock:Deadlock Chain 17887476 1  0X01 4 myserver  2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:438102                                                               265006271  0 0X56AF060001000000000000001B0006  27    0 - LOCK 4 - U   0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock     
Lock:Deadlock Chain 17887477 1  0X01 4 myserver  2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                 0   971497 102 - Resource type Exchange     Lock:Deadlock Chain 17887478 1  0X01 4 myserver  2008-11-28 10:16:46.210 Deadlock Chain SPID = 54 1:426206                                                               265006240  0 0XDE80060001000000000000001B0006  27    0 - LOCK 4 - U   0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock     
Lock:Deadlock Chain 17887479 1  0X01 4 myserver  2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:426206                                                               265006271  0 0XDE80060001000000000000001B0006  27    0 - LOCK 4 - U   0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock     
Lock:Deadlock Chain 17887480 1  0X01 4 myserver  2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                 0   971497 102 - Resource type Exchange     Lock:Deadlock Chain 17887481 1  0X01 4 myserver  2008-11-28 10:16:46.210 Deadlock Chain SPID = 54 1:426066                                                               265006240  0 0X5280060001000000000000001B0006  27    0 - LOCK 4 - U   0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock     
Lock:Deadlock Chain 17887482 1  0X01 4 myserver  2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:426066                                                               265006271  0 0X5280060001000000000000001B0006  27    0 - LOCK 4 - U   0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock     
Lock:Deadlock Chain 17887483 1  0X01 4 myserver  2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                 0   971497 102 - Resource type Exchange     Lock:Deadlock Chain 17887484 1  0X01 4 myserver  2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:425614                                                               265006271  0 0X8E7E060001000000000000001B0006  27    0 - LOCK 4 - U   0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock     
Lock:Deadlock Chain 17887485 1  0X01 4 myserver  2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                 0   971497 102 - Resource type Exchange     Lock:Deadlock Chain 17887486 1  0X01 4 myserver  2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:426687                                                               265006271  0 0XBF82060001000000000000001B0006  27    0 - LOCK 4 - U   0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock     
Lock:Deadlock Chain 17887487 1  0X01 4 myserver  2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                 0   971497 102 - Resource type Exchange     
Lock:Deadlock Chain 17887488 1  0X01 4 myserver  2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:425392                                                               265006271  0 0XB07D060001000000000000001B0006  27    0 - LOCK 4 - U   0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock     
Lock:Deadlock Chain 17887489 1  0X01 4 myserver  2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                 0   971497 102 - Resource type Exchange     
Lock:Deadlock Chain 17887491 1  0X01 4 myserver  2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                 0   971497 102 - Resource type Exchange     
Lock:Deadlock Chain 17887493 1  0X01 4 myserver  2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                 0   971497 102 - Resource type Exchange     
Lock:Deadlock Chain 17887494 1  0X01 4 myserver  2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:435792                                                               265006271  0 0X50A6060001000000000000001B0006  27    0 - LOCK 4 - U   0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock     
Lock:Deadlock Chain 17887495 1  0X01 4 myserver  2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                 0   971497 102 - Resource type Exchange     
Lock:Deadlock Chain 17887496 1  0X01 4 myserver  2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:438206                                                               265006271  0 0XBEAF060001000000000000001B0006  27    0 - LOCK 4 - U   0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971497 101 - Resource type Lock     
Lock:Deadlock 17887497  myuser 0XCD85FBB269700B4AA2F4E8579D118999 209 myserver myuser 2008-11-28 10:16:45.930 1:426206 265006271 myapps 0 0XDE80060001000000000000001B0006 123 27 281 2008-11-28 10:16:46.210 myclient 0 - LOCK 4 - U   0 72057594040352768 1 - TRANSACTION 0 6 - PAGE mydatabase 971498     

Trả lời

0

Cuối cùng tôi phải thực hiện một giải pháp thay thế bằng cách sử dụng cusror trong một thủ tục được lưu trữ.

Nhưng điều thú vị là cách khóa PAGE xảy ra và cách giải quyết.


Sau khi một số tìm kiếm nhiều trên Google, có một số người khác có cùng một vấn đề và họ (từ MSDN của diễn đàn) đề nghị để tắt song song trong SQL Server 2005 nhưng tôi không bao giờ có cơ hội để thử.

3

Bạn có 2 lựa chọn để giảm sự leo thang khóa:

1) thêm gợi ý VỚI (cột chèo) để hỏi máy chủ sql để lấy ổ khóa granularity mịn (mileage của bạn có thể thay đổi:

CẬP NHẬT bảng vỚI (cột chèo) SET cột = @ P1 ĐÂU PK = @ P2;.. trong khi PK varchar (11), có một nhóm chỉ số trên nó không tigger hoặc bàn relation..etc trên bàn

2) cập nhật các hàng theo thứ tự ngẫu nhiên, làm giảm khả năng khóa hàng được chuyển sang khóa trang.

Ngoài ra, đảm bảo rằng các chỉ mục trên bảng đó được cập nhật thường có thể giảm khóa. Như có thể để lại một yếu tố Fill (90 là tốt) nếu bạn đang có được làm rất nhiều chèn.

0

Trong trường hợp bình thường, đơn giản, kiểu này không thường thấy. Câu hỏi của tôi với bạn là: cái gì ở phía bên kia của giao dịch này? Bản cập nhật khác đang chạy và gây ra bế tắc này là gì? Điều đó, tôi nghĩ, sẽ là chìa khóa để chẩn đoán vấn đề này. Thành thật mà nói, tiền của tôi là trên này khác, heretofore truy vấn không xác định được thủ phạm. Và tôi hiện đang ăn chay ...

+0

Đó là phần lạ nhất, phía bên kia thực hiện cùng một truy vấn chính xác, với đầy đủ một khóa chính khác. –

+0

Và tôi thậm chí còn ngắt kết nối/kết nối lại để đảm bảo rằng không có bất kỳ khóa/giao dịch ẩn nào. –

1

Bạn có chạy theo dõi tiểu sử không?

cháy lên SQL Profiler và tạo ra một dấu vết tiêu chuẩn với những sự kiện này nói thêm:

  • Locks: Deadlock Graph
  • Khóa: Khóa: Deadlock Chain
  • Khóa: Khóa: Leo thang

Nên cung cấp chi tiết về bản chất chính xác của bế tắc.

0

Câu lệnh chọn nào từ cùng một bảng VÀ cùng một bản ghi xảy ra bên trong cùng một giao dịch trước khi có báo cáo cập nhật? Sử dụng gợi ý khóa (updlock) trong các lựa chọn này.

+0

Không có gì (sau khi kết nối lại) hoặc truy vấn SELECT đơn giản khác bằng Pk. Tôi đã cố gắng thêm "bằng (updlock)" trước đó, nó giữ khóa cập nhật "hàng", nhưng nó không thể giảm bất kỳ khóa "trang" nào trong truy vấn cập nhật. –

0

bạn có bất kỳ UPDATE TRIGGERS nào trên bảng không? Nếu vậy, hành động kích hoạt, có thể gây ra bế tắc của bạn.

+0

No. Nó là một bảng đơn giản. Không có khóa ngoại. Không kích hoạt. –

Các vấn đề liên quan