3

J'ai lu sur l'indicateur de requête SQL Server 2008 OPTIMIZE for UNKNOWN. Je comprends comment cela fonctionne.Procédures stockées et OPTIMISER POUR INCONNU

Cependant, j'ai une question sur et quand pour l'utiliser. Il ne peut pas être spécifié dans un fichier UDF. Il peut être spécifié à l'intérieur d'un proc stocké. Cependant, this états post blog MSDN 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 une bonne façon d'obtenir cette valeur visible à l'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. Cela implique que le plan mis en cache sera revisité/recompilé (pas sûr de ce mécanisme). Cependant, ceci est déroutant, car il annule tout le besoin d'OPTIMISER POUR INCONNU.

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

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

Répondre

7

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 paragraphes 2 et 3 de this MSDN article on SP recompilation). Ce plan est ensuite mis en cache pour être réutilisé jusqu'à ce qu'il quitte le cache - beaucoup de détails sur le processus de mise en cache plan here.

Le blog MSDN que vous citez remarque des façons de faciliter ce processus pour le compilateur; Je pense que le point 4 (cité dans la question) suggère que c'est un avantage des procédures stockées sur le SQL ad-hoc.

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

2 Si vous trouvez que l'optimiseur est choisir différents plans au fil du temps qui ont des performances contrastées selon caractéristiques, pensez à utiliser un indice de paramètre avec un représentant valeur « moyenne » pour obtenir une bonne, commune requête plan qui fonctionnera raisonnablement pour toutes les valeurs.

mais plutôt que de sélectionner une valeur moyenne ou représentative, le compilateur ignorera complètement les valeurs des paramètres. Envisager d'utiliser OPTIMIZE FOR UNKNOWN dans les circonstances indiquées dans l'article 2 - lorsque la même requête donne des performances très variables parce que le plan est pauvre dans certaines circonstances - généralement lorsque les paramètres dans les colonnes de filtre de requête de cardinalité très variable.

+0

Merci @Ed. Ainsi, SQL Server "reniflera" les paramètres lors de la première exécution et mettra en cache le plan résultant, et il ne les reniflera pas après cela, économisant dans certaines conditions qu'il estime qu'un nouveau plan est justifié.Ai-je bien compris? – IamIC

+0

@Ed cela efface pour moi, merci. Il me semble que l'on devrait presque toujours utiliser l'indice, sinon on reste à la merci du premier plan exécuté, qui peut être ou non proche de l'optimum. En fait, étant donné que les valeurs d'identité sont susceptibles d'être faibles sur une nouvelle base de données, il est presque certain que les recherches d'index seront ignorées dans le plan. – IamIC