इस उत्तर के अनुसार , जब तक कि उन स्तंभों पर एक इंडेक्स नहीं बनाया जाता है जो प्रतिबंधित करने के लिए उपयोग किए जाते हैं, तो क्वेरी इंडेक्स से लाभान्वित नहीं होगी।
मेरी यह परिभाषा है:
CREATE TABLE [dbo].[JobItems] (
[ItemId] UNIQUEIDENTIFIER NOT NULL,
[ItemState] INT NOT NULL,
[ItemPriority] INT NOT NULL,
[CreationTime] DATETIME NULL DEFAULT GETUTCDATE(),
[LastAccessTime] DATETIME NULL DEFAULT GETUTCDATE(),
-- other columns
);
CREATE UNIQUE CLUSTERED INDEX [JobItemsIndex]
ON [dbo].[JobItems]([ItemId] ASC);
GO
CREATE INDEX [GetItemToProcessIndex]
ON [dbo].[JobItems]([ItemState], [ItemPriority], [CreationTime])
INCLUDE (LastAccessTime);
GO
और यह प्रश्न:
UPDATE TOP (150) JobItems
SET ItemState = 17
WHERE
ItemState IN (3, 9, 10)
AND LastAccessTime < DATEADD (day, -2, GETUTCDATE())
AND CreationTime < DATEADD (day, -2, GETUTCDATE());
मैंने वास्तविक योजना की समीक्षा की, और वहाँ सिर्फ एक इंडेक्स की तलाश है जैसा कि बिल्कुल सटीक है WHERE
- कोई अतिरिक्त "बुकमार्क लुकअप" प्राप्त LastAccessTime
करने के लिए भले ही बाद वाला केवल इंडेक्स में "शामिल" हो, न कि इंडेक्स का हिस्सा।
यह मुझे ऐसा लगता है कि यह व्यवहार नियम का विरोध करता है कि कॉलम को इंडेक्स का हिस्सा होना चाहिए, न कि केवल "शामिल"।
क्या मेरा व्यवहार सही है? यदि मैं WHERE
शामिल कॉलम से अपने लाभ या कॉलम को सूचकांक का हिस्सा बनाने की आवश्यकता है, तो मैं पहले से कैसे जान सकता हूं ?
(ItemState, CreationTime) INCLUDE (LastAccessTime)
(a,b)
साथ क्वेरी के लिए सबसे अच्छा नहीं है SELECT a FROM t WHERE b=5;
और उस पर एक इंडेक्स (b) INCLUDE (a)
बहुत बेहतर है।
ItemState
मूल्य के आधार पर तलाश कर सकता है , हालांकि सीक उतना कुशल नहीं होगा जैसे कि आपका सूचकांक निम्नानुसार संरचित था(ItemState, CreationTime, LastAccessTime)