Máy chủ SQL Chọn Đếm READ_COMMITTED_SNAPSHOT CÂU HỎI


8

Tôi dường như nhận được rất nhiều bế tắc khi thực hiện chọn số (*) trên một bảng cụ thể. Tôi đã thay đổi tất cả các tham số cần thiết và làm cho chúng chỉ khóa.

Tôi cũng đã thay đổi cơ sở dữ liệu để sử dụng cách ly READ_COMMITTED_SNAPSHOT,

tuy nhiên, dường như sử dụng số đếm chọn (*) trong đó cột =? trên bàn kích hoạt khóa chết hoặc khóa trên bàn ..

Tôi có đúng không khi số lượng chọn (*) chỉ nên truy cập vào các hàng trung gian?, Tuy nhiên, có vẻ như vậy và tôi vẫn gặp phải các bế tắc. Lập chỉ mục thích hợp có thể sẽ giúp,

Câu hỏi đặt ra là: Máy chủ SQL 2008 R2 có khóa chia sẻ trên bàn trong khi chọn số (*) ngay cả khi read_commned_snapshot được đặt thành bật không?

Cảm ơn


Bạn có cần một số đếm chính xác (theo yêu cầu), hoặc một số lượng gần đúng được không?
Jon Seigel

thực sự, tôi chỉ cần biết nếu các khóa được chia sẻ đang được đặt. Tôi đang cố gắng điều tra một vấn đề bế tắc. Cảm ơn
grassbl8d

Quan điểm của tôi là nếu bạn có thể xem xét thay đổi cách lấy số đếm, đó có thể là cách để giải quyết vấn đề bế tắc. Nhưng bây giờ tôi đọc lại câu hỏi, nếu bạn cần sử dụng một WHEREmệnh đề, phương pháp tôi nghĩ sẽ không hoạt động.
Jon Seigel

Bạn có thể lấy số lượng gần đúng từ các bảng siêu dữ liệu cho một tập hợp con của bảng nếu mệnh đề where khớp với chỉ mục được lọc.
Aaron Bertrand

Câu trả lời:


2

Hãy cẩn thận với READ_COMMITTED_SNAPSHOT: nếu bạn bật nó, nó có thể gây ra nhiều lỗi tinh vi.

Ngoài ra READ_COMMITTED_SNAPSHOT là mức cô lập mặc định, có thể bị ghi đè bởi một cái gì đó. Chạy DBCC USEROPTIONS để xác định mức cô lập thực tế mà bạn chọn chạy theo.

Tôi rõ ràng sẽ THIẾT LẬP CẤP PHÂN TÍCH GIAO DỊCH GIAO DỊCH SNAPSHOT ngay trước khi bạn chọn. Bằng cách đó, bạn sẽ chắc chắn rằng lựa chọn của mình không bao giờ bị bế tắc và bạn không phá vỡ bất kỳ mã nào khác, như READ_COMMITTED_SNAPSHOT có thể.


0

Việc khóa với Snapshot Isolation không thay đổi. Điều thay đổi là khi các trang đang được thay đổi theo bạn, các trang đó được sao chép vào cơ sở dữ liệu tempdb để bạn có thể đọc chúng từ cơ sở dữ liệu tempdb thay vì từ cơ sở dữ liệu thông thường. (Có, đây là phiên bản đơn giản hóa của những gì đang xảy ra.)

Bạn đã đề cập rằng bạn không có lập chỉ mục thích hợp, vì vậy bạn đang thực hiện quét chỉ mục theo cụm (hoặc quét bảng nếu đó là một đống). Đó có khả năng rất nhiều dữ liệu sẽ được chuyển đến cơ sở dữ liệu tempdb. Nếu truy vấn này là thứ sẽ được chạy nhiều lần, tôi khuyên bạn nên thêm chỉ mục vào bảng.

Mức độ cô lập nào là truy vấn của bạn bằng cách sử dụng?


Tôi đang sử dụng mức cô lập read_commited_snapshot. Tôi đã bật nó khi tôi đang sử dụng read_commited theo mặc định. Tôi chỉ quan tâm nếu khóa được đặt trong số lượng chọn. Cảm ơn, tôi đã đặt các chỉ mục btw
grassbl8d

Có ổ khóa vẫn đang được thực hiện. Bạn có thể truy vấn sys.dm_tran_locks để xem các khóa đang được thực hiện. Chạy truy vấn của bạn trong một cửa sổ và truy vấn sys.dm_tran_locks trong một cửa sổ khác để xem khóa nào đang được thực hiện. Bạn có thể đang leo thang đến khóa bảng và cần sử dụng một gợi ý để buộc các trang khóa hoặc thậm chí khóa cấp hàng.
mrdenny
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.