Perché non è presente la scansione completa (su SQL 2008 R2 e 2012)?
Dati di test:
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
Quando si esegue la query:
Select * From dbo.TestTable Where VeryRandomText = N'111' -- bad
Ricevi un avviso (come previsto, perché confrontando i dati nchar con la colonna varchar):
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(nvarchar(50),[DemoDatabase].[dbo].[TestTable].[VeryRandomText],0)" />
Ma poi vedo il piano di esecuzione e vedo che non sta usando la scansione completa come mi aspetterei, ma cerca invece l'indice.
Certo, questo è abbastanza buono, perché in questo caso particolare l'esecuzione è molto più veloce rispetto a una scansione completa.
Ma non riesco a capire come il server SQL abbia preso la decisione di fare questo piano.
Inoltre, se le regole di confronto del server saranno regole di confronto di Windows a livello di server e database di regole di confronto di SQL Server, causerebbe la scansione completa sulla stessa query.