Indeks ini mungkin akan membantu, tetapi perlu diingat bahwa tidak ada makan siang gratis (indeks harus dipertahankan, jadi ini akan mempengaruhi beban kerja insert/update/delete Anda):
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;
Sekarang kueri Anda dapat mengatakan:
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!
Jika Anda mengubah nilai beberapa tanda ini bergantung pada kueri, Anda dapat bereksperimen dengan menambahkan kolom tersebut ke kunci indeks alih-alih filter, mis. katakanlah terkadang Anda memeriksa OnHold = 0
dan terkadang 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;
Anda mungkin juga ingin bereksperimen dengan memiliki MemberMailID
di kunci alih-alih INCLUDE
. misalnya:
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;
Perbedaan ini mungkin tidak berpengaruh pada data dan pola penggunaan Anda, tetapi Anda akan dapat menguji perbedaan lebih mudah daripada yang dapat kami tebak.