Cách tái tạo không thể tiếp tục quét bằng NOLOCK do di chuyển dữ liệu


10

Thỉnh thoảng tôi nhận được "Không thể tiếp tục quét NOLOCKdo di chuyển dữ liệu" với một số công việc lớn, có WITH (NOLOCK)các truy vấn được chọn.

Tôi hiểu điều này có liên quan đến việc cố gắng chọn dữ liệu khi có sự phân tách trang khiến dữ liệu không còn ở nơi đáng lẽ phải xảy ra - Tôi cho rằng đó là những gì đang xảy ra trong môi trường của tôi.

Làm thế nào tôi có thể tái tạo điều này?

Tôi đang cố gắng thực hiện một cách giải quyết ngắn hạn để bắt lỗi và thử lại khi điều này xảy ra, nhưng tôi không thể kiểm tra nếu tôi không thể tái tạo nó. Có một cách hợp lý đáng tin cậy để gây ra điều này?

Khi điều đó xảy ra, việc thực hiện lại truy vấn sẽ dẫn đến thành công - vì vậy tôi thực sự không có bất kỳ lo ngại nào về dữ liệu thực tế hoặc cơ sở dữ liệu bị hỏng vĩnh viễn. Một số bảng trong truy vấn (cùng với các chỉ mục của chúng) bị bỏ, được tạo lại và được lặp lại thường xuyên, vì vậy tôi cho rằng đó là một cái gì đó liên quan đến điều đó.

Loại bỏ NOLOCKlà vấn đề dài hạn của tôi để giải quyết. Lý do NOLOCKđược đặt ở đó ngay từ đầu là vì các truy vấn rất tệ đến nỗi chúng bế tắc với các giao dịch hàng ngày, do đó, NOLOCKmột viện trợ ban nhạc để ngăn chặn các bế tắc (hoạt động). Vì vậy, tôi cần một ban nhạc hỗ trợ cho một ban nhạc cho đến khi chúng tôi có thể làm một giải pháp lâu dài.

Nếu tôi có thể tái tạo nó bằng Hello World, tôi sẽ lên kế hoạch cho việc hỗ trợ ban nhạc vào công việc trong vòng chưa đầy một giờ. Không thể thực hiện xóa và tìm kiếm thay thế NOLOCK, bởi vì tôi bắt đầu gặp lại các bế tắc ứng dụng, điều này đối với tôi tệ hơn là một công việc không thường xuyên xảy ra.

Sử dụng đọc cách ly ảnh chụp đã cam kết là một khả năng tốt - tôi sẽ phải làm việc với nhóm cơ sở dữ liệu của chúng tôi để biết thêm chi tiết về điều đó. Một phần của vấn đề của chúng tôi là chúng tôi không có chuyên gia SQL Server để giải quyết vấn đề đó và tôi không hiểu rõ các mức cô lập đủ để thực hiện thay đổi đó ngay bây giờ.


1
Bạn đã xem xét đơn giản là loại bỏ NOLOCKkhỏi những công việc này? 601 nên là ít lo lắng nhất của bạn nếu kết quả của các truy vấn này được cho là chính xác . Paul White cho thấy một ví dụ đặc biệt khủng khiếp về việc đọc dữ liệu không nên có ở đây .
Aaron Bertrand

3
Bạn có thể thiết lập DEADLOCK_PRIORITYđể LOWtrong công việc, do đó nếu có sự bế tắc, các công việc sẽ thất bại, và không phải là các ứng dụng. Sau đó, bạn có thể nghiên cứu các bế tắc và tìm hiểu lý do tại sao chúng đang xảy ra và khắc phục vấn đề đó. Nó có thể là một sửa chữa rất đơn giản, như hoán đổi thứ tự của hai câu lệnh. Dù vấn đề là, NOLOCKkhông phải là giải pháp , vì vậy ngừng cố gắng để buộc nó phải chỉ vì đó là đơn giản nhất.
Aaron Bertrand

@AaronBertrand Cảm ơn, không biết về DEADLOCK_PRIORITY - Tôi sẽ xem xét điều đó. Chúng tôi đã cố gắng theo dõi các bế tắc, nhưng chúng đã xảy ra vào những thời điểm dường như ngẫu nhiên khác nhau và chỉ một hoặc hai lần mỗi ngày và không bao giờ có thể sao chép theo yêu cầu - các công việc theo lịch trình của chúng tôi chạy hàng chục nghìn truy vấn mỗi giờ và ứng dụng của chúng tôi thực hiện hàng trăm truy vấn bất cứ khi nào nó chỉ tải một trang hoặc lưu một cái gì đó và chúng tôi đã không theo dõi truy vấn nào ở hai bên có liên quan đến bế tắc. Tôi không có ý định rời NOLOCK ở đó mãi mãi, đó là lý do tại sao chúng tôi đang nghiên cứu các giải pháp dài hạn tốt hơn.
wookie23

1
Bạn đã đề cập rằng bạn đã có một thời gian khó khăn để theo dõi các bế tắc. Cho rằng bạn đang ở 2008 R2, bạn có thể xem tại đây: sqlservercentral.com/articles/deadlock/65658 Jonathan Kehayias tiếp tục lấy thông tin về khóa chết từ bộ đệm vòng.
Kenneth Fisher

Các câu trả lời và nhận xét giải quyết tốt vấn đề tiềm ẩn, nhưng bạn vẫn quan tâm đến việc tìm cách tái tạo điều này như một bài tập trí tuệ?
James L

Câu trả lời:


8

Vì một 'trợ giúp băng tần' tiềm năng cho các vấn đề NOLOCK là ngừng sử dụng NOLOCK và bắt đầu sử dụng cách ly READ_COMMITTED_SNAPSHOT, tôi muốn chỉ cho bạn bài đăng trên blog tại http://www.brentozar.com bởi Kendra Little: Thực hiện Ảnh chụp nhanh hoặc Đọc cam kết Ảnh chụp cách ly trong SQL Server: Hướng dẫn .

Kendra cung cấp một lượng chi tiết hợp lý về lợi ích và rủi ro khi sử dụng mức cách ly READ_COMMITTED_SNAPSHOT.

  1. Mức cô lập này trở thành mức cô lập mặc định cho mã cơ sở dữ liệu.
  2. Bạn chỉ có một người dùng trong cơ sở dữ liệu để thực hiện thay đổi về mức cô lập READ_COMMITTED_SNAPSHOT.
  3. Ngay cả khi bạn sử dụng cách ly READ_COMMITTED_SNAPSHOT, bạn vẫn sẽ cần xóa các gợi ý NOLOCK vì chúng ghi đè mặc định.
  4. Một số mã của bạn có thể có vấn đề cần chữa.

Một vài năm trước, chúng tôi thực hiện READ_COMMITTED_SNAPSHOT cô lập trên một cơ sở dữ liệu đã được nghiêm trọng bị chặn . Nhưng một khi chúng tôi thay đổi mức độ cô lập, chúng tôi bắt đầu gặp bế tắc ở một vài khu vực quan trọng.

Tại sao điều này xảy ra? Bởi vì mức cô lập trước đó đã gây ra sự ngăn chặn nặng nề, mã có thể "không bao giờ" đạt đến điểm bế tắc. Tuy nhiên, với cách ly READ_COMMITTED_SNAPSHOT, các truy vấn có thể tiếp tục di chuyển về phía trước. Tuy nhiên, một số phần trăm của các giao dịch không còn chờ đợi đã bắt đầu bế tắc.

May mắn là trường hợp của chúng tôi đã được giải quyết nhanh chóng bằng cách xác định các điểm bế tắc và điều chỉnh các chỉ mục trên một vài bảng để có thứ tự cột hợp lý hơn. Điều này làm giảm đáng kể các vấn đề khóa của chúng tôi.

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.