index_id <256000 มีความสำคัญอะไร


11

ในการกวดวิชาบางอย่างผมอ่านเขียนจะถูกกรองขึ้นอยู่กับการวินิจฉัยsys.indexes index_id < 256000สิ่งนี้ทำให้สำเร็จ


2
บางทีพวกเขาคัดลอกรหัสจากsys.sysindexkeys
Martin Smith

1
@ มาร์ตินโอ้ yuck
Aaron Bertrand

1
@AaronBertrand - และก็sys.selective_xml_index_pathsเช่นsys.xml_indexesกันsys.sysindexesแต่ฉันคิดว่าสิ่งเหล่านี้จะเพิ่งได้รับการอัปเดตหากหมายเลขเวทมนต์ไม่ถูกต้องอีกต่อไป
Martin Smith

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

คำตอบ:


17

สิ่งนี้ขึ้นอยู่กับความเข้าใจผิดที่ว่าดัชนี XML เป็นประเภทเดียวที่ปัจจุบันสามารถมีรูปแบบ id ที่> = 256000 (อย่างน้อยตามการสังเกตของพวกเขา; รูปแบบนี้ไม่ได้บันทึกไว้ใน AFAIK ดังนั้นจึงไม่แน่ใจว่าเป็นเจตนาหรือไม่) อาจเป็นไปได้ดีในเวอร์ชันปัจจุบัน แต่ใครจะรู้ว่าจะเพิ่มดัชนีประเภทใดต่อไป หากคุณต้องการยกเว้นดัชนี XML ตอนนี้คุณก็จะยกเว้นสิ่งอื่นด้วย ตัวอย่างเช่นดัชนีเชิงพื้นที่ดูเหมือนจะเริ่มต้นที่ id = 384000 หากแบบสอบถามด้านบนมีเจตนาที่จะรวมดัชนีเชิงพื้นที่ แต่ไม่ใช่ดัชนี XML พวกเขาจะต้องประหลาดใจ

ตัวกรองที่ดีกว่านี้คือ:

WHERE type <> 3;

... หรือดีกว่าเนื่องจากเป็นเอกสารด้วยตนเอง ...

WHERE type_desc <> N'XML';

และตอนนี้เมื่อคุณต้องการยกเว้นพูดดัชนีเชิงพื้นที่แบบสอบถามของคุณเปลี่ยนเป็น ...

WHERE type_desc NOT IN (N'XML', N'SPATIAL');

... แทนที่จะต้องคิดออกว่าช่วงค่าตัวเลขสำหรับดัชนีเชิงพื้นที่อาจครอบครอง (หรือไม่) ขอให้โชคดี

เหล่านี้ได้รับการบันทึกสวยอย่างชัดเจนในsys.indexes (Transact SQL) ฉันไม่เห็นการอ้างอิงถึงหมายเลขเวทย์มนตร์นี้และฉันขอแนะนำให้คุณชี้ผู้แต่งบทช่วยสอนของคุณที่นี่เพื่อที่พวกเขาจะได้เห็นว่าหมายเลขเวทย์มนตร์นี้ไม่ใช่สิ่งที่พวกเขาควรจะไว้วางใจ


4
+1 นั่นเป็นนิสัยที่แย่มาก ลืมindex_idไปเลย โดยเฉพาะอย่างยิ่งเนื่องจากข้อมูลที่แม่นยำยิ่งขึ้นสำหรับการกำหนดประเภทนั่งอยู่ติดกับมัน ... แท้จริง
Thomas Stringer

1
อาจเป็นข้อผิดพลาดในการออกแบบของ SQL Server เพื่อแจก index_id ด้วยความสม่ำเสมอนี้ พวกเขาควรได้รับการสุ่มเพื่อไม่ให้ใครสามารถพึ่งพาพวกเขาได้อย่างผิดพลาด
usr

1

อ้างอิงจากหนังสือ "Microsoft SQL Server 2012 Internals" โดย Kalen Delaney, Craig Freeman, index_id ของดัชนี XML เริ่มต้นด้วยหมายเลข 256000 ดังนั้นเพื่อให้ได้ข้อมูลดัชนีทุกประเภท (การสอบถาม sys.indexes) แต่การข้ามดัชนี XML คุณสามารถวางตัวกรองแบบนั้นได้

SELECT * FROM sys.indexes WHERE index_id <256000

ชุดผลลัพธ์เดียวกันสามารถทำได้โดยวางตัวกรองในคอลัมน์ประเภทของ sys.indexes สำหรับ XML ชนิดของดัชนี type = 3

SELECT * FROM sys.indexes WHERE type <> 3

หรือ

คอลัมน์ type_desc ยังสามารถใช้ได้

SELECT * FROM sys.indexes WHERE type_desc <> 'XML'

1
คุณมีเอกสารอย่างเป็นทางการสำหรับการอ้างสิทธิ์นี้หรือไม่?
swasheck

ฉันมีที่นี่ หน้าไหน? ด้วย - ฉันเคารพ heck จากผู้เขียนเหล่านั้น แต่ฉันไม่แน่ใจว่านับเป็น "เอกสารอย่างเป็นทางการ"
swasheck

นั่นเป็นการสังเกตแบบสบาย ๆ ที่ดีที่สุดโดย Kalen ณ เวลาใดเวลาหนึ่งโดยไม่มีความรู้ว่านี่เป็นการจงใจอย่างแท้จริงโดยไม่คำนึงถึงความสามารถในการบอกเล่าในอนาคตเพื่อพิจารณาว่าดัชนีประเภทใหม่บางประเภทจะ> 256000 ในอนาคตหรือไม่ ไม่ใช่สิ่งที่ Microsoft ตั้งใจให้คุณไว้วางใจซึ่งเป็นสาเหตุที่คุณจะไม่พบการอ้างอิงใด ๆ ในเอกสารประกอบอย่างเป็นทางการ และเห็นด้วยกับ @swasheck ในขณะที่หนังสือเล่มนั้นเป็นทรัพยากรที่มีค่าอย่างแน่นอนมันไม่ได้เป็นเอกสารอย่างเป็นทางการ
Aaron Bertrand

3
@swasheck เป็นคำถามที่ว่าทำไมตัวเลข 256000 ถึงใช้ไม่ใช่สิ่งที่ปลอดภัย เพื่อการปฏิบัติที่ดีที่สุดแน่นอนฉันต้องการไปกับ Aaron
aasim.abdullah

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