पूर्ण-स्कैन क्यों नहीं है (SQL 2008 R2 और 2012 पर)?
परीक्षण डेटा:
DROP TABLE dbo.TestTable
GO
CREATE TABLE dbo.TestTable
(
TestTableID INT IDENTITY PRIMARY KEY,
VeryRandomText VarChar(50),
VeryRandomText2 VarChar(50)
)
Go
Set NoCount ON
Declare @i int
Set @i = 0
While @i < 10000
Begin
Insert Into dbo.TestTable(VeryRandomText, VeryRandomText2)
Values(Cast(Rand()*10000000 as VarChar(50)), Cast(Rand()*10000000 as VarChar(50)));
Set @i = @i + 1;
End
Go
CREATE Index IX_VeryRandomText On dbo.TestTable
(
VeryRandomText
)
Go
जब क्वेरी निष्पादित करें:
Select * From dbo.TestTable Where VeryRandomText = N'111' -- bad
चेतावनी प्राप्त करें (जैसा कि अपेक्षित है, क्योंकि nchar डेटा की तुलना varchar कॉलम से करें):
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(nvarchar(50),[DemoDatabase].[dbo].[TestTable].[VeryRandomText],0)" />
लेकिन फिर मैं निष्पादन योजना देखता हूं, और मैं देख सकता हूं, कि यह पूर्ण-स्कैन का उपयोग नहीं कर रहा है जैसा कि मैं उम्मीद करूंगा, लेकिन इसके बजाय सूचकांक की तलाश है।
बेशक, यह एक तरह से अच्छा है, क्योंकि इस विशेष मामले में निष्पादन तेजी से होता है जैसे कि पूर्ण स्कैन होगा।
लेकिन मैं यह नहीं समझ सकता कि इस योजना को बनाने के लिए SQL सर्वर कैसे निर्णय लेने के लिए आया था।
इसके अलावा- यदि सर्वर कोलाज सर्वर स्तर और SQL सर्वर कोलाज डेटाबेस स्तर पर विंडोज कॉलेशन होगा, तो यह उसी क्वेरी पर पूर्ण स्कैन का कारण होगा।