Cet index sera probablement utile, mais gardez à l'esprit qu'il n'y a pas de repas gratuit (les index doivent être maintenus, cela affectera donc votre charge de travail d'insertion/mise à jour/suppression) :
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;
Maintenant, votre requête peut dire :
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!
Si vous modifiez les valeurs de certains de ces drapeaux en fonction de la requête, vous pouvez essayer d'ajouter ces colonnes à la clé de l'index au lieu du filtre, par ex. disons que parfois vous vérifiez OnHold = 0
et parfois 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;
Vous pouvez également essayer d'avoir MemberMailID
dans la clé au lieu de INCLUDE
. par exemple :
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;
Ces différences peuvent ne pas avoir d'importance pour vos données et vos habitudes d'utilisation, mais vous pourrez tester les différences plus facilement que nous ne pourrons le deviner.