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