Чому не існує повного сканування (на 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-сервер прийняв рішення прийняти цей план.
Крім того, якщо серверним збіркою буде збіг Windows на рівні сервера та рівень бази даних SQL Server, то це призведе до повного сканування за тим самим запитом.