Pourquoi aurait recompiler des résultats des requêtes de pointe dans différents plan de même déclaration adhoc après FREEPROCCACHE?

dba.stackexchange https://dba.stackexchange.com/questions/8002

Question

est sur le Service Pack 2 SQL 2005, mais je soupçonne que c'est quelque chose qui s'applique à tous les conseils de la requête en général.

J'ai une instruction SQL adhoc qui obtient un plan de requête différent uniquement en raison de l'option (recompilation). La déclaration de lot est jamais (en pratique) être réutilisée comme il utilise la génération SQL dynamique non-paramétrés où la déclaration change avec les dates / autres paramètres. J'ai confirmé c'est le cas en cochant la plan_handle mises en cache, toujours un ID en tant que valeurs dans le changement de lot.

Quand je fais DBCC FREEPROCCACHE Je pense que le plan de requête que je reçois pour la déclaration serait exactement le même que celui avec « l'option (recompilation) » indice de requête ajouté. Mais ce ne est pas, son tout à fait différent en fait (beaucoup plus rapide).

Quelqu'un sait pourquoi plus d'un soupçon de requête causerait le moteur de choisir un plan de requête différent?

La déclaration est quelque chose comme ceci

dbcc freeproccache
go
sp_executesql ' 
declare @begindate datetime
declare @enddate datetime
select @begindate='1/1/2011'
select @enddate='2/1/2011'
select count(*) from tableA where tableA.datecolumn between @begindate and @enddate 
and exists( 
select A
union all select B
union all select C
)'

tout ce que je dois faire est de modifier l'instruction d'utiliser indice recompilation de requête et je reçois différents (beaucoup mieux) plan de requête.

dbcc freeproccache
go
sp_executesql ' 
declare @begindate datetime
declare @enddate datetime
select @begindate='1/1/2011'
select @enddate='2/1/2011'
select count(*) from tableA where tableA.datecolumn between @begindate and @enddate 
and exists( select A
union all select B
union all select C
) OPTION (RECOMPILE)'

code passe dans les valeurs de date, je ne peux pas utiliser un guide de plan pour remplacer le comportement par défaut, ressemble changement de code sera nécessaire. Mais je voudrais savoir où chercher pourquoi recompilation forcerait un autre plan à utiliser.

Était-ce utile?

La solution

La requête contient des variables que vous avez affichée.

SQL Server ne fait pas la variable renifler sans OPTION (RECOMPILE) il établira un plan général comme il le ferait pour OPTIMIZE FOR UNKNOWN.

Je ne suis pas vraiment votre question cependant. À un moment donné, vous semblez dire que la version sans indice est « beaucoup plus rapidement », puis plus tard, vous dire la version avec l'indice est « beaucoup mieux ». Alors, qui est-il?

Les deux sont toutefois explicables. Si vous trouvez la version avec l'indice est mieux que cela est parce que SQL Server peut utiliser les statistiques pour estimer le nombre de lignes qui seront abondés par le prédicat de date et choisir un plan approprié pour ce cas.

Si la version sans indice est mieux les statistiques elles-mêmes peut-être nécessaire mise à jour. Peut-être quand ils ont été mis à jour la dernière, il y avait peu ou pas de lignes de réunion qui prédicat et ainsi de SQL Server sous-estime massivement le nombre de lignes qui seront renvoyées. Voir Statistiques , les estimations de la ligne et la colonne de date ascendante plus sur ce problème potentiel.

Autres conseils

addendum à court @ réponse de MartinSmith. Il y a deux indicateurs de suivi de peu connus qui peuvent résoudre les mauvaises statistiques avec des dates par ordre croissant question et les clés.

Citation de Croissant Touches et automatique rapide de corriger les statistiques :

L'indicateur de trace 2389 et 2390, les deux nouvelles dans SQL Server 2005 SP1, peuvent aider à résoudre ce problème. SQL Server 2005 SP1 commence à suivre la nature des colonnes via des opérations ultérieures de statistiques de mise à jour. Quand le Les statistiques sont vues augmenter trois fois la colonne est sous la marque Ascendant. Si l'indicateur de trace 2389 est défini, et une colonne est de marque ascendant, et un indice couvrant existe avec la colonne ascendante comme la clé de premier plan, puis les statistiques sera mise à jour automatiquement à requête compilation. Une déclaration est compilé pour trouver la valeur la plus élevée et une nouvelle étape est ajoutée à la fin de l'histogramme modèle existant à les données récemment ajoutées.

Il y avait aussi un article récent sur SimpleTalk discuter de ces drapeaux, Statistiques sur les colonnes ascendantes .

Cela pourrait se produire si vous avez votre base de données mis en place pour paramétrisation forcée. Lorsque l'option de paramétrage est réglé sur FORCED, toute valeur littérale est converti en un paramètre. Sauf dans quelques circonstances; et l'un d'entre eux est lorsque la requête a OPTION RECOMPILE.

Départ: http://msdn.microsoft.com/en-us /library/ms175037.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top