"ดัชนีการจับคู่บางส่วน" คืออะไร


27

ฉันกำลังพยายามเรียนรู้เพิ่มเติมเกี่ยวกับตัวดำเนินการแบบสอบถาม "การอ้างอิงต่างประเทศ" ที่แนะนำใน SQL Server 2016 มีข้อมูลไม่มากนัก Microsoft ประกาศมันนี่และฉัน blogged เกี่ยวกับเรื่องนี้ที่นี่ ผู้ประกอบการใหม่สามารถมองเห็นได้โดยการลบแถวจากตารางผู้ปกครองที่มี 254 หรือเข้ามาเพิ่มเติมอ้างอิงที่สำคัญต่างประเทศ: การเชื่อมโยง dbfiddle

มีจำนวนการนับที่แตกต่างกันสามรายการที่แสดงในรายละเอียดผู้ประกอบการ

ตรวจสอบรายละเอียด FK

  • การอ้างอิงคีย์ต่างประเทศนับเป็นจำนวนของคีย์ต่างประเทศที่เข้ามา
  • ไม่มีการนับดัชนีที่ตรงกันคือจำนวนกุญแจต่างประเทศที่เข้ามาโดยไม่มีดัชนีที่เหมาะสม การตรวจสอบว่าตารางที่อัปเดตหรือถูกลบจะไม่ละเมิดข้อ จำกัด ดังกล่าวจะต้องสแกนตารางลูก
  • ฉันไม่รู้ว่าการจับคู่ดัชนีบางส่วนหมายถึงอะไร

ดัชนีการจับคู่บางส่วนในบริบทนี้คืออะไร ฉันไม่สามารถทำงานต่อไปนี้ได้:

  • ดัชนีที่กรองแล้ว
  • การวางคอลัมน์คีย์ต่างประเทศเป็นINCLUDEคอลัมน์สำหรับดัชนี
  • สร้างดัชนีด้วยคอลัมน์ foreign key เป็นคอลัมน์ key ที่สอง
  • ดัชนีคอลัมน์เดี่ยวสำหรับปุ่มต่างประเทศหลายคอลัมน์
  • การสร้างดัชนีครอบคลุมหลายรายการเพื่อเปิดใช้งานแผน "เข้าร่วมดัชนี" สำหรับคีย์ต่างประเทศหลายคอลัมน์

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

คำตอบ:


13

ฉันพูดกับผู้คนที่ฉลาดกว่าฉันมากและเราจะบันทึกเรื่องนี้ในไม่ช้า™

คำจำกัดความที่แท้จริงของสิ่งนี้ในระหว่างกาลคือ:

PartialMatchingIndexCount สะท้อนให้เห็นถึงจำนวนของการอ้างอิงที่สามารถตรวจสอบได้โดยใช้ดัชนีพยายาม แต่คีย์ดัชนีไม่ครอบคลุมคอลัมน์ทั้งหมดที่กำลังตรวจสอบ ตัวอย่างเช่นองค์ประกอบ ForeignKeyReferenceCheck ที่สอดคล้องกันประกอบด้วยทั้ง Seek Predicates และองค์ประกอบ Predicate

นอกจากนี้:

หากตัวเลขนี้มากกว่า 0 แสดงว่าอาจมีปัญหาเรื่องประสิทธิภาพในกรณีที่การจับคู่บางส่วนส่งผลให้เกิดแถวจำนวนมาก


6
ตัวอย่างการทำงานหรือเอกสารจริงจะรุ่งโรจน์ เงินรางวัลที่เสนอ
Tom V - Team Monica

3

หลังจาก googling เพิ่มเติมฉันจัดการขึ้นมาโพสต์ที่กล่าวถึง "ดัชนีการจับคู่บางส่วน" และคีย์ต่างประเทศ

1 มีนาคม 2013 โพสต์บล็อกในคาร์ลอ Klapp บล็อกรหัสสิทธิForeign Keys without Indexesที่มีขั้นตอนการเก็บเรียกว่าUtil_FKsWithoutIndexesซึ่งมีลักษณะสำหรับปุ่มต่างประเทศที่ไม่ได้มีการจัดทำดัชนีที่เหมาะสมสำหรับความสัมพันธ์ FK (ดูเหมือนว่าบล็อกเกอร์นี้ยกจากSQL Server Central's The Ultimate Index-Less Foreign-Key Finder(15 ต.ค. 2009) ) บล็อกบอกว่า:

ค้นหาข้อ จำกัด foreign key ที่ไม่มีดัชนีที่ตรงกันทั้งหมด

ดัชนีการจับคู่บางส่วนที่ดีที่สุดจะถูกเอาท์พุทด้วย MatchCounts และการเปรียบเทียบคอลัมน์

สร้างเทมเพลต CREATE INDEX สำหรับ foreign-key แต่ละตัวโดยไม่มีดัชนีที่ตรงกันหรือดัชนีที่ตรงกันบางส่วน

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

FK ที่ขาดดัชนีการจับคู่แบบเต็มอาจส่งผลกระทบต่อประสิทธิภาพการทำงานของ DELETES ในตารางอ้างอิงเนื่องจากการสแกนตารางเพื่อตรวจสอบความสมบูรณ์ของการอ้างอิงรวมถึง SELECTS ในตารางอ้างอิงที่คอลัมน์คีย์ต่างประเทศอยู่ในส่วนที่ WHERE หรือ JOIN เข้าร่วม (สิ่งนี้จะส่งผลกระทบต่อคุณว่ามีข้อ จำกัด หรือไม่) นี่จะตรวจสอบคอลัมน์ N แรกของดัชนีโดยที่ N คือจำนวนคอลัมน์ในข้อ จำกัด foreign key

ลำดับคอลัมน์ดัชนีไม่ได้รับการยืนยันนอกเหนือจากนี้ (FK สองคอลัมน์ที่มี 1 คอลัมน์ที่ตรงกันในคอลัมน์ที่ 2 ของดัชนี 3 คอลัมน์จะถูกส่งออกเป็นการจับคู่บางส่วน)

หากฐานข้อมูลของคุณไม่มีข้อ จำกัด foreign key เครื่องมือนี้จะไม่มีประโยชน์กับคุณ

ฐานข้อมูลจำนวนมากมีข้อ จำกัด ที่เป็นกุญแจต่างประเทศบางส่วน ใช้งานได้เฉพาะบนตารางที่เกี่ยวข้องซึ่งมีการประกาศข้อ จำกัด

ถ้าฉันเข้าใจสิ่งนี้อย่างถูกต้องหากความสัมพันธ์ FK ไม่มีดัชนีที่ตรงกับทุกคอลัมน์ในดัชนีที่จำเป็นบางอย่างอาจมีดัชนีบางอย่างที่มีคอลัมน์บางส่วน ตัวอย่างเช่นถ้าความสัมพันธ์ FK มีคอลัมน์ที่สาม ( a, b, c) แต่มีดัชนีกับผู้ที่เดียวกันสามคอลัมน์ไม่อาจมีดัชนีที่มี ( a, b) หรือ ( a, c) หรือ ( b, c) และอาจช่วยให้มีคำสั่ง แต่จะ ต้องการดัชนีการสแกนไปยังแถวที่มีคอลัมน์หายไป

หากไม่มีดัชนีใด ๆ ที่สามารถรองรับข้อ จำกัด FK ดังนั้น "การนับดัชนีการจับคู่บางส่วน" จะเป็นศูนย์ ( 0) หรืออย่างน้อยจะไม่เพิ่มจำนวนการนับนี้


นี่คือสิ่งที่คุณมีในใจ? ยังไม่สามารถทำงานได้ ... dbfiddle.uk/…
Joe Obbish

ไม่แน่นอน ลองทำ FK ด้วยและสร้างดัชนีใน(FKey2,FKey3) FKey2โปรดลองสิ่งนั้น
RolandoMySQLDBA

โปรดจำไว้ว่าฉันไม่ใช่ SQL Server guy แต่ฉันแค่พยายามช่วย
RolandoMySQLDBA

ฉันเข้าใจและชื่นชมความคิดที่จะลอง ฉันยังไม่สามารถทำให้คอลัมน์สองคอลัมน์นี้ทำงานได้
โจ Obbish

คุณสามารถทิ้งcreate unique index FULL_IX_UNIQUE ON FK_PARENT_TABLE (FKey, Fkey2, Fkey3)ดัชนีไว้FKey2และลองใหม่อีกครั้ง
RolandoMySQLDBA
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.