ทำไมดัชนีที่ถูกกรองในค่า IS NULL ไม่ถูกใช้


18

สมมติว่าเรามีคำจำกัดความของตารางดังนี้:

CREATE TABLE MyTab (
    ID INT IDENTITY(1,1) CONSTRAINT PK_MyTab_ID PRIMARY KEY
    ,GroupByColumn NVARCHAR(10) NOT NULL
    ,WhereColumn DATETIME NULL
    )

และดัชนีที่ไม่ได้ทำคลัสเตอร์ที่กรองแล้วเช่นนี้:

CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn ON MyTab 
    (GroupByColumn)
WHERE (WhereColumn IS NULL) 

เหตุใดดัชนีนี้จึงไม่ "ครอบคลุม" สำหรับคำค้นหานี้:

SELECT 
    GroupByColumn
    ,COUNT(*)
FROM MyTab
WHERE WhereColumn IS NULL
GROUP BY GroupByColumn

ฉันได้รับแผนปฏิบัติการนี้แล้ว:

ป้อนคำอธิบายรูปภาพที่นี่

KeyLookup ใช้สำหรับกริยาที่ WhereColumn IS

นี่คือแผน: https://www.brentozar.com/pastetheplan/?id=SJcbLHxO7

คำตอบ:


23

เหตุใดดัชนีนี้จึงไม่ "ครอบคลุม" สำหรับคำค้นหานี้:

ไม่มีเหตุผลที่ดี นั่นคือดัชนีครอบคลุมสำหรับแบบสอบถามนั้น

โปรดลงคะแนนสำหรับรายการที่คืนเงินที่นี่: https://feedback.azure.com/forums/908035-sql-server/suggestions/32896348-filtered-index-not-used-when-is-null-and-key-looku

และเนื่องจากวิธีแก้ไขปัญหารวมWhereColumnอยู่ในดัชนีที่กรองแล้ว:

CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn 
ON MyTab (GroupByColumn) include (WhereColumn)
WHERE (WhereColumn IS NULL) 

13
นี่เป็นรายงานเมื่อทศวรรษที่แล้วโดยเกลชอว์ จากนั้นเชื่อมต่อตาย ที่ใกล้เคียงที่สุดที่ฉันสามารถหาได้ในขณะนี้คือfeedback.azure.com/forums/908035-sql-server/suggestions/ ......
Paul White 9

3

ฉันมีปัญหาเดียวกันฉันคิดว่าเมื่อทำการทดสอบบางสัปดาห์ที่ผ่านมา ฉันมีแบบสอบถามที่มีภาคแสดงหลักที่ต้องการให้ผลลัพธ์ที่ส่งคืนมีเวลาปิด NULL และฉันคิดว่าจะใช้ดัชนีที่กรองแล้วเนื่องจาก 25K ของระเบียน 2M + เป็น NULL และตัวเลขนี้จะลดลงในไม่ช้า

ดัชนีที่กรองไม่ได้ใช้ - ฉันสันนิษฐานว่าเป็นเพราะ 'ไม่ใช่เอกลักษณ์' หรือคนทั่วไป - จนกว่าฉันจะพบบทความสนับสนุนของ Microsoftที่ระบุว่า:

เมื่อต้องการแก้ไขปัญหานี้รวมคอลัมน์ที่ทดสอบเป็น NULL ในคอลัมน์ที่ส่งคืน หรือเพิ่มคอลัมน์นี้เป็นคอลัมน์รวมในดัชนี

ดังนั้นการเพิ่มคอลัมน์ในดัชนี (หรือรวม) น่าจะเป็นการตอบสนองของ MS อย่างเป็นทางการ


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