Det här indexet kommer förmodligen att vara till hjälp, men kom ihåg att det inte finns någon gratis lunch (index måste underhållas, så detta kommer att påverka din infoga/uppdatera/ta bort arbetsbelastning):
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;
Nu kan din fråga säga:
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!
Om du ändrar värdena för några av dessa flaggor beroende på frågan, kan du experimentera med att lägga till dessa kolumner till nyckeln till indexet istället för filtret, t.ex. låt oss säga att du ibland letar efter OnHold = 0
och ibland 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;
Du kanske också vill experimentera med att ha MemberMailID
i nyckeln istället för INCLUDE
. t.ex.:
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;
Dessa skillnader kanske inte spelar någon roll för dina data och dina användningsmönster, men du kommer att kunna testa skillnader lättare än vi kan gissa.