Deze index zal waarschijnlijk nuttig zijn, maar houd er rekening mee dat er geen gratis lunch is (indexen moeten worden onderhouden, dus dit heeft invloed op uw werklast voor invoegen/bijwerken/verwijderen):
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 uw vraag zeggen:
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!
Als u de waarden van sommige van deze vlaggen wijzigt, afhankelijk van de zoekopdracht, kunt u experimenteren met het toevoegen van die kolommen aan de sleutel van de index in plaats van aan het filter, b.v. laten we zeggen dat u soms controleert op OnHold = 0
en soms 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;
U kunt ook experimenteren met MemberMailID
in de sleutel in plaats van de INCLUDE
. bijv.:
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;
Deze verschillen zijn misschien niet van belang voor uw gegevens en gebruikspatronen, maar u kunt verschillen gemakkelijker testen dan we kunnen raden.