Làm thế nào để lập chỉ mục cho các truy vấn bất bình đẳng?


10

Tôi có truy vấn loại trừ dữ liệu dựa trên giá trị của cột float

select * 
from My_Table
where my_Float_column != 0 and my_Float_column is not null

Tôi không muốn lập chỉ mục một loại float nếu tôi có thể giúp nó. Kế hoạch thực hiện có đủ thông minh để sử dụng một chỉ mục được lọc như bên dưới không (Tôi chỉ lập chỉ mục các giá trị 0 và null) để tăng hiệu suất?

CREATE NONCLUSTERED INDEX IX_My_Table_Float_Filtered
    ON My_Table (my_Float_column)
    WHERE my_Float_column = 0 or my_Float_column is null

Câu trả lời:


11

Kế hoạch thực hiện có đủ thông minh để sử dụng một chỉ mục được lọc như bên dưới không (Tôi chỉ lập chỉ mục các giá trị 0 và null) để tăng hiệu suất?

Không. Không có hỗ trợ trực tiếp trong SQL Server cho loại từ chối hàng đơn toán tử mà bạn dường như có trong tâm trí.

Nói chung hơn, chỉ mục được lọc không trực tiếp hữu ích cho truy vấn đã cho và dù sao đó cũng không phải là định nghĩa bộ lọc chỉ mục hợp lệ. Thay vào đó, bạn có thể tạo chế độ xem được lập chỉ mục có chứa các vị từ đó, nhưng nó vẫn không hữu ích khi xác định vị trí các hàng cho truy vấn đích. Bạn có thể viết lại truy vấn để sử dụng chế độ xem được lập chỉ mục để loại trừ các hàng được tìm nạp bằng quét toàn bộ riêng biệt, nhưng thật khó để xem đó là một ý tưởng hay nói chung như thế nào.

Cách gần nhất bạn có thể nhận được có thể là quét chế độ xem được lập chỉ mục điền vào bộ lọc bitmap, với bộ lọc đó được áp dụng như một phần của quá trình quét toàn bộ bảng mục tiêu. Nó có thể là khó khăn để có được hình dạng kế hoạch truy vấn này đáng tin cậy.

Bạn cũng có thể sử dụng một cột được tính toán bền vững được lập chỉ mục bằng cách sử dụng một CASEbiểu thức, nhưng một lần nữa điều này sẽ yêu cầu viết lại truy vấn ban đầu và sẽ yêu cầu lưu trữ cho mỗi hàng trong bảng, cộng với chỉ mục.

Từ thông tin được cung cấp, có vẻ như điều tốt nhất bạn có thể làm là xác định chỉ mục là:

CREATE NONCLUSTERED INDEX IX_dbo_My_Table__Float_Filtered
ON dbo.My_Table (my_Float_column)
WHERE 
    my_Float_column <> 0 
    AND my_Float_column IS NOT NULL;
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.