Pourquoi n'y a-t-il pas d'analyse complète (sur SQL 2008 R2 et 2012)?
Données de 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
Lors de l'exécution de la requête:
Select * From dbo.TestTable Where VeryRandomText = N'111' -- bad
Obtenez un avertissement (comme prévu, car la comparaison des données nchar à la colonne varchar):
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(nvarchar(50),[DemoDatabase].[dbo].[TestTable].[VeryRandomText],0)" />
Mais alors je vois le plan d'exécution, et je peux voir, qu'il n'utilise pas le scan complet comme je m'y attendais, mais la recherche d'index à la place.
Bien sûr, c'est plutôt bien, car dans ce cas particulier, l'exécution est beaucoup plus rapide que s'il y avait une analyse complète.
Mais je ne peux pas comprendre comment SQL Server a pris la décision de faire ce plan.
De même, si le classement du serveur est constitué de classements Windows au niveau du serveur et au niveau de la base de données de classement SQL Server, cela entraînera une analyse complète de la même requête.