Warum gibt es keinen vollständigen Scan (unter SQL 2008 R2 und 2012)?
Testdaten:
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
Bei der Ausführung der Abfrage:
Select * From dbo.TestTable Where VeryRandomText = N'111' -- bad
Warnung erhalten (wie erwartet, da nchar-Daten mit der varchar-Spalte verglichen werden):
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(nvarchar(50),[DemoDatabase].[dbo].[TestTable].[VeryRandomText],0)" />
Aber dann sehe ich einen Ausführungsplan, und ich kann sehen, dass er nicht den erwarteten Full-Scan verwendet, sondern stattdessen die Indexsuche.
Das ist natürlich gut, denn in diesem speziellen Fall ist die Ausführung viel schneller als bei einem vollständigen Scan.
Aber ich kann nicht verstehen, wie SQL Server zu der Entscheidung kam, diesen Plan zu machen.
Wenn die Serverkollatierung Windows-Kollatierungen auf Serverebene und SQL Server-Kollatierungsdatenbankebene wäre, würde dies einen vollständigen Scan für dieselbe Abfrage verursachen.