Ten indeks prawdopodobnie będzie pomocny, ale pamiętaj, że nie ma darmowego lunchu (indeksy muszą być utrzymywane, więc wpłynie to na obciążenie wstawiania/aktualizowania/usuwania):
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;
Teraz Twoje zapytanie może brzmieć:
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!
Jeśli zmienisz wartości niektórych z tych flag w zależności od zapytania, możesz poeksperymentować z dodaniem tych kolumn do klucza indeksu zamiast filtra, np. powiedzmy, że czasami sprawdzasz, czy OnHold = 0
a czasami 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;
Możesz także poeksperymentować z posiadaniem MemberMailID
w kluczu zamiast INCLUDE
. np.:
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;
Różnice te mogą nie mieć znaczenia dla Twoich danych i wzorców użytkowania, ale będziesz mógł je przetestować łatwiej, niż jesteśmy w stanie zgadnąć.