Este índice provavelmente será útil, mas lembre-se de que não há almoço grátis (os índices precisam ser mantidos, portanto, isso afetará sua carga de trabalho de inserção/atualização/exclusão):
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;
Agora sua consulta pode dizer:
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!
Se você alterar os valores de alguns desses sinalizadores dependendo da consulta, poderá experimentar adicionar essas colunas à chave do índice em vez do filtro, por exemplo, digamos que às vezes você verifique
OnHold = 0
e às vezes 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;
Você também pode experimentar ter
MemberMailID
na chave em vez de INCLUDE
. por exemplo.: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;
Essas diferenças podem não ser importantes para seus dados e padrões de uso, mas você poderá testar as diferenças com mais facilidade do que podemos adivinhar.