Tôi có một câu hỏi khá đơn giản:SQL Server sẽ không sử dụng chỉ mục của tôi
SELECT
col1,
col2…
FROM
dbo.My_Table
WHERE
col1 = @col1 AND
col2 = @col2 AND
col3 <= @col3
Nó được thực hiện khủng khiếp, vì vậy tôi đã thêm một chỉ mục trên col1, col2, col3 (int, bit, và datetime). Khi tôi kiểm tra kế hoạch truy vấn, nó đã bỏ qua chỉ mục của tôi. Tôi đã thử sắp xếp lại các cột trong chỉ mục trong mọi cấu hình có thể và nó luôn bỏ qua chỉ mục. Khi tôi chạy truy vấn nó thực hiện quét chỉ mục nhóm (kích thước bảng là từ 700K đến 800K hàng) và mất 10-12 giây. Khi tôi buộc nó sử dụng chỉ mục của tôi, nó sẽ trả về ngay lập tức. Tôi đã cẩn thận để xóa bộ nhớ đệm và bộ đệm giữa các thử nghiệm.
Những điều khác tôi đã cố gắng:
UPDATE STATISTICS dbo.My_Table
CREATE STATISTICS tmp_stats ON dbo.My_Table (col1, col2, col3) WITH FULLSCAN
Tôi có thiếu bất cứ điều gì ở đây? Tôi ghét đặt một gợi ý chỉ mục trong một thủ tục được lưu trữ, nhưng SQL Server dường như không thể có được một đầu mối về điều này. Bất cứ ai biết bất kỳ những thứ khác mà có thể ngăn chặn SQL Server từ nhận ra rằng bằng cách sử dụng chỉ mục là một ý tưởng tốt?
EDIT: Một trong những cột được trả lại là một cột TEXT, vì vậy sử dụng một chỉ số bao phủ hoặc một BAO GỒM sẽ không hoạt động :(
Bạn đặt dấu ba chấm trong danh sách cột, bạn đang chọn cột nào khác? Điều gì xảy ra nếu nó chỉ là col1, col2 và col3? –
Chris, điểm tốt nhưng "Khi tôi buộc nó sử dụng chỉ mục của tôi nó trả về ngay lập tức" bao gồm đó. –
Dấu ba chấm là do truy vấn trả về tất cả các cột trong bảng. Tôi cho rằng tôi có thể đặt SELECT * –