Questo indice sarà probabilmente utile, ma tieni presente che non ci sono pranzi gratuiti (gli indici devono essere mantenuti, quindi ciò influirà sul tuo carico di lavoro di inserimento/aggiornamento/eliminazione):
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;
Ora la tua domanda può 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!
Se modifichi i valori di alcuni di questi flag a seconda della query, puoi provare ad aggiungere quelle colonne alla chiave dell'indice anziché al filtro, ad es. diciamo che a volte controlli OnHold = 0
e talvolta 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;
Potresti anche voler sperimentare con MemberMailID
nella chiave invece di INCLUDE
. es.:
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;
Queste differenze potrebbero non essere importanti per i tuoi dati e i tuoi modelli di utilizzo, ma sarai in grado di testare le differenze più facilmente di quanto possiamo immaginare.