Chèn và cập nhật và chọn hàng nghìn lần mỗi giây


7

Tôi có một bảng được chèn, cập nhật và chọn từ hàng ngàn lần trong vòng một giây. Tôi đang có vấn đề bế tắc mặc dù.

  1. Cơ sở dữ liệu có 2-5 lần chèn 1000 hàng đồng thời bằng cách sử dụng Linq đến Sql.
  2. 40 lần mỗi giây, cũng có một câu lệnh chọn từ bảng đó và nếu một điều kiện là đúng (95% thời gian là như vậy), một bản cập nhật xảy ra với mã tương tự như sau:

    tạo thủ tục AccessFile (@code, @admin) NHƯ

    khai báo @id int, @access datetime, chuỗi @file

    chọn @ id = Id, @accessed = access, @file = file từ các tệp có code = @code

    NẾU @admin <> 0 NẾU @accessed là null bắt đầu

    THIẾT LẬP CẤP PHÂN TÍCH GIAO DỊCH ĐỌC HIỂU

    cập nhật tập tin được truy cập = getdate () trong đó id = @id

    THIẾT LẬP CẤP PHÂN TÍCH CẤP GIAO DỊCH

    kết thúc

    chọn @id làm Id, @file làm tệp

Có vẻ như đó là các bản cập nhật mâu thuẫn với các phần chèn đang gây ra bế tắc.

Ví dụ là 1 với 1 với thủ tục được lưu trữ, chỉ khác là tên. Giả sử 1 và 2, bất kể tên thủ tục được lưu trữ.


1
Bạn có thể cho chúng tôi cấu trúc bảng của bạn? Cột, chìa khóa, chỉ mục?
Eric Humphrey - lotahelp

Có phải là Máy chủ SQL không? Oracle? MySQL?
eiefai

@eric - Rất đơn giản: ID (PK; bigint), Code (Index, Unique; varchar (16)), Accessed (datetime), created (datetime), File (varchar (48))
Jeremy Boyd

@eiefai - MSSQL 2008 R2
Jeremy Boyd

2
Bạn có thể nhận được một số manh mối ở đây, trong câu hỏi này: dba.stackexchange.com/questions/126/ Đá Đó là về những bế tắc và cách bắt và xử lý chúng.
Mary

Câu trả lời:


2

Thay đổi các bản cập nhật để sử dụng VỚI (ROWLOCK). Điều đó sẽ giảm các khóa từ cấp trang xuống cấp hàng. Bạn cũng có thể thử tương tự trên các phần chèn.


Tôi đã cập nhật cả chèn và cập nhật để sử dụng với (rowlock), nhưng nó đã không làm giảm số lượng bế tắc. Nếu tôi giết các phần chèn (tắt nút cho phép người dùng của chúng tôi chèn), các khóa chết sẽ biến mất.
Jeremy Boyd

2
Hãy thử đưa ra mức cô lập ảnh chụp nhanh. Tôi sẽ thực hiện các thay đổi tương tự đối với mã đang thực hiện chèn (trừ khi chúng được thực hiện bởi một thủ tục được lưu trữ). Nó có thể giúp ích, nhưng nó sẽ tăng mức sử dụng tempdb lên rất nhiều. BTW, thay đổi mức cô lập để đọc không cam kết cho một bản cập nhật sẽ không làm gì cả. Tôi giả sử rằng cột ID là chỉ mục được nhóm của bạn?
mrdenny


0

Tôi sẽ thiết kế lại các ứng dụng để các hàng được lưu theo lô. Thông thường các lô 500-1000 hàng hoạt động tốt với tôi, nhưng bạn cần chạy thử nghiệm của riêng mình. Trước khi lưu một lô, tôi sẽ tuần tự hóa các cập nhật hàng loạt của mình bằng cách sử dụng sp_getapplock.

Chắc chắn việc tuần tự hóa này làm chậm các sửa đổi xuống một chút, nhưng tiết kiệm theo đợt nhiều hơn bù cho nó, vì vậy, tổng thể công việc này nhanh hơn nhiều khi tiết kiệm từng hàng một.

Ngoài ra, tôi sẽ chạy các lựa chọn của mình với mức cô lập SNAPSHOT để chúng bị chặn bởi các sửa đổi.

Điều đó đã được thực hiện, bạn có thể không bao giờ có bất kỳ bế tắc nào - chúng tôi không có bế tắc trong hệ thống tải hỗn hợp của chúng tôi, và bạn cũng vậy.

Chúc may mắn!

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.