Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

L'utilisation de variables dans la requête génère un plan de requête différent

Parce que lorsque vous utilisez des valeurs FIXES avec AUTO-PARAMETERIZATION désactivé, le plan de requête sait EXACTEMENT la valeur dont il a besoin pour exécuter la requête. Ainsi, le plan est réglé SPÉCIFIQUEMENT sur ces valeurs.

Cependant lorsque vous utilisez des variables, le plan qui sera mis dans le Query Cache est celui contenant les variables paramétrées - qui peuvent être remplacées par n'importe quelle variable et réutiliseront le même plan. Par conséquent, ces plans devront être plus robustes et génériques pour gérer le "meilleur cas moyen".

Dans SQL Server 2008, vous pouvez définir si des paramètres simples sont paramétrés automatiquement ou non afin d'obtenir de manière cohérente le plan du "meilleur cas moyen" - avec tous ses bons et ses mauvais côtés.

Réf :

EDIT - sur les performances

En ce qui concerne les performances, l'optimiseur peut se tromper - dans ce cas, il a examiné les statistiques for the exact values et a estimé que l'index n'est pas utile (peut être un problème de point de basculement), donc le plan est plutôt pour l'analyse en cluster. Forcer un plan de requête relève de l'art - mais il est clair que l'utilisation d'un index est 50 % plus rapide pour

  1. matériel spécifique
  2. distribution des données à un moment précis
  3. valeurs spécifiques données

À moins d'avoir une très très bonne raison, je ne jouerais pas à l'optimiseur de requête (par exemple en utilisant des indices d'index) à moins d'avoir beaucoup de données pour prouver qu'il le rendra invariablement plus rapide.