Cài đặt READ UNCOMMITTED khi đọc DMV


12

Tôi đã thấy một số người gọi SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDtrước khi đọc DMV hệ thống. Có bao giờ có bất kỳ lý do để làm điều này, giả sử bạn không trộn các cuộc gọi đến DMV và bảng trong cùng một giao dịch?


1
Bạn có bất kỳ DMV cụ thể trong tâm trí? (Một ví dụ tôi nhận thấy thời gian gần đây đã ở đây sqlskills.com/blogs/jonathan/... )
Martin Smith

Vì Jonathan đang làm điều đó, tôi nghi ngờ phải có một lý do trong một số trường hợp. ☺ gì đã thúc đẩy tôi để đặt câu hỏi đã nhìn thấy nó trong một truy vấn tham gia sys.dm_exec_query_statsvào sys.dm_exec_sql_textsys.dm_exec_query_plan.
James L

Câu trả lời:


11

Là một trong những người viết các truy vấn DMV demo theo cách đó, tôi sẽ giải thích lý do.

Có vấn đề gì không nếu bạn chỉ truy vấn DMV? Nhưng không sớm thì muộn, bạn sẽ lấy một trong các tập lệnh DMV của mình và tham gia vào sys.database hoặc sys.tables hoặc một số đối tượng hệ thống khác để có thêm thông tin về những gì bạn đang xem. Nếu bạn không đọc không được cam kết ở đó, bạn có thể bị chặn bởi các truy vấn khác và chặn các truy vấn khác. Tôi đã bị đốt cháy bởi điều đó nhiều lần, vì vậy tôi chỉ sử dụng READ UNCOMMITTED theo mặc định bất cứ khi nào tôi làm bất kỳ công việc chẩn đoán nào.


1
@MartinSmith mất một thời gian, nhưng cuối cùng tôi đã viết blog về việc có bao nhiêu hàm siêu dữ liệu bỏ qua mức cô lập . Tôi đã cố gắng để làm sạch rất nhiều mã của tôi, nhưng bất cứ điều gì mới, tôi đã phát triển kể từ đó thích tham gia chứ không phải là built-in như OBJECT_ID(), SCHEMA_NAME()vv
Aaron Bertrand

7

Tôi không thấy rằng nó làm cho bất kỳ sự khác biệt.

Nếu tôi thử các cách sau và so sánh đầu ra khóa cho cả hai mức cô lập trong winmerge thì chúng hoàn toàn giống nhau (và thậm chí đặt nó lên để SERIALIZABLEkhông thay đổi đầu ra).

/*Do once so compilation and caching out the way*/
EXEC('select st.text, qp.query_plan, cp.cacheobjtype, cp.objtype, cp.plan_handle
from sys.dm_exec_cached_plans cp 
cross apply sys.dm_exec_sql_text(cp.plan_handle) st
cross apply sys.dm_exec_query_plan(cp.plan_handle) qp')

DBCC TRACEON(1200,3604,-1);

SET TRANSACTION ISOLATION LEVEL READ COMMITTED
PRINT 'READ COMMITTED'
EXEC('select st.text, qp.query_plan, cp.cacheobjtype, cp.objtype, cp.plan_handle
from sys.dm_exec_cached_plans cp 
cross apply sys.dm_exec_sql_text(cp.plan_handle) st
cross apply sys.dm_exec_query_plan(cp.plan_handle) qp')


SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
PRINT 'READ UNCOMMITTED'
EXEC('select st.text, qp.query_plan, cp.cacheobjtype, cp.objtype, cp.plan_handle
from sys.dm_exec_cached_plans cp 
cross apply sys.dm_exec_sql_text(cp.plan_handle) st
cross apply sys.dm_exec_query_plan(cp.plan_handle) qp')

DBCC TRACEOFF(1200,3604,-1);
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.