วิธีการในการค้นหาค่าสถานะการติดตามใหม่ใน SQL Server


38

มีร่องรอยการติดตามจำนวนมากอยู่ที่นั่น บางอย่างได้รับการบันทึกไว้เป็นอย่างดีบางอย่างไม่ได้และบางรายการก็พบว่ามีสถานะพฤติกรรมเริ่มต้นในการเปิดตัว 2016 นอกเหนือจากช่องทางการสนับสนุนอย่างเป็นทางการพนักงานของ Microsoft และอื่น ๆ แล้ววิธีการค้นหาการติดตามสถานะใหม่คืออะไร

ฉันได้อ่านบทความล่าสุดโดย Aaron Bertrand ที่นี่และที่นี่แต่ไม่เห็นอะไรเลยเกี่ยวกับ Trace Flags ใหม่

ฉันคัดลอกข้อมูลและไฟล์บันทึกของ mssqlsystemresource ไปยังตำแหน่งใหม่และแนบมันเหมือนฐานข้อมูลปกติเพื่อเปิดดูตารางระบบและมุมมอง แต่ไม่พบสิ่งใดในทันที ฉันพิจารณาการจดรายการการสืบค้นกลับสถานะที่รู้จักและวนรอบตัวเลขที่ไม่อยู่ในรายการเพื่อดูว่าใครอนุญาตให้ใช้ DBCC TRACEON แต่ต้องการถามคำถามที่นี่ก่อน

สมมติว่าคำสั่ง DBCC เพื่อเปิดใช้งานนั้นต้องทำการตรวจสอบกับทรัพยากรบางอย่างเพื่อให้แน่ใจว่าการตั้งค่าสถานะการสืบค้นกลับนั้นถูกต้อง มี. dll หรือไฟล์ระบบอื่น ๆ ที่เก็บรายการหรือไม่?

ฉันรู้ว่าคำถามนั้นสร้างความหลากหลาย แต่สิ่งที่กระตุ้นให้เกิดการอ่านเกี่ยวกับธงชาติพร้อมกับพฤติกรรมที่ตั้งใจไว้พร้อมกับคุณสมบัติใหม่ในปี 2559 ที่ไม่มีผลกระทบที่อธิบายไว้ ความคิดเริ่มต้นของฉันคือบางทีตัวเลขอาจถูกย้ายไปอย่างใดอย่างหนึ่งเช่น 7129 กลายเป็น 7219 ฉันหวังว่าจะได้รับรายชื่อของธงติดตามที่ถูกต้องภายในช่วงพูดว่า 7000-7999 เพื่อหาวิธีเรียงสับเปลี่ยน ทดสอบพวกเขาทั้งหมดทั้งในฐานะที่เป็น DBCC TRACEON และพารามิเตอร์เริ่มต้นจะค่อนข้างรำคาญรวมกับการทดสอบผลกับพฤติกรรมการทำงาน

คำตอบ:


42

ไม่มีอะไรที่คุณสามารถทำได้เพื่อค้นหารายการยกเว้นถามหรือรับพวกเขาจากโพสต์ / สไลด์เด็ค / ฯลฯ รายการมีอยู่ในรหัสเท่านั้นในไฟล์ส่วนหัวที่หมายเลขแฟล็กการติดตามที่ถูกต้องถูกแมปกับชื่อใน enum ขนาดใหญ่ในรหัส C ++ จากนั้นชื่อจะถูกใช้ในส่วนที่เหลือของรหัส

อย่างที่แอรอนกล่าวไว้คุณสามารถเปิดใช้งานหมายเลขการติดตามสถานะใด ๆ และหากไม่ได้ทำอะไรเลยหรือคุณไม่ออกกำลังกายการทำงานที่การตั้งค่าสถานะการสืบค้นนั้นเกี่ยวข้องคุณจะไม่สังเกตเห็นความแตกต่างในพฤติกรรม

DBCC TRACEON ไม่ได้ตรวจสอบอะไรเลย - เนื่องจากไม่มีรายการรันไทม์ว่าหมายเลขใดถูกต้องหรือไม่ - เพียงแค่เปิดใช้งานหมายเลขการติดตามนั้นในบิตแมปของการตั้งค่าสถานะใด ๆ สำหรับการเชื่อมต่อนั้น / ทั่วโลก

ปัญหาของการมีการตรวจสอบความถูกต้องคือการเปิดเผยว่าการติดตามสถานะใดที่ถูกต้อง วิธีนี้ 'รายการที่ถูกต้อง' จะทำให้งงงวยอย่างมีประสิทธิภาพซึ่งเป็นสิ่งที่ทีม SQL ต้องการ

เกี่ยวกับข้อเสนอแนะของ Kin ในความคิดเห็นที่ SQL Server ควรมีselect * from sys.available_trace_flags- ใช่และไม่ใช่ มีค่าสถานะการสืบค้นกลับจำนวนมากที่เป็นอันตรายต่อประสิทธิภาพการทำงานและจำเป็นสำหรับการดีบักปัญหาภายใต้คำแนะนำจากฝ่ายสนับสนุนผลิตภัณฑ์ แต่ SQL Server สามารถแสดงรายการค่าสถานะ 'ปลอดภัย'


2
หนึ่งปรับแต่งเล็กน้อย - DBCC TRACEON ตรวจสอบอะไรบางอย่างแน่นอน ส่วนสำคัญนี้แสดงรหัสที่วนซ้ำผ่านค่าสถานะการติดตามเริ่มต้นที่ 1 เวอร์ชันปัจจุบันทั้งหมดของ SQL Server จะแยกออกและเกิดข้อผิดพลาดที่หมายเลขการติดตามสถานะปัจจุบันสูงสุด: gist.github.com/BrentOzar/0e9692da8ceffeb2b4dd064e36d3174
Brent Ozar

41

วิธีการในการค้นหาค่าสถานะการสืบค้นกลับใหม่ได้อย่างไร

ส่วนใหญ่มันลงมาที่การมีเวลาและทรัพยากรทางอารมณ์ที่จะใช้ในการมองหาพวกเขา

แน่นอนว่ามันเป็นไปได้ที่จะเขียนสคริปต์เพื่อวนผ่านหมายเลขแฟล็กการติดตามที่เป็นไปได้และวิเคราะห์เอฟเฟกต์ มีหลายเหตุผลสำหรับการที่มี แต่ความผิดหวังที่พบบ่อยรวมถึงความจริงที่ว่าบางธงร่องรอยเท่านั้นที่มีประสิทธิภาพในการทำงานร่วมกับคนอื่น ๆ บางงานเท่านั้นที่มี-Tที่เริ่มต้นหรือเมื่อใช้กับบางคนเท่านั้นที่มีDBCC TRACEON OPTION (QUERYTRACEON)บางคำสั่งต้องการคำสั่งที่ไม่มีเอกสารหรือส่วนขยายคำสั่งหรือเพื่อให้สามารถเปิดใช้งานคุณลักษณะเฉพาะได้เช่นกัน บางคนสร้างเอฟเฟกต์เฉพาะเมื่อคุณรู้ว่าต้องมองหาเอฟเฟกต์เหล่านั้น และอื่น ๆ และ ... มาก ... เป็นต้น

ที่กล่าวว่าอาจเป็นเทคนิคที่มีประสิทธิภาพมากที่สุดคือการดำเนินการของแบบสอบถามเฉพาะหรือคำสั่งทีละขั้นตอนกับ debugger หรือเครื่องมือทำโปรไฟล์อื่น ๆ ที่แนบมาเปรียบเทียบเส้นทางที่ใช้กับธงร่องรอยและปิด หากฟังดูใช้เวลานานนั่นเป็นเพราะ

สำหรับฉันบางสิ่งบางอย่างอาจจะน่าสนใจมากหรือเกี่ยวข้องกับปัญหาในโลกแห่งความจริงโดยไม่มีวิธีการแก้ปัญหาที่ดีกว่าสำหรับฉันแม้แต่คิดเกี่ยวกับการเข้าไป นอกจากนี้ยังมีประโยชน์หากคุณเคยผ่านกระบวนการนี้มาหลายร้อยหรือหลายพันครั้งมาก่อนเพื่อให้ได้ความรู้สึกกว้าง ๆ สำหรับสิ่งที่คุณกำลังมองหาซึ่งช่วงของการตั้งค่าสถานะการติดตามนั้นน่าจะมีประสิทธิภาพที่สุดและเป็นส่วนใด ของ codebase จะน่าสนใจ

การตั้งค่าเบรกพอยต์บนCSessionTraceFlags::CheckSessionTraceInternalและการตรวจสอบค่าของการedxลงทะเบียน (เพื่อดูว่ามีการตรวจสอบการตั้งค่าสถานะการสืบค้นกลับ) ใดจะมีประโยชน์ในกรณีที่ง่าย ๆ แต่กรณีที่น่าสนใจไม่ได้ง่าย ๆ - และไม่ใช่การตรวจสอบสถานะทั้งหมด ส่งผลกระทบต่อเส้นทางรหัสที่ถ่าย

มีรายการค่อนข้างเล็กคือสถานะการสืบค้นกลับอย่างเป็นทางการ เหล่านี้คือแฟล็กที่ผ่านการทดสอบอย่างสมบูรณ์และสนับสนุน CSS และ (และจะ) โดยผู้พัฒนาผลิตภัณฑ์ในที่สุด พวกเขายังตั้งค่าสถานะด้วยกรณีการใช้งานทั่วไปที่เพียงพอเพื่อให้ได้เอกสารที่มีค่า

การติดตามสถานะอื่น ๆ ที่คุณพบคือความอยากรู้ที่อาจมีผลกระทบที่ไม่คาดคิดในสถานการณ์ต่าง ๆ (การสร้างที่แตกต่างกัน, SKUs, การตั้งค่าความปลอดภัย, คุณสมบัติที่แตกต่าง ... สิ่งอื่นใดที่คุณทำได้หรือนึกไม่ออก) สิ่งเหล่านี้จะถูก 'สนับสนุน' โดยบุคคลที่เขียนเกี่ยวกับพวกเขาหากทั้งหมด

มีรายการที่ไม่เป็นทางการอยู่หลายรายการสิ่งที่ดีที่สุดที่ฉันรู้จักคือA คอลเล็กชันของ SQL Server Flagsโดย Aaron Morelli (ปัจจุบันอยู่ที่ v6, เมษายน 2016)

ทั้งหมดที่กล่าวว่า Microsoft CSS ทำ (ในที่สุด) มีการเข้าถึงการติดตามสถานะทั้งหมดดังนั้นพวกเขาอาจจะสามารถแนะนำคุณในทุก ๆ ที่ที่คุณเจอแม้ว่าพวกเขาจะไม่อยู่ในรายการอย่างเป็นทางการ พวกเขาอาจเลือกที่จะไม่พูดอะไรแน่นอนและอาจมีค่าธรรมเนียมที่เกี่ยวข้อง ฉันไม่รู้จริง ๆ ไม่เคยผ่านเส้นทางนั้นมาก่อนเลย


14

เรารักษาชุดของการติดตามสถานะบน github (ตอนนี้599สถานะการติดตาม):

Microsoft SQL Server ติดตามค่าสถานะ

นอกจากนี้เทคนิคที่ดีมากที่อธิบายโดย Brent Ozar ในบทความที่ยอดเยี่ยมของเขาBad Idea Jeans: การหาร่องรอยการติดตามที่ไม่มีเอกสารและ Joe Obbish ในบทความที่ยอดเยี่ยมนี้วิธีการหาร่องรอยธง

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