このインデックスはおそらく役立つでしょうが、フリーランチがないことに注意してください(インデックスを維持する必要があるため、これは挿入/更新/削除のワークロードに影響します):
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;
これらの違いは、データや使用パターンには関係ない場合がありますが、推測よりも簡単に違いをテストできます。