ควรมีดัชนีในแฟล็ก 'ลบแล้ว' หรือไม่

ภายในฐานข้อมูล SQL Server 2008 R2 ของฉัน เราใช้ Soft Deletes (คอลัมน์ DateTime ที่เป็นโมฆะเรียกว่า 'ลบ')

นี่คือทุกตารางในฐานข้อมูลของเรา

ฉันได้เพิ่มดัชนี โดยอิงตามตารางขนาดใหญ่เป็นหลัก ในคอลัมน์ที่ใช้กันทั่วไปในส่วนคำสั่ง WHERE หรือในส่วนคำสั่ง JOIN ON

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

SELECT ....
FROM TableA a
INNER JOIN TableB b
ON b.TableAId = a.Id
AND b.Deleted IS NULL
WHERE a.AFieldId = x

ในกรณีนี้จะเป็นประโยชน์หรือไม่ที่จะมีดัชนีเช่นนี้

CREATE NONCLUSTERED INDEX idx_TableA
ON [dbo].[Tableb] (TableAId, [Deleted])

ดังนั้น เนื่องจากข้อความค้นหาส่วนใหญ่ของฉันตรวจสอบแฟล็กที่ถูกลบ พวกมันทั้งหมดควรเป็นเช่นนี้หรือไม่


person Craig    schedule 26.08.2014    source แหล่งที่มา


คำตอบ (1)


คุณสามารถลดขนาดของดัชนีได้โดยใช้ดัชนีที่กรองแล้ว:

CREATE NONCLUSTERED INDEX idx_TableA
ON [dbo].[Tableb] (TableAId)
WHERE ( [Deleted] IS NULL )

แน่นอนว่า ดัชนีที่เกี่ยวข้องมากที่สุดมักจะเป็นดัชนีที่ครอบคลุมเสมอ:

CREATE NONCLUSTERED INDEX idx_TableA
ON [dbo].[Tableb] (TableAId)
INCLUDE ( column list )
WHERE ( [Deleted] IS NULL )

อ้างอิง: สร้างดัชนี

สร้างดัชนีที่กรอง

person Mitch Wheat    schedule 26.08.2014
comment
ขอบคุณมิทช์! กูเกิลตอนนี้เลย - person Craig; 26.08.2014
comment
สำหรับ Covering Index ในกรณีง่ายๆ ของฉันข้างต้น 'รายการคอลัมน์' จะเป็น 'TableAId' ใช่ไหม หรือรายการคอลัมน์จะเป็น 'TableAId, Deleted' จะไปถูกทางหรือเปล่า? - person Craig; 26.08.2014
comment
เมื่ออ่านสิ่งนี้: practicalsqldba.com/2013/ 03/ - คำถามของฉันเกี่ยวกับการครอบคลุมดัชนีคือ - ทำไมฉันไม่เพิ่มคอลัมน์ทั้งหมดลงใน 'รวม' เรื่องนี้มีโทษแน่นอนเหรอ? - person Craig; 26.08.2014
comment
บทลงโทษคือการรักษาดัชนีหากคอลัมน์ใดคอลัมน์หนึ่งมีการเปลี่ยนแปลง ที่ปรึกษาการปรับแต่งฐานข้อมูลมักจะแนะนำดัชนีครอบคลุมที่ทำซ้ำตารางโดยรวมคอลัมน์ทั้งหมด (ที่ไม่อยู่ในส่วนของดัชนี) ฉันไม่ค่อยคำนึงถึงคำแนะนำนี้มากนัก - person Mitch Wheat; 26.08.2014