Tại sao chỉ mục được lọc trên giá trị IS NULL không được sử dụng?


18

Giả sử chúng ta có một định nghĩa bảng như thế này:

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

Và một chỉ mục không được lọc như thế này:

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

Tại sao chỉ mục này không "bao phủ" cho truy vấn này:

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

Tôi đang nhận kế hoạch thực hiện này:

nhập mô tả hình ảnh ở đây

KeyLookup dành cho vị từ WhereColumn IS NULL.

Đây là kế hoạch: https://www.brentozar.com/pastetheplan/?id=SJcbLHxO7

Câu trả lời:


23

Tại sao chỉ mục này không "bao phủ" cho truy vấn này:

Không có lý do chính đáng. Đó là một chỉ số bao gồm cho truy vấn đó.

Vui lòng bỏ phiếu cho mục trả lại tại đây: https://feedback.azure.com/forums/908035-sql-server/suggestions/32896348-filtered-index-not- used-who-is-null-and-key-looku

Và như một cách giải quyết bao gồm WhereColumntrong chỉ mục được lọc:

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

13
Điều này đã được báo cáo hơn một thập kỷ trước bởi Gail Shaw. Sau đó, Kết nối đã chết. Gần nhất tôi có thể tìm thấy bây giờ là feedback.azure.com/forums/908035-sql-server/suggestions/ mẹo
Paul White 9

3

Tôi đã có cùng một vấn đề tôi nghĩ khi làm một số thử nghiệm vài tuần trước. Tôi có một truy vấn với một vị từ chính yêu cầu các kết quả được trả về có thời gian đóng NULL và tôi nghĩ về việc sử dụng chỉ mục được lọc vì 25K của các bản ghi 2M + là NULL và con số này sẽ giảm rất sớm.

Chỉ mục được lọc không được sử dụng - Tôi giả sử do 'tính duy nhất' hoặc tính phổ biến - cho đến khi tôi tìm thấy một bài viết hỗ trợ của Microsoft có nội dung:

Để giải quyết vấn đề này, bao gồm cột được kiểm tra là NULL trong các cột được trả về. Hoặc, thêm cột này dưới dạng các cột trong chỉ mục.

Vì vậy, việc thêm cột vào Chỉ mục (hoặc Bao gồm) dường như là phản hồi chính thức của MS.


1
Đó là một cách giải quyết khả thi, cho đến khi nào (và nếu) họ sửa nó.
ypercubeᵀᴹ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.