Có một tình huống trong thiết lập hiện tại của bạn mà sẽ / có thể gây ra một số suy giảm liên quan đến một chìa khóa tự động incrementing ( IDENTITY
, GETDATE()
, NEWSEQUENTIALID()
): dưới hoạt động INSERT-đồng thời cao, có thể có tranh chấp liên quan đến việc đặt hàng trên cùng một trang. Đây được gọi là "điểm nóng" và là một trong số ít những hạn chế đối với các giá trị gia tăng tự động vì về bản chất, chúng sẽ nằm ngay cạnh nhau.
Tôi thấy thông tin mâu thuẫn về việc liệu vấn đề "điểm nóng" có còn liên quan hay không:
Có một số điều thú vị cần lưu ý liên quan đến ba liên kết sau:
- Một số câu trả lời trong câu hỏi DBA.SE đó đề cập đến hai liên kết khác ở trên. @Gbn đã chỉ ra rằng bài báo cho thấy vấn đề hotspot vẫn tồn tại "sử dụng một chỉ mục cụm không duy nhất trên TranTime. Điều này đòi hỏi phải thêm một công cụ duy nhất. Điều đó có nghĩa là chỉ mục không tăng đơn điệu (và quá rộng) . "
- Về mặt kỹ thuật, giá trị duy nhất (và do đó không gian được chiếm bởi trường ẩn đó) chỉ tồn tại trên các hàng không phải là duy nhất. Do đó, có thể thêm từng hàng, từng hàng một, theo cách đơn luồng và nó sẽ là các giá trị duy nhất sẽ tăng lên và sẽ không có giá trị uniqifier.
- Tuy nhiên, thử nghiệm đó đã mô phỏng 400 kết nối đồng thời chạy thử nghiệm 200 lần (mỗi lần kết nối, tôi giả sử), do đó rất có thể một vài trong số các hoạt động INSERT đó đã xảy ra ở cùng một mili giây và nhận được cùng một giá trị từ đó
GETDATE()
.
- Ergo, trong khi có thể thích hợp để loại trừ thử nghiệm cụ thể đó là không hợp lệ đối với "Các điểm nóng có xảy ra khi sử dụng một giá trị duy nhất, ngày càng tăng như chỉ số được nhóm không?", Thử nghiệm đó có thể rất phù hợp ở đây. Mô tả về chỉ mục trong câu hỏi này là nó có "một khóa cụm (DateTime) được tạo thông qua GETDATE ()". Có vẻ an toàn khi giả định rằng chỉ mục trong câu hỏi này không phải là duy nhất (đặc biệt nếu đó chỉ là một trường DATETIME). Và ông đã kiểm tra 400 kết nối đồng thời trong khi câu hỏi này nói rằng có khoảng 500 kết nối đồng thời? Nghe có vẻ như một thiết lập rất giống nhau. Vì vậy, thật hợp lý khi chạy cùng một tập lệnh "SQL Server Perf Stats" để xem bạn có đang thấy sự tranh chấp LATCH tương tự hay không.
Một điều khác cần xem xét là trong khi bảo trì chỉ mục (REBUILD / REORGANIZE) không được thực hiện tự động, thì việc cập nhật số liệu thống kê làđược thực hiện tự động (với tỷ lệ trượt của% hàng thay đổi). Đây là cài đặt mặc định cho cơ sở dữ liệu, trừ khi bạn đặt "Thống kê cập nhật tự động" thành "sai". Có một tùy chọn liên quan là "sai" theo mặc định và đó là "Tự động cập nhật thống kê không đồng bộ" sẽ không gây ra bất kỳ chặn nào trong hoạt động cập nhật tự động đó. Việc chặn gây ra bởi hoạt động thống kê tự động cập nhật xảy ra trong quá trình tạo kế hoạch cho bất kỳ gói nào đang cần thông tin về thống kê cụ thể đang được cập nhật tại thời điểm đó. Tùy chọn "Tự động cập nhật thống kê không đồng bộ" cho phép Trình tối ưu hóa truy vấn sử dụng các thống kê được biết là cũ và đang được cập nhật; một khi các số liệu thống kê được cập nhật, chúng sẽ được sử dụng.
Một điều khác có thể gây ra sự chậm lại định kỳ của INSERT (cũng như một số CẬP NHẬT) là các hoạt động tăng trưởng tự động của dữ liệu và tệp nhật ký. Rõ ràng là bản ghi tran sẽ phát triển ngay cả với các hoạt động XÓA. Nhưng các hoạt động INSERT và các hoạt động CẬP NHẬT trong đó hàng mới lớn hơn phiên bản trước của hàng đó, có khả năng sẽ cần các trang mới được phân bổ nếu không còn chỗ trống trên trang thích hợp. Nếu không còn chỗ trống để phân bổ trang, SQL Server sẽ cố gắng phát triển tệp dữ liệu (trừ khi điều này đã bị vô hiệu hóa). Trong khi tệp dữ liệu (hoặc nhật ký) đang được phát triển, các thao tác đối với tệp đó sẽ bị chặn. Đây là lý do tại sao điều quan trọng là phải kích thước đúng các tệp dữ liệu để có chỗ cho các bảng trong đó phát triển mà không cần tự động phát triển, hoặc ít nhất là không thường xuyên.
Và để hoàn thiện, có CHECKPOINT
hành vi được @Remus chỉ ra trong một câu trả lời khác cho câu hỏi này.
Cần lưu ý rằng Chia tách trang không phải là một chức năng của các hoạt động DML nói chung hoặc dưới tải nặng; chúng là một chức năng của:
- (thứ tự chèn dữ liệu, HOẶC
- tăng kích thước hàng cho dữ liệu được cập nhật), VÀ
- có hay không có chỗ trên trang thích hợp cho một trong những sự kiện đó
Các hoạt động INSERT một luồng của khóa tăng tự động sẽ không bao giờ gây ra sự phân tách trang. Hoạt động INSERT đa luồng của một chìa khóa tự động incrementing thể (Tôi tin) được thực hiện out-of-trật tự (và do đó có khả năng gây ra một sự chia rẽ page) trong một số lượng lớn, kịch bản INSERT đồng thời tùy thuộc vào nếu các Scheduler (hệ điều hành SQL đa luồng) sẽ làm một cái gì đó như gán giá trị từ GETDATE()
nhưng sau đó đặt luồng đó ở chế độ chờ trong khi một luồng khác được chèn, chỉ quay lại cái này để chèn thực tế. Tôi nhấn mạnh "nếu" vì tôi chưa chứng minh rằng điều này xảy ra. Và các hoạt động CẬP NHẬT, ở bất kỳ khối lượng nào, không nên gây ra sự chia tách trang nếu kích thước hàng không tăng.