Por que não há verificação completa (no SQL 2008 R2 e 2012)?
Dados de teste:
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
Ao executar a consulta:
Select * From dbo.TestTable Where VeryRandomText = N'111' -- bad
Receba um aviso (como esperado, porque a comparação de dados nchar com a coluna varchar):
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(nvarchar(50),[DemoDatabase].[dbo].[TestTable].[VeryRandomText],0)" />
Mas, então, vejo o plano de execução, e posso ver, que ele não está usando a varredura completa, como seria de esperar, mas a busca por índice.
Obviamente, isso é bom, porque nesse caso específico, a execução é muito mais rápida do que se houvesse uma verificação completa.
Mas não consigo entender como o SQL Server tomou a decisão de fazer esse plano.
Além disso, se o agrupamento do servidor fosse do Windows no nível do servidor e no banco de dados do SQL Server, ele causaria uma verificação completa na mesma consulta.