Tùy chọn để đặt gợi ý NOLOCK trong truy vấn dữ liệu


7

Một số bối cảnh:
Lúc đầu, chúng tôi đã viết các báo cáo chỉ "thẳng lên", không có bất kỳ gợi ý khóa nào trong các truy vấn. Với các báo cáo lớn hơn, điều này đôi khi sẽ gây ra vấn đề khóa. Đầu tiên, chúng tôi đã khắc phục điều này bằng cách sử dụng WITH (NOLOCK)gợi ý cho các bảng trong truy vấn.

Bởi vì (a) nó khá gây khó chịu, và (b) thật dễ dàng để quên đi những gợi ý cho một trong các bảng, chúng tôi chuyển đến một môi trường tiếp cận thứ hai TRANSACTION ISOLATION LEVELđến READ UNCOMMITTED(mà là tốt) ở phía trên cùng của truy vấn mỗi tập dữ liệu.

Như bạn có thể đoán, vẫn dễ dàng quên gợi ý cho một trong các bộ dữ liệu. Vì vậy, điều này dẫn đến câu hỏi:


Câu hỏi: các tùy chọn để gửi NOLOCKgợi ý cùng với các truy vấn báo cáo là gì?

Tái bút Tôi nhận ra đây là một vấn đề XY ở một mức độ nào đó (với rất nhiều tùy chọn khác của tôi cho X, chẳng hạn như tối ưu hóa truy vấn, không thực hiện báo cáo trên cơ sở dữ liệu vận hành, v.v.), nhưng dù sao cũng đã cố gắng đặt câu hỏi hợp lệ này .


Tùy chọn:
Dưới đây là các tùy chọn được đề cập ở trên, với các tùy chọn bổ sung mà tôi tò mò nếu chúng hoạt động:

  1. Đặt WITH (NOLOCK)gợi ý cho mỗi bảng. (khó chịu, rất dễ quên)
  2. Đặt mức cô lập READ UNCOMMITTEDcho toàn bộ truy vấn. (vẫn dễ quên)
  3. Có thể chỉ định điều này ở cấp báo cáo ? Ví dụ: đảm bảo tất cả các truy vấn dữ liệu cho một báo cáo sẽ được chạy mà không bị khóa.
  4. Có thể chỉ định điều này ở một số cấp độ SSRS khác không? Ví dụ: có thể đặt điều này cho một Thư mục báo cáo nhất định hoặc bằng cách sử dụng tiện ích mở rộng?
  5. Có thể chỉ định điều này ở cấp chuỗi dữ liệu / chuỗi kết nối không? Ví dụ: tất cả các báo cáo có liên quan có sử dụng một "Nguồn dữ liệu không khóa" nhất định không?
  6. Liên quan đến tùy chọn trước: có lẽ bạn có thể chỉ định gợi ý khóa mặc định cho "người dùng không khóa" cụ thể (người dùng được sử dụng trong kết nối)?
  7. ???

Những lựa chọn khả thi? Có những lựa chọn tôi đã bỏ lỡ?


Vấn đề với việc đi đến mọi nơi, hoặc thay đổi sự cô lập để đọc không được cam kết trên bảng là vấn đề chất lượng dữ liệu. Bạn không chỉ nhận được những lần đọc bẩn, nhưng bạn có khả năng có thể trả lại cùng một dữ liệu hai lần hoặc bỏ lỡ dữ liệu hoàn toàn. Có thể tốt hơn để xem thiết kế của bạn và xem liệu đã đến lúc cho một cơ sở dữ liệu báo cáo riêng biệt. Xem câu hỏi
Mike Walsh

@MikeWalsh Đồng ý. Đó là những gì tôi cũng đã cố gắng liên quan đến một chút về vấn đề XY. Tuy nhiên, biết nơi nào và khi nào là một tùy chọn để sử dụng gợi ý khóa có thể có lợi, nếu được sử dụng cẩn thận.
Jeroen

Câu trả lời:


5

Những câu trả lời nhanh:

  1. Hoạt động, như bạn lưu ý.
  2. Hoạt động, như bạn lưu ý.
  3. Điều này không xuất hiện để làm việc. Tôi đã không thấy một tùy chọn ngoài tầm tay và bất cứ khi nào câu hỏi đó được hỏi, câu trả lời luôn quay trở lại để thiết lập mức cô lập trong quy trình được lưu trữ .
  4. Tôi sẽ không tin như vậy. SSRS ở tầng trừu tượng cao hơn công cụ cơ sở dữ liệu, do đó, ở một khía cạnh nào đó, nó không 'quan tâm' mức độ cô lập là gì - sau tất cả, bạn có thể sử dụng các giải pháp không phải RDBMS trong các báo cáo của mình.
  5. Điều này không hoạt động. Bạn không thể đặt mức cô lập trong chuỗi kết nối .
  6. Điều này có thể làm việc. Bạn có thể tạo một kích hoạt đăng nhập .

Có một vài tùy chọn khả thi nếu các báo cáo được tối ưu hóa và vẫn gây ra sự cố:

  1. Sử dụng Luôn bật nếu bạn có SQL 2012. Sau đó, bạn có thể có một bản sao chỉ đọc mà báo cáo SSRS của bạn có thể sử dụng.
  2. Sử dụng nhân rộng: ảnh chụp nhanh nếu bạn không cần thời gian thực và giao dịch nếu bạn cần nó gần với thời gian thực.
  3. Nếu bạn không có ngân sách cho Luôn bật hoặc kiên nhẫn để xử lý sao chép, hãy sao chép với giá rẻ: tạo một lược đồ thân thiện với báo cáo (nghĩa là không chuẩn hóa các bảng và đặt chúng ở định dạng giúp chạy báo cáo dễ dàng hơn ) và sử dụng SSIS để cung cấp lược đồ Báo cáo đó. Điều này hoạt động tốt hơn nếu người dùng cuối của bạn có thể sống với dữ liệu "cũ hơn" (ví dụ: cập nhật hàng giờ hoặc cứ sau 5 phút). Nhược điểm là bạn sẽ thiết kế mô hình dữ liệu hai lần: một lần cho mô hình OLTP và một lần cho mô hình kho giả. Ưu điểm là nếu bạn từng di chuyển theo hướng kho dữ liệu tập trung, đây là một bài tập rất hữu ích.

6

Bạn đã xem xét READ_COMMITTED_SNAPSHOTphiên bản hàng cho cơ sở dữ liệu?

Kim Tripp có một bài viết hay về nó tại http://msdn.microsoft.com/en-us/l Library / ms345124% 28v = sql.90% 29.aspx

READ_COMMITTED_SNAPSHOTcho phép chức năng tốt hơn WITH (NOLOCK)ở chỗ nó cung cấp tính nhất quán theo thời gian tuyệt đối cho các tập hợp hoặc truy vấn chạy dài với thông lượng tăng do giảm tranh chấp khóa.

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.