Chỉ mục này có thể hữu ích, nhưng hãy nhớ rằng không có bữa trưa miễn phí (chỉ mục phải được duy trì, vì vậy điều này sẽ ảnh hưởng đến khối lượng công việc chèn / cập nhật / xóa của bạn):
CREATE NONCLUSTERED INDEX unread_emails
ON dbo.MemberMail(ToMemberID)
INCLUDE (MemberMailID)
WHERE ToReadFlag = 0
AND ToDeletedFlag = 0
AND FromDeletedFlag = 0
AND OnHold = 0
AND ToArchivedFlag = 0;
Bây giờ truy vấn của bạn có thể nói:
SELECT TOP (1) MemberMailID
FROM dbo.MemberMail -- dbo prefix
WITH (INDEX (unread_emails)) -- in case you need to force, though you should not
WHERE ToMemberID = 102
AND ToReadFlag = 0
AND ToDeletedFlag = 0
AND FromDeletedFlag = 0
AND OnHold = 0
AND ToArchivedFlag = 0
ORDER BY ToMemberID; -- ORDER BY is important!
Nếu bạn thay đổi giá trị của một số cờ này tùy thuộc vào truy vấn, bạn có thể thử nghiệm với việc thêm các cột đó vào khóa của chỉ mục thay vì bộ lọc, ví dụ:giả sử đôi khi bạn kiểm tra OnHold = 0
và đôi khi OnHold = 1
:
CREATE NONCLUSTERED INDEX unread_emails
ON dbo.MemberMail(ToMemberID, OnHold)
INCLUDE (MemberMailID)
WHERE ToReadFlag = 0
AND ToDeletedFlag = 0
AND FromDeletedFlag = 0
AND ToArchivedFlag = 0;
Bạn cũng có thể muốn thử nghiệm với việc có MemberMailID
trong khóa thay vì INCLUDE
. ví dụ:
CREATE NONCLUSTERED INDEX unread_emails
ON dbo.MemberMail(ToMemberID, MemberMailID)
WHERE ToReadFlag = 0
AND ToDeletedFlag = 0
AND FromDeletedFlag = 0
AND OnHold = 0
AND ToArchivedFlag = 0;
Những khác biệt này có thể không quan trọng đối với dữ liệu và cách sử dụng của bạn, nhưng bạn sẽ có thể kiểm tra sự khác biệt dễ dàng hơn chúng ta có thể đoán được.