การตั้งค่า READ UNCOMMITTED เมื่ออ่าน DMV


12

ฉันเคยเห็นหลายคนโทรSET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDมาก่อนอ่านระบบ DMV มีเหตุผลใดที่จะทำเช่นนี้โดยสมมติว่าคุณไม่ได้โทรไปยัง DMV และตารางในธุรกรรมเดียวกันหรือไม่?


1
คุณมี DMV เฉพาะหรือไม่ (ตัวอย่างหนึ่งที่ฉันสังเกตเห็นเมื่อเร็ว ๆ นี้คือที่นี่sqlskills.com/blogs/jonathan/ … )
Martin Smith

ตั้งแต่โจนาธานทำเช่นนั้นฉันสงสัยว่าจะต้องมีเหตุผลในบางสถานการณ์ ☺สิ่งที่กระตุ้นให้ฉันไปถามคำถามได้เห็นมันในแบบสอบถามที่ได้เข้าร่วมsys.dm_exec_query_statsการและsys.dm_exec_sql_text sys.dm_exec_query_plan
James L

คำตอบ:


11

ในฐานะที่เป็นหนึ่งในผู้เขียนการสาธิต DMV แบบสอบถามด้วยวิธีนี้ฉันจะอธิบายว่าทำไม

มันสำคัญไหมถ้าคุณจะสืบค้นเฉพาะ DMVs? ไม่ แต่ไม่ช้าก็เร็วคุณจะต้องใช้หนึ่งในสคริปต์ DMV ของคุณแล้วทำการเข้าร่วม sys.database หรือ sys.tables หรือวัตถุระบบอื่น ๆ เพื่อรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่คุณกำลังดู หากคุณไม่ได้อ่านข้อผูกมัดที่นั่นคุณสามารถบล็อกโดยการสืบค้นอื่น ๆ และปิดกั้นการสืบค้นอื่น ๆ ฉันถูกเขียนซ้ำหลายครั้งดังนั้นฉันจึงใช้ READ UNCOMMITTED เป็นค่าเริ่มต้นทุกครั้งที่ฉันทำการวินิจฉัยใด ๆ


1
@MartinSmith มันเอาในขณะที่ แต่ฉันไม่ในที่สุดบล็อกเกี่ยวกับวิธีการที่หลายฟังก์ชั่นข้อมูลเมตาไม่สนใจระดับแยก ฉันได้พยายามที่จะทำความสะอาดมากรหัสของฉัน แต่สิ่งใหม่ผมได้พัฒนาตั้งแต่นั้นชอบร่วมมากกว่าสร้างอินเหมือนOBJECT_ID(), SCHEMA_NAME()ฯลฯ
แอรอนเบอร์ทรานด์

7

ฉันไม่เห็นว่ามันสร้างความแตกต่าง

หากฉันลองต่อไปนี้และเปรียบเทียบเอาต์พุตล็อคสำหรับทั้งสองระดับการแยกใน winmerge พวกเขาจะเหมือนกัน (และวางไว้เพื่อSERIALIZABLEไม่เปลี่ยนเอาต์พุต)

/*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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.