Tento index bude pravděpodobně užitečný, ale mějte na paměti, že neexistuje žádný bezplatný oběd (indexy je třeba udržovat, takže to ovlivní vaši zátěž vkládání/aktualizace/mazá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;
Nyní může váš dotaz znít:
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!
Pokud změníte hodnoty některých z těchto příznaků v závislosti na dotazu, můžete experimentovat s přidáním těchto sloupců do klíče indexu namísto filtru, např. řekněme, že někdy zkontrolujete OnHold = 0
a někdy 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;
Můžete také experimentovat s MemberMailID
v klíči místo INCLUDE
. např.:
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;
Tyto rozdíly nemusí být důležité pro vaše data a vzorce používání, ale budete moci otestovat rozdíly snáze, než budeme schopni uhodnout.