Question

J'ai lu sur le OPTIMIZE SQL Server 2008 pour UNKNOWN indice de requête. Je comprends comment cela fonctionne.

Cependant, j'ai une question sur et lorsque pour l'utiliser. Il ne peut pas être spécifié dans une UDF. Il peut être spécifié dans un proc stocké. Cependant, ce MSDN blogue états post ce qui suit :

  

4.Moving une requête dans une procédure stockée peut le mettre dans un séparé   contexte procédural et peut être un bon   façon d'obtenir cette valeur visible à la   optimiseur (Remarque: cela fonctionne dans SQL   2000 ainsi)

Cela me semble dire que tout paramètre passé à une procédure stockée sera « reniflé », aidant ainsi SQL Server pour compiler un plan d'exécution optimale. Ceci est ce qui implique que sera revue le plan mis en cache / recompilé (pas sûr de ce mécanisme). Toutefois, cela est source de confusion, car il nie toute nécessité OPTIMIZE UNKNOWN.

L'article MSDN sur les indicateurs de requête ne couvre pas ma question.

Quelqu'un peut-il répondre pour moi, idéalement avec un pointeur vers quelque chose de Microsoft qui efface cela. Merci.

Était-ce utile?

La solution

Le comportement par défaut du compilateur SQL est d'utiliser les valeurs de tous les paramètres donnés dans la première exécution d'un SP pour aider à optimiser le plan (voir les paragraphes 2 et 3 de cet article MSDN sur SP recompilation ). Ce plan est ensuite mis en mémoire cache pour une réutilisation jusqu'à ce qu'il quitte le cache - beaucoup de détails sur le processus de mise en cache plan .

Le MSDN votre blog est cites noter des façons de rendre ce processus plus facile pour le compilateur; Je pense que le point 4 (cité dans la question) suggère que c'est un avantage de procédures stockées sur SQL ad hoc.

L'indice de OPTIMIZE FOR UNKNOWN indique au compilateur de ne pas perturber le comportement par défaut; qu'il doit ignorer les valeurs des paramètres donnés dans la première exécution et sélectionnez un plan plus généralisé. Ceci est une version plus extrême de l'article 2 dans la liste des suggestions à la fin du billet de blog cité dans la question;

  

2 Si vous trouvez que l'optimiseur est   choisir différents plans au fil du temps que   ont des performances variables   caractéristiques, envisager d'utiliser un   indice de paramètre avec un représentant   valeur « moyenne » pour obtenir un bon commun   plan de requête qui fonctionne raisonnablement   pour toutes les valeurs.

mais au lieu de sélectionner une valeur moyenne ou représentant, le compilateur ignorer efficacement les valeurs des paramètres entièrement.

Envisagez d'utiliser OPTIMIZE FOR UNKNOWN dans les circonstances données citées au point 2 - lorsque la même requête donne des performances très variables car le plan est faible dans certaines circonstances -. Généralement lorsque les paramètres dans les colonnes de filtre de requête de cardinalité très variable

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top