Mengapa tidak ada pemindaian lengkap (Pada SQL 2008 R2 dan 2012)?
Data uji:
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
Saat menjalankan kueri:
Select * From dbo.TestTable Where VeryRandomText = N'111' -- bad
Dapatkan peringatan (seperti yang diharapkan, karena membandingkan data nchar dengan kolom varchar):
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(nvarchar(50),[DemoDatabase].[dbo].[TestTable].[VeryRandomText],0)" />
Tapi kemudian saya melihat rencana eksekusi, dan saya bisa melihat, bahwa itu tidak menggunakan full-scan seperti yang saya harapkan, tetapi indeks yang mencari.
Tentu saja, ini agak baik, karena dalam kasus khusus ini eksekusi lebih cepat daripada jika akan ada pemindaian penuh.
Tetapi saya tidak bisa mengerti bagaimana SQL server mengambil keputusan untuk membuat rencana ini.
Juga - jika susunan server akan menjadi susunan Windows pada tingkat server dan tingkat basis data susunan SQL Server, maka itu akan menyebabkan pemindaian penuh pada permintaan yang sama.