Chúng tôi có một quy trình tạo ra một báo cáo hàng tồn kho. Về phía khách hàng, quá trình phân chia một số luồng công nhân có thể định cấu hình để xây dựng một khối dữ liệu cho báo cáo tương ứng với một cửa hàng trong số nhiều (có thể hàng ngàn, thường là hàng chục). Mỗi luồng công nhân gọi một dịch vụ web thực hiện một thủ tục được lưu trữ.
Quá trình cơ sở dữ liệu để xử lý mỗi khối tập hợp một loạt dữ liệu vào một bảng #T tạm thời. Vào cuối mỗi đoạn xử lý, dữ liệu được ghi vào một bảng cố định trong tempdb. Cuối cùng, khi kết thúc quá trình, một luồng ở phía máy khách yêu cầu tất cả dữ liệu từ bảng tempdb vĩnh viễn.
Càng nhiều người dùng chạy báo cáo này, nó càng chậm. Tôi đã phân tích các hoạt động trong cơ sở dữ liệu. Tại một thời điểm, tôi thấy 35 yêu cầu riêng biệt đều bị chặn tại một điểm trong quy trình. Tất cả các SPID này có thứ tự 50 ms chờ loại LATCH_EX
trên tài nguyên METADATA_SEQUENCE_GENERATOR (00000010E13CA1A8)
. Một SPID có tài nguyên này và tất cả những cái khác đang chặn. Tôi không tìm thấy bất cứ điều gì về tài nguyên chờ này trên một tìm kiếm trên web.
Bảng trong tempdb mà chúng tôi đang sử dụng có một IDENTITY(1,1)
cột. Có phải các SPID này đang chờ cột IDENTITY không? Những phương pháp nào chúng ta có thể sử dụng để giảm hoặc loại bỏ việc chặn?
Máy chủ là một phần của cụm. Máy chủ đang chạy 64-bit SQL Server 2012 Standard Edition SP1 trên Windows 2008 R2 Enterprise 64-bit. Máy chủ có 64 GB RAM và 48 bộ xử lý, nhưng cơ sở dữ liệu chỉ có thể sử dụng 16 vì đây là phiên bản tiêu chuẩn.
(Lưu ý rằng tôi không vui mừng khi thiết kế sử dụng bảng cố định trong tempdb để chứa tất cả dữ liệu này. Thay đổi đó sẽ là một thách thức kỹ thuật và chính trị thú vị, nhưng tôi sẵn sàng đề xuất.)
CẬP NHẬT 23/11/2013
Chúng tôi đã mở một trường hợp hỗ trợ với Microsoft. Tôi sẽ cập nhật câu hỏi này khi chúng tôi tìm hiểu thêm.
CẬP NHẬT 5/10/2013
Kỹ sư hỗ trợ SQL Server đồng ý rằng sự chờ đợi là do cột IDENTITY gây ra. Loại bỏ IDENTITY loại bỏ sự chờ đợi. Chúng tôi không thể sao chép vấn đề trên SQL 2008 R2; nó chỉ xảy ra trên SQL 2012.