Este índice probablemente será útil, pero tenga en cuenta que no hay almuerzo gratis (los índices deben mantenerse, por lo que esto afectará su carga de trabajo de inserción/actualización/eliminació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;
Ahora su consulta puede decir:
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 cambia los valores de algunas de estas banderas según la consulta, puede experimentar agregando esas columnas a la clave del índice en lugar del filtro, p. digamos que a veces verifica OnHold = 0
ya veces 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;
También puede experimentar con tener MemberMailID
en la clave en lugar de INCLUDE
. por ejemplo:
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;
Es posible que estas diferencias no importen para sus datos y patrones de uso, pero podrá probar las diferencias más fácilmente de lo que podremos adivinar.