Các cột lọc phải luôn nằm trong các khóa / bao gồm?


8

Tôi đang xem xét việc tạo một chỉ mục được lọc trong bản sao cơ sở dữ liệu Stack Overflow của mình . Một cái gì đó như thế này, ví dụ:

CREATE UNIQUE NONCLUSTERED INDEX IX_DisplayName_Filtered
    ON dbo.Users (DisplayName)
    WHERE Reputation > 400000;

Tôi có nên luôn luôn thêm cột trong biểu thức lọc ( Reputationtrong ví dụ này) vào khóa hoặc bao gồm cho chỉ mục hay có trong biểu thức lọc đủ tốt không?

Câu trả lời:


10

Đúng!

Vì nhiều lý do, tốt hơn là luôn có cột lọc như một phần của chỉ mục: trong các khóa hoặc trong bao gồm

Sau đây là một số ví dụ cụ thể về các vấn đề truy vấn chỉ mục được lọc được giải quyết bằng cách bao gồm các cột lọc trong chỉ mục.

Tra cứu khóa khi vị từ truy vấn không khớp với biểu thức lọc

Trước hết, tài liệu này có nội dung này để nói về việc bao gồm các cột biểu thức lọc:

  • Một cột trong biểu thức chỉ mục được lọc phải là một khóa hoặc cột được bao gồm trong định nghĩa chỉ mục được lọc nếu vị từ truy vấn sử dụng cột trong một so sánh không tương đương với biểu thức chỉ mục được lọc.

Vì vậy, nếu bạn có biểu thức lọc bất bình đẳng như thế Reputation > 400000, nhưng truy vấn của bạn sử dụng một biến vị ngữ WHERE Reputation > 400000 AND Reputation < 450000;, chỉ mục được lọc vẫn có thể được sử dụng - nhưng sẽ cần phải tra cứu khóa để đáp ứng vị từ của truy vấn.

Bao gồm Reputationcột trong chỉ mục (khóa hoặc bao gồm) sẽ loại bỏ nhu cầu tra cứu này.

Xem bài đăng Chỉ mục được lọc của Erik Darling : Chỉ cần Thêm Bao gồm để biết thêm chi tiết và ví dụ về tình huống này.

Một ví dụ khác về điều này có thể được tìm thấy trong câu trả lời của Paul White tại đây: Tra cứu khóa không cần thiết được thực hiện trong khi sử dụng chỉ mục được lọc

Tra cứu chính khi cột lọc được bao gồm trong tập kết quả

Các tài liệu tiếp tục nói điều này:

  • Một cột trong biểu thức chỉ mục được lọc phải là một khóa hoặc cột được bao gồm trong định nghĩa chỉ mục được lọc nếu cột nằm trong tập kết quả truy vấn.

Điều này có thể cảm thấy như không cần phải nói, nhưng chỉ cần hoàn thành: nếu các truy vấn của bạn bao gồm cột lọc trong tập kết quả cuối cùng, có lẽ bạn nên đưa chúng vào chỉ mục (khóa hoặc bao gồm).

Ước tính hàng kém khi sử dụng biểu thức đẳng thức

Có những trường hợp ước tính hàng hữu ích dựa trên số liệu thống kê thực tế có thể được loại bỏ trong quá trình tối ưu hóa (cụ thể là khi kế hoạch truy vấn do trình tối ưu hóa tạo ra được chuyển đổi thành kế hoạch thực hiện vật lý). Bao gồm cột lọc có thể ngăn các ước tính chính xác hơn này bị loại bỏ.

Chi tiết hơn và một ví dụ, có thể được tìm thấy trong câu trả lời của Paul White tại đây: Ước tính hàng không chính xác được cung cấp với chỉ mục được lọc

Một ví dụ bổ sung có thể được tìm thấy ở đây trên dba.se: Truy vấn bằng chỉ mục được lọc nhưng số lượng hàng ước tính sai

Tra cứu khóa khi sử dụng IS NULLtrong biểu thức lọc

Tạo một chỉ mục với biểu thức lọc sử dụng IS NULLcó thể tạo ra một tra cứu khóa hoàn toàn không cần thiết. Xem câu hỏi này và báo cáo lỗi liên quan trên trang web phản hồi của SQL Server: Tại sao chỉ mục được lọc trên giá trị IS NULL không được sử dụng?

Như bạn có thể đoán, cách giải quyết được trình bày là thêm cột lọc dưới dạng cột được bao gồm trong chỉ mục được lọc.

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.