Почему нет полного сканирования (в 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, то это приведет к полной проверке того же запроса.