Tôi có một Records
bảng có hơn 100 cột và rất nhiều hàng và một chỉ mục không bao gồm trên 5 trường dựa trên các đường dẫn truy cập của tôi:
CREATE NONCLUSTERED INDEX [IX_Records_CustomerID]
ON [dbo].[Records] (
[CustomerID] ASC, -- int
[IsInvalid] ASC, -- int
[IsProcessed] ASC, -- bit
[IsRejected] ASC, -- bit
[RecordName] ASC, -- varchar(12)
;
5 trường không bao gồm khóa chính RecordID
, là cột trong chỉ mục được nhóm.
Đây là truy vấn hoạt động kém của tôi:
SELECT * FROM Records WHERE CustomerID IN (181, 283, 505)
Kế hoạch thực hiện cho thấy rằng nó thực hiện Quét chỉ mục cụm, điều tôi hiểu là vì tôi đang chọn các cột không được bao gồm trong chỉ mục. Trong Management Studio, tôi thay đổi truy vấn thành:
SELECT CustomerID, IsInvalid, IsProcessed, IsRejected, RecordName FROM Records
WHERE CustomerID IN (181, 283, 505)
Và kế hoạch thực hiện hiển thị Tìm kiếm chỉ mục và thời gian thực hiện truy vấn giảm từ 44 giây xuống còn 2 giây. Tuy nhiên, tôi thiếu sự tự do trong ứng dụng để thay thế *
chỉ bằng các cột tôi cần và đã bao gồm trong chỉ mục của tôi.
Có cách nào xung quanh việc quét chỉ mục cụm khi tôi bị khóa SELECT *
không?
IN (…)
truy vấn con?
SELECT * FROM that_view WHERE CustomerID IN (...);
không?