Theo mặc định, bản sửa lỗi này bao gồm trong Gói Dịch vụ 1 của SQL Server 2014 và Gói Dịch vụ 3 của SQL Server 2012 và bạn không phải thêm bất cứ cờ theo dõi nào để bật bản sửa lỗi này. Để bật bản sửa lỗi sau khi bạn cài đặt một trong các bản cập nhật tích lũy trong phần Giải pháp, bạn phải khởi động Microsoft SQL Server bằng cách thêm cờ theo dõi 1236 vào các tham số khởi động.
Triệu chứng
Giả sử bạn chạy phiên bản Microsoft SQL Server 2014, SQL Server 2012, SQL Server 2008 hoặc SQL Server 2008 R2 trên máy tính chứa nhiều bộ xử lý. Khi số khóa (loại tài nguyên = DATABASE) đối với một cơ sở dữ liệu cụ thể vượt quá một ngưỡng nhất định, bạn sẽ gặp phải các vấn đề về hiệu suất sau đây:
Giá trị tăng cao xảy ra đối với LOCK_HASH số spinlock.
Lưu ý: Xem phần "Thông tin khác" để biết thông tin về cách theo dõi spinlock này.
Các truy vấn hoặc thao tác yêu cầu khóa cơ sở dữ liệu cần nhiều thời gian để hoàn thành. Ví dụ: bạn có thể nhận thấy các độ trễ hiệu năng sau đây:
- Đăng nhập SQL Server
- Truy vấn máy chủ kết nối
- sp_reset_connection
- Giao dịch
Lưu ý Để định vị danh sách khóa (loại tài nguyên = DATABASE) trên cơ sở dữ liệu cho trước, hãy xem phần "Thông tin khác". Giá trị ngưỡng thay đổi theo môi trường.
Giải pháp
Thông tin cập nhật tích lũy
Sự cố này được khắc phục lần đầu tiên trong bản cập nhật tích lũy tiếp theo của SQL Server.
Bản cập nhật tích lũy 13 cho SQL Server 2008 R2 SP2 /en-us/help/2967540
Bản cập nhật tích lũy 17 cho SQL Server 2008 SP3 /en-us/help/2958696
Cập nhật tích lũy 1 cho SQL Server 2014 /en-us/help/2931693
Cập nhật tích lũy 9 cho SQL Server 2012 SP1 /en-us/help/2931078
Giới thiệu về các bản cập nhật tích lũy cho SQL Server
Mỗi bản cập nhật tích lũy mới dành cho SQL Server chứa tất cả các bản sửa lỗi nóng và bản sửa lỗi bảo mật được tích hợp trong bản cập nhật tích lũy trước đó. Xem các bản cập nhật tích lũy mới nhất cho SQL Server:
- Bản cập nhật tích lũy mới nhất cho SQL Server 2008 R2 SP2
- Bản cập nhật tích lũy mới nhất cho SQL Server 2008 SP3
- Bản cập nhật tích lũy mới nhất cho SQL Server 2014
- Bản cập nhật tích lũy mới nhất cho SQL Server 2012 SP1
Thông tin hotfix
Một hotfix được hỗ trợ luôn sẵn dùng từ Microsoft. Tuy nhiên, hotfix này chỉ nhằm mục đích khắc phục sự cố được mô tả trong bài viết này. Chỉ áp dụng hotfix này cho các hệ thống đang gặp phải sự cố cụ thể này.
Nếu hotfix sẵn có để tải xuống, sẽ có một phần "Hotfix Tải xuống Sẵn dùng" ở phía trên cùng của bài viết Cơ sở Kiến thức này. Nếu mục này không xuất hiện, hãy gửi yêu cầu đến Dịch vụ khách hàng và Hỗ trợ của Microsoft để tải hotfix.
Lưu ý Nếu xảy ra sự cố bổ sung hoặc nếu cần khắc phục sự cố thì có thể bạn phải tạo một yêu cầu dịch vụ riêng. Chi phí hỗ trợ thông thường sẽ áp dụng đối với các câu hỏi và sự cố hỗ trợ bổ sung không phù hợp với hotfix cụ thể này. Để biết danh sách đầy đủ các số điện thoại hỗ trợ và dịch vụ khách hàng của Microsoft hoặc để tạo một yêu cầu dịch vụ riêng biệt, hãy truy cập trang web sau của Microsoft:
/contactus/?ws=support Lưu ý: Biểu mẫu "Hotfix Tải xuống Sẵn dùng" sẽ hiển thị các ngôn ngữ cho hotfix khả dụng. Nếu bạn không thấy ngôn ngữ của mình thì đó là do không có hotfix cho ngôn ngữ đó.
Trạng thái
Microsoft đã xác nhận rằng đây là sự cố trong các sản phẩm của Microsoft được liệt kê trong mục "áp dụng cho".
Xem thêm thông tin
Khi một ứng dụng kết nối với SQL Server, trước tiên ứng dụng sẽ thiết lập ngữ cảnh cơ sở dữ liệu. Theo mặc định, kết nối sẽ cố gắng lấy khóa DATABASE ở chế độ SH. Khóa SH-DATABASE sẽ được giải phóng khi kết nối bị dừng hoặc ngữ cảnh cơ sở dữ liệu được thay đổi trong thời gian của kết nối. Nếu bạn có nhiều kết nối hiện hoạt sử dụng cùng một ngữ cảnh cơ sở dữ liệu, bạn có thể có nhiều khóa loại tài nguyên DATABASE cho cơ sở dữ liệu cụ thể đó.
Trên máy tính có 16 CPU trở lên, chỉ các đối tượng bảng sử dụng sơ đồ khóa được phân vùng. Tuy nhiên, khóa cơ sở dữ liệu không được phân vùng. Do đó, số lượng khóa cơ sở dữ liệu càng lớn, thời gian để SQL Server có được khóa trên cơ sở dữ liệu càng lâu. Hầu hết các ứng dụng không gặp bất kỳ sự cố nào do thiết kế này gây ra. Nhưng ngay khi số lượng vượt quá một ngưỡng nhất định, cần phải làm thêm công việc và thời gian để có được khóa. Mặc dù chi phí chỉ là micro giây cho mỗi khóa bổ sung, nhưng tổng thời gian có thể tăng nhanh vì vùng chứa băm khóa được bảo vệ bằng cách sử dụng khóa spinlock. Điều này gây ra thêm chu kỳ CPU và chờ các nhân viên bổ sung có được khóa.
Hotfix này giới thiệu phân vùng khóa DATABASE khi cờ theo dõi T1236 được kích hoạt lúc khởi động. Việc phân vùng khóa DATABASE giữ cho độ sâu của danh sách khóa có thể quản lý được trong từng phân vùng cục bộ. Điều này tối ưu hóa đáng kể đường dẫn truy nhập được sử dụng để có được khóa DATABASE.
Để theo dõi LOCK_HASH spinlock, bạn có thể sử dụng truy vấn sau. ĐẶT NOCOUNT BẬT
CREATE TABLE #spinlock_stats([CaptureTime] datetime,[name] nvarchar(512),[collisions] bigint,
[spins] bigint,[spins_per_collision] real,[sleep_time] bigint,[backoffs] int)
DECLARE @counter int = 1
KHI @counter< 100
BEGIN
INSERT INTO #spinlock_stats SELECT GETDATE() as "CaptureTime" , * FROM sys.dm_os_spinlock_stats WHERE [name] = 'LOCK_HASH'
CHỜ TRỄ '00:00:05'
ĐẶT @counter +=1
END
CHỌN * TỪ #spinlock_stats SẮP XẾP THEO [Thời gian chụp]
BẢNG THẢ #spinlock_stats Để biết thêm thông tin về chẩn đoán và giải quyết tranh chấp spinlock trên SQL Server, hãy truy nhập tài liệu sau:
Chẩn đoán và giải quyết tranh chấp spinlock trên SQL Server Lưu ý Mặc dù tài liệu này được viết cho SQL Server 2008 R2 nhưng thông tin này vẫn có thể áp dụng cho SQL Server 2012.
Tham khảo
Để biết thêm thông tin về cờ theo dõi trong SQL Server 2012, hãy truy nhập website TechNet sau đây:
Thông tin về cờ theo dõi trong SQL Server 2012
Để biết thêm thông tin về cách tìm số khóa cơ sở dữ liệu trong người dùng trên mỗi cơ sở dữ liệu, hãy sử dụng truy vấn sau đây để tính giá trị này:select Resource_database_id, resource_type, request_mode, request_status,
count (*) 'LockCount' từ sys.dm_tran_locks
Nhóm theo Resource_database_id, resource_type, request_mode, request_status