Този индекс вероятно ще бъде полезен, но имайте предвид, че няма безплатен обяд (индексите трябва да се поддържат, така че това ще повлияе на натоварването ви при вмъкване/актуализиране/изтриване):
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;
Сега вашата заявка може да гласи:
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!
Ако промените стойностите на някои от тези флагове в зависимост от заявката, можете да експериментирате с добавянето на тези колони към ключа на индекса вместо филтъра, напр. да кажем, че понякога проверявате за OnHold = 0
и понякога 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;
Може също да искате да експериментирате с MemberMailID
в ключа вместо INCLUDE
. напр.:
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;
Тези разлики може да нямат значение за вашите данни и модели на използване, но ще можете да тествате разликите по-лесно, отколкото ние ще можем да предположим.