ฉันควรใช้ดัชนีฟิลด์เดียวหลายดัชนีแทนที่จะเป็นดัชนีหลายคอลัมน์ที่เฉพาะเจาะจงหรือไม่


35

คำถามนี้เกี่ยวกับประสิทธิผลของเทคนิคการทำดัชนี SQL Server ฉันคิดว่าเป็นที่รู้จักกันในชื่อ "จุดตัดดัชนี"

ฉันกำลังทำงานกับแอปพลิเคชัน SQL Server (2008) ที่มีอยู่ซึ่งมีปัญหาเรื่องประสิทธิภาพและความเสถียรหลายประการ นักพัฒนาทำสิ่งแปลก ๆ ด้วยการจัดทำดัชนี ฉันไม่สามารถรับข้อสรุปมาตรฐานเกี่ยวกับปัญหาเหล่านี้ได้ฉันไม่สามารถหาเอกสารที่ดีเกี่ยวกับ internets ได้

มีคอลัมน์ที่ค้นหาได้จำนวนมากในตาราง นักพัฒนาสร้างดัชนีคอลัมน์เดียวในแต่ละคอลัมน์ที่ค้นหาได้ ทฤษฎีคือ SQL Server จะสามารถรวม (ตัดกัน) แต่ละดัชนีเหล่านี้เพื่อเข้าถึงตารางอย่างมีประสิทธิภาพในสถานการณ์ส่วนใหญ่ นี่คือตัวอย่างที่ง่าย (ตารางจริงมีเขตข้อมูลเพิ่มเติม):

CREATE TABLE [dbo].[FatTable](
    [id] [bigint] IDENTITY(1,1) NOT NULL,
    [col1] [nchar](12) NOT NULL,
    [col2] [int] NOT NULL,
    [col3] [varchar](2000) NOT NULL, ...

CREATE NONCLUSTERED INDEX [IndexCol1] ON [dbo].[FatTable]  ( [col1] ASC )
CREATE NONCLUSTERED INDEX [IndexCol2] ON [dbo].[FatTable] ( [col2] ASC )

select * from fattable where col1 = '2004IN' 
select * from fattable where col1 = '2004IN' and col2 = 4

ฉันคิดว่าดัชนีคอลัมน์หลายรายการที่กำหนดเป้าหมายตามเกณฑ์การค้นหานั้นดีกว่ามาก แต่ฉันอาจผิด ฉันเคยเห็นแผนการสืบค้นที่แสดง SQL Server ที่ทำการแฮชจับคู่กับการค้นหาดัชนีสองรายการ บางทีนี่อาจสมเหตุสมผลเมื่อคุณไม่ทราบวิธีค้นหาตาราง ขอบคุณ


@brentozar มีวิดีโอที่ดีเกี่ยวกับดัชนีที่ควรค่าแก่การดู: brentozar.com/sql-server-training-videos/…
DForck42

คำตอบ:


38

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

อย่างไรก็ตามคุณสามารถใช้กฎง่ายๆได้ MSDN ครอบคลุมพื้นฐานค่อนข้างดี:

นอกจากนี้ยังมีบทความมากมายจากชุมชนเช่น Webcast บันทึก - DBA รางวัลดาร์วิน: ดัชนีฉบับ

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


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