Pengaturan BACA TIDAK DIKETAHUI saat membaca DMV


12

Saya telah melihat beberapa orang memanggil SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDsebelum membaca sistem DMV. Apakah ada alasan untuk melakukan ini, dengan asumsi Anda tidak mencampur panggilan ke DMV dan tabel dalam transaksi yang sama?


1
Apakah Anda memiliki DMV tertentu dalam pikiran? (Satu contoh yang saya perhatikan baru-baru ini ada di sini sqlskills.com/blogs/jonathan/… )
Martin Smith

Karena Jonathan melakukannya, saya curiga pasti ada alasan dalam beberapa keadaan. ☺ Apa yang mendorong saya untuk mengajukan pertanyaan melihatnya dalam kueri yang bergabung sys.dm_exec_query_statsdengan sys.dm_exec_sql_textdan sys.dm_exec_query_plan.
James L

Jawaban:


11

Ketika salah satu dari mereka menulis permintaan demo DMV seperti itu, saya akan menjelaskan alasannya.

Apakah penting jika Anda hanya meminta DMV? Tidak. Tapi cepat atau lambat, Anda akan mengambil salah satu skrip DMV Anda dan memakukan bergabung ke sys.databases atau sys.tables atau objek sistem lain untuk mendapatkan informasi lebih lanjut tentang apa yang Anda lihat. Jika Anda belum pernah membaca tanpa komitmen di sana, Anda dapat diblokir oleh kueri lain, dan memblokir kueri lainnya. Saya telah dibakar oleh itu berulang kali, jadi saya hanya menggunakan BACA TIDAK DIKOMITMASI secara default setiap kali saya melakukan pekerjaan diagnostik apa pun.


1
@ MartinSmith butuh beberapa saat, tetapi saya akhirnya menulis blog tentang berapa banyak fungsi metadata yang mengabaikan tingkat isolasi . Saya sudah mencoba untuk membersihkan banyak kode saya, tapi apa pun baru saya sudah berkembang sejak saat itu lebih memilih bergabung daripada built-in seperti OBJECT_ID(), SCHEMA_NAME(), dll
Aaron Bertrand

7

Saya tidak melihat ada bedanya.

Jika saya mencoba yang berikut dan membandingkan output kunci untuk kedua tingkat isolasi di winmerge mereka persis sama (dan bahkan memasangnya untuk SERIALIZABLEtidak mengubah output).

/*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);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.