¿Por qué no hay exploración completa (en SQL 2008 R2 y 2012)?
Datos de prueba:
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
Cuando ejecuta la consulta:
Select * From dbo.TestTable Where VeryRandomText = N'111' -- bad
Obtenga una advertencia (como se esperaba, porque compara los datos de nchar con la columna varchar):
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(nvarchar(50),[DemoDatabase].[dbo].[TestTable].[VeryRandomText],0)" />
Pero luego veo el plan de ejecución, y puedo ver, que no está usando el escaneo completo como esperaría, sino la búsqueda de índice.
Por supuesto, esto es bastante bueno, porque en este caso particular la ejecución es mucho más rápida que si hubiera un escaneo completo.
Pero no puedo entender cómo el servidor SQL tomó la decisión de hacer este plan.
Además, si la intercalación del servidor sería intercalación de Windows en el nivel del servidor y el nivel de la base de datos de intercalación de SQL Server, provocaría una exploración completa en la misma consulta.