Dlaczego nie ma pełnego skanowania (w SQL 2008 R2 i 2012)?
Dane testowe:
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
Podczas wykonywania zapytania:
Select * From dbo.TestTable Where VeryRandomText = N'111' -- bad
Otrzymaj ostrzeżenie (zgodnie z oczekiwaniami, ponieważ porównanie danych nchar z kolumną varchar):
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(nvarchar(50),[DemoDatabase].[dbo].[TestTable].[VeryRandomText],0)" />
Ale potem widzę plan wykonania i widzę, że nie używa pełnego skanowania, jak się spodziewałbym, ale zamiast tego szuka indeksu.
Oczywiście jest to całkiem dobre, ponieważ w tym konkretnym przypadku wykonanie jest znacznie szybsze niż w przypadku pełnego skanowania.
Ale nie rozumiem, w jaki sposób SQL Server podjął decyzję o podjęciu tego planu.
Ponadto, jeśli sortowanie na serwerze byłoby zestawieniami Windows na poziomie serwera i SQL Server na poziomie bazy danych sortowania, spowodowałoby to pełne skanowanie tego samego zapytania.