Dette indeks vil sandsynligvis være nyttigt, men husk, at der ikke er nogen gratis frokost (indekser skal vedligeholdes, så dette vil påvirke din indsæt/opdater/slet arbejdsbyrde):
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 forespørgsel sige:
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!
Hvis du ændrer værdierne for nogle af disse flag afhængigt af forespørgslen, kan du eksperimentere med at tilføje disse kolonner til nøglen til indekset i stedet for filteret, f.eks. Lad os sige, at du nogle gange tjekker efter OnHold = 0
og nogle gange 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 vil måske også eksperimentere med at have MemberMailID
i nøglen i stedet for INCLUDE
. f.eks.:
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;
Disse forskelle har muligvis ikke betydning for dine data og brugsmønstre, men du vil være i stand til at teste forskelle nemmere, end vi kan gætte.