ये परीक्षण (डेटाबेस AdventureWorks2008R2) दिखाता है कि क्या होता है:
SET NOCOUNT ON;
SET STATISTICS IO ON;
PRINT 'Test #1';
SELECT p.BusinessEntityID, p.LastName
FROM Person.Person p
WHERE p.LastName LIKE '%be%';
PRINT 'Test #2';
DECLARE @Pattern NVARCHAR(50);
SET @Pattern=N'%be%';
SELECT p.BusinessEntityID, p.LastName
FROM Person.Person p
WHERE p.LastName LIKE @Pattern;
SET STATISTICS IO OFF;
SET NOCOUNT OFF;
परिणाम:
Test #1
Table 'Person'. Scan count 1, logical reads 106
Test #2
Table 'Person'. Scan count 1, logical reads 106
SET STATISTICS IO
. से परिणाम दर्शाता है कि LIO समान . हैं .लेकिन निष्पादन योजनाएं काफी अलग हैं:
पहले परीक्षण में, SQL सर्वर एक Index Scan
का उपयोग करता है स्पष्ट लेकिन दूसरे परीक्षण में SQL सर्वर एक Index Seek
. का उपयोग करता है जो एक Index Seek - range scan
. है . अंतिम स्थिति में SQL सर्वर Compute Scalar
का उपयोग करता है ऑपरेटर इन मूल्यों को उत्पन्न करने के लिए
[Expr1005] = Scalar Operator(LikeRangeStart([@Pattern])),
[Expr1006] = Scalar Operator(LikeRangeEnd([@Pattern])),
[Expr1007] = Scalar Operator(LikeRangeInfo([@Pattern]))
और, Index Seek
ऑपरेटर एक Seek Predicate
. का उपयोग करता है (अनुकूलित) range scan
. के लिए (LastName > LikeRangeStart AND LastName < LikeRangeEnd
) प्लस एक और गैर-अनुकूलित Predicate
(LastName LIKE @pattern
)।
मेरा उत्तर:यह "वास्तविक" नहीं है Index Seek
. यह एक Index Seek - range scan
है जिसका, इस मामले में, Index Scan
. जैसा ही प्रदर्शन है .
कृपया, Index Seek
. के बीच का अंतर भी देखें और Index Scan
(इसी तरह की बहस):तो...क्या यह सीक या स्कैन है?
।
संपादित करें 1: OPTION(RECOMPILE)
. के लिए निष्पादन योजना (कृपया हारून की सिफारिश देखें) एक Index Scan
. भी दिखाता है (Index Seek
. के बजाय ):