यह इंडेक्स शायद मददगार होगा, लेकिन ध्यान रखें कि कोई मुफ्त लंच नहीं है (इंडेक्स को बनाए रखना होगा, इसलिए यह आपके इंसर्ट/अपडेट/डिलीट वर्कलोड को प्रभावित करेगा):
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;
हो सकता है कि ये अंतर आपके डेटा और उपयोग के पैटर्न के लिए मायने न रखें, लेकिन आप जितना हम अनुमान लगा सकते हैं, उससे कहीं अधिक आसानी से आप अंतरों का परीक्षण कर पाएंगे।